docker / Guias

Docker port already allocated: como resolver porta ocupada

Uma porta publicada usa um endereço e uma porta do host Docker. Outro contêiner ou aplicativo pode já estar escutando ali. Alterar a porta do host mantém a porta interna do contêiner.

Os exemplos usam Bash; consulte as referências para os detalhes do seu ambiente.

Identifique o serviço antes de pará-lo

Liste os contêineres ativos e suas portas publicadas. Procure o lado do host em um mapeamento como 8080->80/tcp. No Linux, ss -ltnp também lista listeners TCP; alguns detalhes exigem privilégios adequados.

docker ps --format 'table {{.Names}}\t{{.Ports}}'

Uma lista vazia de contêineres não prova que a porta esteja livre: um programa do host pode ocupá-la. Confira também o endereço e o protocolo. Identifique o serviço e sua função antes de pará-lo.

Escolha uma porta disponível no host

Para este exemplo web temporário, confira se a porta host 8081 está livre e o nome devsheet-web não está em uso. O exemplo usa o endereço de loopback do host e inicia nginx em primeiro plano.

docker run --rm --name devsheet-web -p 127.0.0.1:8081:80 nginx

O mapeamento é HOST_IP:HOST_PORT:CONTAINER_PORT. Só a porta do host muda para 8081; nginx continua na porta interna 80. Teste em outro terminal. Ctrl+C para este exemplo, e --rm remove seu contêiner.

Atualize o mapeamento no Compose

No arquivo Compose, altere a entrada ports do serviço desejado para 127.0.0.1:8081:80, depois de conferir a porta. Recrie esse serviço para aplicar o mapeamento; substitua web pelo nome real.

docker compose ps
docker compose up -d web

Uma simples reinicialização não aplica um mapeamento alterado. Confira o projeto Compose antes de recriar o serviço e preserve montagens e dados. Parar contêineres não relacionados pode interromper outros serviços.

Confira o serviço publicado

Confira o mapeamento ativo e envie uma requisição HTTP para a porta host escolhida. O exemplo nginx deve responder; outras aplicações podem demorar para iniciar.

docker ps --format 'table {{.Names}}\t{{.Ports}}'
curl --head http://127.0.0.1:8081/

Se o conflito continuar, confira endereço, porta e protocolo, incluindo listeners IPv4 e IPv6. Um erro HTTP após conectar é diferente de uma falha de bind. Examine os logs e a configuração do serviço afetado.

Referências

Todos os guias