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
porta
: O número da porta que o contêiner escutará.protocolo
(opcional): O protocolo utilizado pela porta, comotcp
ouudp
. O padrão étcp
se não especificado.
Funcionalidades do EXPOSE
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
Neste exemplo, a porta 80 é exposta, indicando que o servidor NGINX dentro do contêiner estará escutando nessa porta.
Expor Múltiplas Portas
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
EXPOSE
em ExecuçãoEmbora 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, combineEXPOSE
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 comandodocker 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