Como usar o comando docker port do compose para encontrar portas mapeadas

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar o comando docker port para descobrir a porta pública mapeada para um serviço Docker. Começaremos criando um serviço simples com mapeamento de portas usando a imagem nginx.

Após a criação do serviço, você explorará como encontrar a porta pública para todo o serviço, para um protocolo específico e para um índice de contêiner específico dentro do serviço. Essa experiência prática o equipará com as habilidades para identificar programaticamente as portas expostas para seus contêineres Docker.

Criar um serviço simples com mapeamento de portas

Nesta etapa, aprenderemos como criar um serviço simples usando o Docker e mapear uma porta do contêiner para a máquina host. Isso permite o acesso externo ao serviço em execução dentro do contêiner.

Primeiro, vamos baixar a imagem nginx do Docker Hub. Essa imagem contém um servidor web leve que podemos usar para nosso exemplo.

docker pull nginx

Você deve ver uma saída indicando que a imagem está sendo baixada. Depois que o download for concluído, você pode verificar se a imagem está disponível localmente listando as imagens:

docker images

Agora, vamos executar um contêiner baseado na imagem nginx e mapear a porta 80 do contêiner para a porta 8080 na máquina host. A flag -d executa o contêiner em modo detached (em segundo plano), e a flag -p 8080:80 realiza o mapeamento de portas.

docker run -d -p 8080:80 nginx

Este comando inicia um servidor web Nginx dentro de um contêiner Docker e o torna acessível na porta 8080 da sua VM LabEx.

Para verificar se o contêiner está em execução e o mapeamento de portas está funcionando, você pode usar o comando docker ps para listar os contêineres em execução. Procure o contêiner executando a imagem nginx e verifique a coluna PORTS. Você deve ver 0.0.0.0:8080->80/tcp.

docker ps

Finalmente, você pode acessar a página de boas-vindas do Nginx usando curl para fazer uma requisição para localhost na porta 8080.

curl localhost:8080

Você deve ver o conteúdo HTML da página de boas-vindas padrão do Nginx na saída. Isso confirma que o contêiner está em execução e acessível através da porta mapeada.

Encontrar a porta pública para o serviço

Na etapa anterior, criamos um contêiner Docker e mapeamos uma porta do contêiner para o host. Agora, vamos aprender como encontrar programaticamente a porta pública na qual um serviço é exposto. Isso é útil quando você não se lembra explicitamente de qual porta do host você mapeou para a porta interna do contêiner.

O comando docker port é projetado especificamente para esse propósito. Ele mostra os mapeamentos de portas para um determinado contêiner. Você precisa fornecer o ID ou nome do contêiner como um argumento.

Primeiro, vamos obter o ID do contêiner do contêiner Nginx em execução. Você pode usar docker ps e filtrar a saída, ou simplesmente copiar o ID da saída do comando docker ps da etapa anterior.

docker ps

Procure o contêiner executando a imagem nginx e anote seu ID do Contêiner.

Agora, use o comando docker port seguido pelo ID do Contêiner para ver os mapeamentos de portas.

docker port [CONTAINER_ID]

Substitua [CONTAINER_ID] pelo ID real do seu contêiner Nginx.

A saída mostrará a porta interna do contêiner e a porta do host correspondente à qual ela está mapeada. Por exemplo, você deve ver algo como 80/tcp -> 0.0.0.0:8080. Isso indica que a porta interna 80 do contêiner (usando o protocolo TCP) está mapeada para a porta 8080 em todas as interfaces do host (0.0.0.0).

Este comando é uma maneira rápida de determinar a porta pública sem ter que inspecionar a configuração completa do contêiner.

Encontrar a porta pública para um protocolo específico

Na etapa anterior, usamos docker port para encontrar todos os mapeamentos de portas para um contêiner. Às vezes, um contêiner pode expor várias portas usando diferentes protocolos (como TCP e UDP). Nesta etapa, aprenderemos como encontrar a porta pública para um protocolo específico.

O comando docker port permite que você especifique a porta interna do contêiner e o protocolo de seu interesse. O formato é docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL].

Vamos encontrar a porta pública para a porta interna 80 do contêiner Nginx usando o protocolo TCP. Primeiro, certifique-se de ter o ID do Contêiner da etapa anterior. Caso contrário, você pode obtê-lo novamente usando docker ps.

docker ps

Agora, use o comando docker port com o ID do contêiner e a porta e protocolo específicos:

docker port [CONTAINER_ID] 80/tcp

Substitua [CONTAINER_ID] pelo ID real do seu contêiner Nginx.

A saída deve mostrar diretamente a porta do host mapeada para a porta interna 80 do contêiner para o protocolo TCP, que é 0.0.0.0:8080. Isso é mais específico do que apenas executar docker port [CONTAINER_ID], que listaria todos os mapeamentos.

Isso é particularmente útil quando um contêiner expõe o mesmo número de porta para diferentes protocolos, e você só precisa do mapeamento para um deles.

Encontrar a porta pública para um índice de contêiner específico

Em alguns cenários avançados, um contêiner pode expor a mesma porta interna várias vezes, potencialmente mapeada para diferentes portas ou interfaces do host. Embora menos comum para serviços simples como Nginx, é possível. Nesses casos, o comando docker port pode retornar vários mapeamentos para uma única porta interna.

Para recuperar um mapeamento específico quando vários existem, você pode usar um índice. A saída de docker port para uma determinada porta interna é uma lista de mapeamentos. Você pode acessar um mapeamento específico por seu índice, começando de 0.

Vamos supor, para fins de demonstração, que nosso contêiner Nginx de alguma forma tivesse vários mapeamentos para a porta 80. Para obter o primeiro mapeamento (índice 0), você usaria o seguinte formato de comando:

docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL]/[INDEX]

Usando nosso exemplo Nginx, para obter o primeiro mapeamento para a porta interna 80 TCP, você usaria:

docker port [CONTAINER_ID] 80/tcp/0

Substitua [CONTAINER_ID] pelo ID real do seu contêiner Nginx.

Como nosso contêiner Nginx tem apenas um mapeamento para a porta 80/tcp, este comando retornará a mesma saída que docker port [CONTAINER_ID] 80/tcp, que é 0.0.0.0:8080.

Embora este exemplo específico com Nginx possa não mostrar todo o poder da indexação (já que há apenas um mapeamento), entender essa capacidade é importante para configurações de contêiner mais complexas, onde vários mapeamentos para a mesma porta interna podem existir.

Resumo

Neste laboratório, aprendemos como criar um serviço Docker simples com mapeamento de portas, puxando uma imagem Nginx, executando um contêiner e mapeando a porta 80 do contêiner para a porta 8080 do host. Verificamos o status do contêiner e o mapeamento de portas usando docker ps e confirmamos a acessibilidade fazendo um curl na porta mapeada do host.

Em seguida, exploramos como encontrar programaticamente a porta pública para um serviço usando o comando docker port, o que é particularmente útil quando o mapeamento da porta do host não é explicitamente conhecido. Este comando nos permite recuperar a porta do host correspondente à porta interna de um contêiner.