⌘K

07 – Docker — Não consigo acessar minha porta 80, por quê?

Last updated

Se você acabou de subir um container com um servidor web (como Nginx ou Apache) ou uma aplicação web (como uma API em Python ou Node.js), abriu o navegador, digitou http://localhost (ou localhost:80) e deu de cara com uma tela de “Conexão Recusada”, não entre em pânico. Esse é, sem dúvidas, um dos erros mais comuns de quem está começando a mexer com Docker.

A aplicação está rodando perfeitamente dentro do container, os logs dizem que está tudo certo na porta 80, mas a sua máquina física simplesmente não consegue falar com ela. Por que isso acontece?

Hoje vamos entender o conceito de Mapeamento de Portas e ver como resolver esse bloqueio de uma vez por todas.

O Isolamento de Rede do Docker

Para entender o problema, precisamos lembrar o que é um container. Um container não é apenas um processo comum rodando na sua máquina; ele roda em um ambiente isolado, o que inclui um sistema de rede próprio e privado.

Quando o Nginx sobe dentro do container e escuta na porta 80, ele está escutando na porta 80 daquela rede interna e isolada do Docker, e não na rede da sua máquina física (o host).

┌────────────────────────────────────────────────────────┐
│ Sua Máquina Física (Host)                              │
│Você tenta acessar: http://localhost:80 ──❌ (Bloqueado)│
│                                                        │
│   ┌────────────────────────────────────────────────┐   │
│   │ Rede Isolada do Docker                         │   │
│   │                                                │   │
│   │   ┌────────────────────────────────────────┐   │   │
│   │   │ Container (Ex: Nginx)                  │   │   │
│   │   │ Aplicação rodando internamente na :80  │   │   │
│   │   └────────────────────────────────────────┘   │   │
│   └────────────────────────────────────────────────┘   │
└────────────────────────────────────────────────────────┘

Por padrão, nenhuma porta de dentro do container fica exposta para o mundo externo. Se você não criar explicitamente uma “ponte” ou um túnel entre a sua máquina e o container, o acesso será recusado.

A Solução: Mapeamento de Portas (-p)

Para abrir esse túnel e conseguir acessar o seu serviço, você precisa usar o mapeamento de portas através da flag -p (de publish) no momento em que executa o comando docker run.

A sintaxe segue sempre uma regra de ouro que confunde muita gente no início:

docker run -p [Porta da sua Máquina]:[Porta de Dentro do Container] imagem

Pense sempre da esquerda para a direita: Origem (Sua Máquina) ➔ Destino (Container).

Como resolver o problema na prática

Para facilitar a leitura dos seus usuários e manter o padrão visual moderno do seu blog, aqui está o passo a passo prático estruturado em blocos de código com destaque de sintaxe em HTML:

1
Cenário com Erro

O comando que causa o bloqueio

Se você rodar o container apenas expondo a porta internamente (ou sem flag nenhuma), você não conseguirá acessá-lo externamente:

docker run -d --name meu-servidor nginx:alpine

❌ Resultado: Tentou acessar http://localhost ou http://localhost:80 -> Conexão Recusada.

2
A Solução

O comando correto com mapeamento

Remova o container antigo e suba um novo vinculando explicitamente a porta 80 da sua máquina física à porta 80 interna do container:

docker rm -f meu-servidor
docker run -d --name meu-servidor -p 80:80 nginx:alpine

✓ Resultado: Agora, abrir http://localhost vai exibir a tela de boas-vindas do Nginx com sucesso!

E se a minha porta 80 física já estiver ocupada?

Este é outro problema clássico. Se você já tiver um serviço rodando nativamente na sua máquina (como um servidor Apache local, um projeto antigo ou até utilitários de sistema) que já esteja usando a porta 80, o Docker vai retornar um erro dizendo que a porta já está em uso (“port is already allocated”).

A beleza dos containers é que você não precisa parar o seu serviço local. Você pode mapear qualquer porta livre da sua máquina para a porta 80 do container.

Por exemplo, vamos redirecionar a porta 8080 do seu computador para a porta 80 interna do container:

Mapeando para uma porta alternativa
$ docker run -d –name meu-servidor-novo -p 8080:80 nginx:alpine

esse cenário, para acessar o site do container, bastará abrir o seu navegador e digitar: http://localhost:8080. O Docker interceptará as requisições que chegam na sua porta 8080 e as jogará silenciosamente para a porta 80 lá dentro do container.

💡 Dica de Ouro de DevOps: No ambiente de produção com Docker Compose, esse mapeamento segue exatamente a mesma lógica, mas de forma declarativa dentro do arquivo. Se você colocar ports: - "8080:80", a mágica do redirecionamento de tráfego funcionará exatamente igual.

Entender como o tráfego entra e sai dos containers é fundamental antes de começarmos a mexer com balanceadores de carga, proxies reversos (como o Traefik ou Nginx Plus) ou subir microsserviços integrados.

Still stuck? How can we help? Get Help