Por que usar EXPOSE no Dockerfile - já que você pode vincular a todas as portas de qualquer maneira


23

Posso docker run -p 3000:3000 image sem EXPOSE essa porta no contêiner (veja abaixo). Se isso for verdade, por que se preocupar em colocar EXPOSE no Dockerfile? É apenas para comunicação com usuários de imagem? Porque eu não conheço um motivo funcional para EXPOSE as portas se todas elas forem vinculativas de qualquer maneira.


Aqui estão as etapas que mostram a ligação a uma porta em um contêiner, apesar de não ser EXPOSEd

$ cat Dockerfile
FROM alpine
RUN apk add nodejs npm vim
COPY webserver /webserver
CMD [ "node", "/webserver/index.js" ]


$ docker build .
Sending build context to Docker daemon  1.931MB
Step 1/4 : FROM alpine
 ---> 11cd0b38bc3c
Step 2/4 : RUN apk add nodejs npm vim
 ---> Using cache
 ---> 4270f8bdb201
Step 3/4 : COPY webserver /webserver
 ---> Using cache
 ---> 67f4cda61ff0
Step 4/4 : CMD [ "node", "/webserver/index.js" ]
 ---> Using cache
 ---> 1df8f9024b85
Successfully built 1df8f9024b85


$ curl localhost:4400
curl: (7) Failed to connect to localhost port 4400: Connection refused


$ docker run -d -p 4400:3000 1df8f9024b85
7d0e6c56f8ad8827fe72830a30c1aac96821104b8ea111291ca39e6536aad8fd


$ curl localhost:4400
Hello World!


$

Respostas:


29

A documentação EXPOSE do Docker aborda esse ponto específico:

A EXPOSEinstrução não publica realmente a porta. Ele funciona como um tipo de documentação entre a pessoa que constrói a imagem e a pessoa que executa o contêiner, sobre quais portas devem ser publicadas. Para realmente publicar a porta ao executar o contêiner, use o -psinalizador docker runpara publicar e mapear uma ou mais portas, ou o -Psinalizador para publicar todas as portas expostas e mapeá-las para portas de alta ordem.

Preste atenção na última frase, se você expor várias portas, então -Pse torna útil para evitar a configuração de múltiplas -pna linha de comando.


A "documentação" está na forma de metadados da imagem. Além de serem úteis para o -Psinalizador, outros utilitários podem consultar os contêineres em execução em busca desses metadados, o que é útil em proxies que atualizam dinamicamente suas regras de encaminhamento usando essas portas expostas como padrão.
BMitch 2/09/2018

@BMitch absolutamente, eu senti que era uma informação estranha ainda não útil para o OP, mas sinta-se livre para editá-lo no.
Tensibai

EXPOSE is documentation
智 文

4

Isso é feito para fins de automação. Você pode ter um comando universal executado docker run -Ppara iniciar um contêiner e o próprio Dockerfile é usado para especificar qual contêiner expõe qual porta. Caso você esteja lidando com dezenas ou centenas de contêineres sendo construídos através de um pipeline, isso é bastante útil. Passar detalhes externos não contidos no Dockerfile junto com o contêiner através do pipeline de estágio para estágio é bastante difícil em escala.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.