Se você trabalha com vários projetos em Docker ao mesmo tempo, é comum esbarrar em um erro conhecido: "port is already allocated". Isso acontece porque dois projetos diferentes tentam usar a mesma porta no seu computador (host), como a 80, 3306 ou 8080.
Neste guia você vai aprender a identificar o conflito e alterar as portas do docker-compose.yml para subir vários projetos ao mesmo tempo, sem parar nenhum deles.
1. Identifique quais portas já estão em uso
Antes de tudo, verifique quais containers já estão rodando e quais portas eles ocupam:
docker ps --format "table {{.Names}}\t{{.Ports}}"
Você também pode checar todas as portas abertas no sistema com:
ss -tln
2. Localize o arquivo docker-compose.yml do novo projeto
No arquivo docker-compose.yml do projeto que você quer subir, localize o bloco ports de cada serviço. Ele segue o formato:
ports:
- "porta_do_computador:porta_do_container"
A porta da esquerda é a que fica exposta no seu computador (host) e pode gerar conflito. A porta da direita é interna do container e não precisa ser alterada.
3. Escolha uma porta livre
Troque apenas o número do lado esquerdo por uma porta que ainda não esteja em uso. Exemplo, alterando o serviço de banco de dados:
db:
image: mysql:5.6.39
ports:
- "3307:3306" # antes era 3306:3306
Faça o mesmo para os demais serviços (servidor web, painel de administração, storage, etc.), sempre escolhendo uma porta livre para cada um.
4. Suba o projeto novamente
docker compose up -d
Se não houver mais conflitos, todos os containers devem subir normalmente, mesmo com outro projeto já rodando.
5. Ajuste a forma de conexão
Como a porta externa mudou, qualquer ferramenta ou comando que você usava para acessar o serviço também precisa apontar para a nova porta. Exemplo de conexão com o banco de dados via terminal:
mysql -h 127.0.0.1 --port=3307 -u usuario -p nome_do_banco --ssl-mode=DISABLED
O mesmo vale para acessar o projeto pelo navegador: se o serviço web antes estava em http://localhost:80, agora deverá ser acessado pela nova porta definida, por exemplo http://localhost:8081.
Dica importante
As portas internas dos containers (lado direito do mapeamento) não precisam ser alteradas. Serviços de um mesmo docker-compose.yml continuam se comunicando entre si normalmente pela rede interna do Docker, independente da porta exposta no host.