Introdução
Docker é uma tecnologia de containerização amplamente adotada que revolucionou a forma como as aplicações são desenvolvidas, empacotadas e implantadas. Compreender as portas expostas de um container Docker é um aspecto fundamental do trabalho com Docker, pois permite que você acesse e interaja com os serviços em execução dentro do container. Este tutorial irá guiá-lo através do processo de inspeção das portas expostas de um container Docker, capacitando-o a gerenciar e otimizar melhor suas aplicações em container.
Compreendendo as Portas dos Containers Docker
Antes de mergulharmos na inspeção das portas dos containers, vamos primeiro entender o que são portas e por que elas importam em containers Docker.
O Que São Portas de Container
No Docker, as portas permitem que os serviços em execução dentro de um container se comuniquem com o mundo exterior. Pense nas portas como portas de entrada para sua aplicação em container - sem abrir essas portas, ninguém pode acessar os serviços internos.
Tipos de Configurações de Porta
O Docker suporta dois tipos principais de configurações de porta:
Portas Expostas (Exposed Ports): Portas que um container disponibiliza para possíveis conexões, mas que não são automaticamente acessíveis a partir do host.
Portas Publicadas (Published Ports): Portas expostas que são mapeadas para uma porta no host, permitindo o acesso externo aos serviços do container.
Vamos executar um container de servidor web simples para entender melhor:
docker run -d --name web-demo nginx
Execute este comando no terminal. Isso inicia um container do servidor web Nginx chamado web-demo em modo detached (executando em segundo plano).
A saída mostrará um ID do container, semelhante a:
3a6e8df899a9b723de9e4684542dc9987af26381118fa36496757d17ac952c9f
Este container Nginx tem a porta 80 exposta por padrão (como definido em seu Dockerfile), mas ainda não a publicamos no host, então não podemos acessá-la de fora.
Examinando a Configuração de Portas do Container
Agora que temos nosso container em execução, vamos examinar sua configuração de porta.
Usando docker ps para Visualizar Mapeamentos de Porta
O comando docker ps mostra os containers em execução e suas configurações de porta.
Execute este comando em seu terminal:
docker ps
Você verá uma saída semelhante a:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a6e8df899a9 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp web-demo
Observe a coluna PORTS. Ela mostra 80/tcp, indicando que a porta 80 está exposta, mas não publicada no host.
Executando um Container com Portas Publicadas
Vamos parar nosso primeiro container e criar um novo com uma porta publicada:
docker stop web-demo
docker rm web-demo
Agora, execute um novo container com mapeamento de porta:
docker run -d --name web-demo -p 8080:80 nginx
A opção -p 8080:80 publica a porta 80 do container para a porta 8080 no host.
Execute docker ps novamente para ver a diferença:
docker ps
Saída:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7d483e51ef2 nginx "/docker-entrypoint.…" 10 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp web-demo
Observe como a coluna PORTS agora mostra 0.0.0.0:8080->80/tcp, indicando que a porta 80 no container está mapeada para a porta 8080 em todas as interfaces do host.
Inspecionando Detalhes das Portas do Container
O Docker fornece vários comandos para inspecionar as configurações de porta do container em detalhes. Vamos explorar essas opções.
Usando o Comando docker port
O comando docker port mostra os mapeamentos de porta para um container:
docker port web-demo
Saída:
80/tcp -> 0.0.0.0:8080
Isso mostra que a porta 80/tcp no container está mapeada para a porta 8080 em todas as interfaces do host.
Usando docker inspect para Informações Detalhadas
Para obter informações mais detalhadas, use o comando docker inspect:
docker inspect web-demo
Este comando produz uma grande quantidade de saída JSON com informações detalhadas sobre o container. Para filtrar apenas as informações da porta, use este comando:
docker inspect --format='{{json .NetworkSettings.Ports}}' web-demo | jq
Se o jq não estiver instalado, você pode instalá-lo com:
sudo apt-get update && sudo apt-get install -y jq
A saída do comando inspect filtrado terá a seguinte aparência:
{
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
}
]
}
Isso mostra informações detalhadas sobre o mapeamento de porta:
- Porta do container: 80/tcp
- IP do host: 0.0.0.0 (todas as interfaces)
- Porta do host: 8080
Listando Todas as Portas do Container
Se você tiver vários containers, pode ver todos os mapeamentos de porta com:
docker ps --format "{{.Names}}: {{.Ports}}"
Saída:
web-demo: 0.0.0.0:8080->80/tcp
Isso é útil ao gerenciar vários containers com diferentes configurações de porta.
Acessando Serviços Através de Portas Expostas
Agora que entendemos como inspecionar as portas do container, vamos acessar o servidor web em execução em nosso container.
Testando a Acessibilidade do Container
Como mapeamos a porta 80 do container para a porta 8080 no host, podemos acessar o servidor web Nginx através da porta 8080.
Vamos usar o comando curl para fazer uma requisição ao nosso servidor web:
curl localhost:8080
Você deve ver o HTML da página de boas-vindas do Nginx:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html {
color-scheme: light dark;
}
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
</p>
<p>
For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br />
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.
</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Isso confirma que podemos acessar o servidor web Nginx em execução dentro do nosso container através da porta publicada.
Executando Múltiplos Serviços
Vamos criar outro container com um serviço diferente e mapeamento de porta:
docker run -d --name redis-demo -p 6379:6379 redis
Este comando inicia um container de banco de dados Redis e mapeia sua porta padrão 6379 para a mesma porta no host.
Verifique os containers em execução:
docker ps
Saída:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a45df67e21b3 redis "docker-entrypoint.s…" 10 seconds ago Up 10 seconds 0.0.0.0:6379->6379/tcp redis-demo
f7d483e51ef2 nginx "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp web-demo
Agora temos dois containers executando serviços diferentes, cada um com seu próprio mapeamento de porta.
Gerenciando as Configurações de Porta do Container
Agora que entendemos como inspecionar e acessar serviços em containers, vamos explorar alguns conceitos adicionais de gerenciamento de portas.
Cenários Comuns de Gerenciamento de Portas
Aqui estão alguns cenários comuns que você pode encontrar:
1. Alterando Mapeamentos de Porta
Se a porta 8080 já estiver em uso no seu host, você pode mapear para uma porta diferente:
docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 8081:80 nginx
Agora, o container Nginx é acessível na porta 8081:
curl localhost:8081
2. Vinculando a Interfaces Específicas
Em vez de vincular a todas as interfaces (0.0.0.0), você pode vincular a um IP específico:
docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 127.0.0.1:8080:80 nginx
Isso vincula a porta do container apenas à interface localhost, tornando-a inacessível de fora do host.
3. Usando Portas Aleatórias do Host
Se você não se importa com qual porta do host é usada, deixe o Docker atribuir uma:
docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -P nginx
A flag -P publica todas as portas expostas para portas aleatórias no host.
Verifique a porta atribuída:
docker port web-demo
Saída:
80/tcp -> 0.0.0.0:49153
O número exato da porta variará, mas neste exemplo, a porta 80 foi mapeada para a porta 49153.
Solucionando Problemas Comuns de Porta
Aqui estão soluções para problemas comuns relacionados a portas:
- Porta Já em Uso: Se você vir um erro como "port is already allocated", escolha uma porta diferente:
docker run -d --name another-web -p 8082:80 nginx
- Container Não Consegue Conectar ao Host: Se um container precisar se conectar a um serviço no host, use o nome DNS especial do Docker
host.docker.internalem vez delocalhost:
docker run --rm alpine ping -c 2 host.docker.internal
- Verificando Qual Processo Usa uma Porta: Se uma porta já estiver em uso no host, encontre o processo:
sudo lsof -i :8080
Limpando
Vamos limpar nossos containers:
docker stop web-demo redis-demo
docker rm web-demo redis-demo
Resumo
Neste laboratório, você aprendeu a trabalhar com portas de container Docker, incluindo:
- Compreender a diferença entre portas expostas e publicadas
- Executar containers com mapeamentos de porta específicos
- Inspecionar as configurações de porta do container usando vários comandos Docker
- Acessar serviços em execução dentro de containers através de portas mapeadas
- Gerenciar e solucionar problemas de cenários comuns relacionados a portas
Essas habilidades são fundamentais para trabalhar com containers Docker e são essenciais para implantar aplicações em containers em ambientes de desenvolvimento e produção. Com este conhecimento, você agora pode configurar e gerenciar os aspectos de rede de seus containers Docker com confiança.



