Como inspecionar as portas expostas de um container Docker

DockerBeginner
Pratique Agora

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:

  1. 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.

  2. 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:

  1. 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
  1. 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.internal em vez de localhost:
docker run --rm alpine ping -c 2 host.docker.internal
  1. 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.