Resposta curta:
EXPOSE
é uma maneira de documentar
--publish
(ou -p
) é uma maneira de mapear uma porta host para uma porta de contêiner em execução
Observe abaixo que:
EXPOSE
está relacionado a Dockerfiles
( documentação )
--publish
está relacionado a docker run ...
( execução / tempo de execução )
Expor e publicar portas
Nas redes do Docker, existem dois mecanismos diferentes que envolvem diretamente as portas de rede: expor e publicar portas. Isso se aplica à rede de pontes padrão e às redes de pontes definidas pelo usuário.
Você expõe portas usando a EXPOSE
palavra - chave no Dockerfile ou o --expose
sinalizador para executar o Docker. A exposição de portas é uma maneira de documentar quais portas são usadas, mas na verdade não mapeia nem abre nenhuma porta . A exposição de portas é opcional.
Você publica portas usando o sinalizador --publish
ou --publish-all
para docker run
. Isso informa ao Docker quais portas abrir na interface de rede do contêiner. Quando uma porta é publicada, ela é mapeada para uma porta de alta ordem disponível (maior que 30000
) na máquina host, a menos que você especifique a porta a ser mapeada na máquina host em tempo de execução. Você não pode especificar a porta para a qual mapear na máquina host ao criar a imagem (no Dockerfile), porque não há como garantir que a porta estará disponível na máquina host em que você executa a imagem .
de: rede de contêineres do Docker
Atualização em outubro de 2019 : a parte do texto acima não está mais nos documentos, mas uma versão arquivada está aqui: docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publishing-ports
Talvez a documentação atual seja a seguinte:
Portas publicadas
Por padrão, quando você cria um contêiner, ele não publica nenhuma de suas portas no mundo externo. Para disponibilizar uma porta para serviços fora do Docker ou para contêineres do Docker que não estão conectados à rede do contêiner, use o sinalizador --publish
ou -p
. Isso cria uma regra de firewall que mapeia uma porta de contêiner para uma porta no host do Docker.
e pode ser encontrado aqui: docs.docker.com/config/containers/container-networking/#published-ports
Além disso,
EXPOR
... A EXPOSE
instrução não publica realmente a porta . Ele funciona como um tipo de documentação entre a pessoa que cria a imagem e a pessoa que executa o contêiner, sobre quais portas devem ser publicadas.
de: referência do Dockerfile
Acesso ao serviço quando EXPOSE
/ --publish
não está definido:
Na resposta de @Golo Roden, afirma-se que:
"Se você não especificar nenhum deles, o serviço no contêiner não poderá ser acessado de nenhum lugar, exceto de dentro do próprio contêiner."
Talvez tenha sido o caso no momento em que a resposta estava sendo escrita, mas agora parece que, mesmo se você não usar EXPOSE
ou --publish
, a host
outra containers
rede da mesma rede poderá acessar um serviço que você pode iniciar dentro desse contêiner.
Como testar isso:
Eu usei o seguinte Dockerfile
. Basicamente, eu começo com o ubuntu e instalo um pequeno servidor web:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
Eu build
a imagem como "testexpose" e run
um novo contêiner com:
docker run --rm -it testexpose bash
Dentro do contêiner, inicio algumas instâncias de mini-httpd
:
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
Sou capaz de usar a curl
partir do host ou de outros contêineres para buscar a home page do mini-httpd
.