EXPOSE

A instrução EXPOSE em um Dockerfile é usada para documentar quais portas o contêiner está escutando em tempo de execução. Isso informa aos usuários da imagem (e ao Docker) quais portas devem ser abertas para permitir a comunicação com o contêiner. É importante notar que EXPOSE não publica ou abre realmente essas portas fora do contêiner; ele apenas documenta as portas para referência.

Sintaxe Básica

EXPOSE <porta> [<porta>/<protocolo>...]
  • porta: O número da porta que o contêiner escutará.

  • protocolo (opcional): O protocolo utilizado pela porta, como tcp ou udp. O padrão é tcp se não especificado.

Funcionalidades do EXPOSE

  • Documentação Interna: EXPOSE serve como uma maneira de documentar quais portas um serviço no contêiner usa. Isso pode ser útil para outros desenvolvedores ou para o gerenciamento da imagem.

  • Integração com Docker: Quando docker run é usado com a flag -P (ou --publish-all), o Docker publica todas as portas expostas no contêiner, mapeando-as para portas disponíveis no host.

Exemplos de Uso

Expor uma Porta Simples

FROM nginx:alpine
EXPOSE 80

Neste exemplo, a porta 80 é exposta, indicando que o servidor NGINX dentro do contêiner estará escutando nessa porta.

Expor Múltiplas Portas

FROM node:14
EXPOSE 3000 8080

Aqui, as portas 3000 e 8080 são expostas, o que indica que a aplicação Node.js pode escutar em ambas as portas.

Especificando o Protocolo

Neste exemplo, a porta 1234 é exposta usando o protocolo UDP, que é diferente do padrão TCP.

Usando EXPOSE em Execução

Embora EXPOSE declare quais portas um contêiner está escutando, ele não publica essas portas para o host. Para acessar essas portas externamente, você deve usar a flag -p (ou --publish) ou -P (ou --publish-all) no comando docker run:

  • Mapear uma Porta Específica:

    Esse comando mapeia a porta 80 do contêiner para a porta 8080 no host, tornando o serviço acessível através do host na porta 8080.

  • Publicar Todas as Portas Expostas:

    O Docker mapeará automaticamente todas as portas expostas pelo contêiner para portas aleatórias disponíveis no host.

Boas Práticas e Considerações

  • Documentação: Use EXPOSE para documentar as portas que seus serviços utilizam, mesmo que você não planeje publicá-las externamente. Isso ajuda outros desenvolvedores e ferramentas a entender como interagir com o contêiner.

  • Segurança: Lembre-se de que EXPOSE não abre as portas para o mundo exterior; ele apenas documenta. Para publicar portas de maneira segura, combine EXPOSE com a flag -p ao executar o contêiner.

  • Protocolo Correto: Especifique o protocolo correto (TCP ou UDP) quando necessário. Embora o TCP seja o padrão, algumas aplicações, como DNS e outras que dependem de UDP, exigem a especificação do protocolo.

  • Flexibilidade: Considere deixar a decisão de quais portas publicar para o comando docker run, o que oferece mais flexibilidade para o usuário da imagem.

Exemplo Avançado

Expondo e Publicando Portas para um Servidor Web

Aqui, a aplicação Python escuta na porta 5000. A instrução EXPOSE 5000 documenta essa porta. Para acessar a aplicação externamente, o usuário pode usar:

Isso mapeia a porta 5000 do host para a porta 5000 do contêiner.

Resumo

  • EXPOSE documenta as portas que um contêiner está escutando, sem publicá-las automaticamente.

  • Flexibilidade e Segurança: Combine EXPOSE com as opções de mapeamento de porta no comando docker run para publicar as portas conforme necessário.

  • Documentação: É uma prática recomendada usar EXPOSE para tornar explícito quais portas os serviços dentro do contêiner utilizam.

Laboratório

Exposição da porta na construção do container

Destaque para:

Execução do container sem o portbind

Destaque para a porta não especificada:

Exposição da porta do container

Destaque para a porta exposta:

EXPOSE não constrói uma camada no filesystem. Ele é um metadado da imagem:

Publish Automático de Portas

Destaque para:

Last updated