Réponse courte:
EXPOSE
est un moyen de documenter
--publish
(ou -p
) est un moyen de mapper un port hôte sur un port conteneur en cours d'exécution
Notez ci-dessous que:
EXPOSE
est lié à Dockerfiles
( documenter )
--publish
est lié à docker run ...
( exécution / exécution )
Exposition et publication de ports
Dans la mise en réseau Docker, il existe deux mécanismes différents qui impliquent directement les ports réseau: l'exposition et la publication des ports. Cela s'applique au réseau de ponts par défaut et aux réseaux de ponts définis par l'utilisateur.
Vous exposez les ports à l'aide du EXPOSE
mot - clé dans le Dockerfile ou de l' --expose
indicateur de docker run. L'exposition des ports est un moyen de documenter quels ports sont utilisés, mais ne mappe ni n'ouvre aucun port . L'exposition des ports est facultative.
Vous publiez des ports à l'aide de l' indicateur --publish
ou . Cela indique à Docker quels ports ouvrir sur l'interface réseau du conteneur. Lorsqu'un port est publié, il est mappé sur un port de niveau supérieur disponible (supérieur à ) sur la machine hôte, sauf si vous spécifiez le port à mapper sur la machine hôte lors de l'exécution. Vous ne pouvez pas spécifier le port à mapper sur la machine hôte lorsque vous créez l'image (dans le Dockerfile), car il y a--publish-all
docker run
30000
aucun moyen de garantir que le port sera disponible sur la machine hôte sur laquelle vous exécutez l'image .
de: mise en réseau de conteneurs Docker
Mise à jour d'octobre 2019 : le texte ci-dessus n'est plus dans la documentation mais une version archivée est ici: docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publishing-ports
Peut-être que la documentation actuelle est la suivante:
Ports publiés
Par défaut, lorsque vous créez un conteneur, il ne publie aucun de ses ports dans le monde extérieur. Pour mettre un port à la disposition des services en dehors de Docker ou des conteneurs Docker qui ne sont pas connectés au réseau du conteneur, utilisez l' indicateur --publish
ou -p
. Cela crée une règle de pare-feu qui mappe un port de conteneur à un port sur l'hôte Docker.
et peut être trouvé ici: docs.docker.com/config/containers/container-networking/#published-ports
Aussi,
EXPOSER
... L' EXPOSE
instruction ne publie pas réellement le port . Il fonctionne comme un type de documentation entre la personne qui construit l'image et la personne qui exécute le conteneur, sur les ports qui doivent être publiés.
de: référence Dockerfile
Accès au service lorsque EXPOSE
/ --publish
ne sont pas définis:
À la réponse de @Golo Roden, il est indiqué que:
"Si vous ne spécifiez aucun de ces éléments, le service dans le conteneur ne sera pas accessible de n'importe où, sauf de l'intérieur du conteneur lui-même."
C'était peut-être le cas au moment où la réponse a été écrite, mais maintenant il semble que même si vous n'utilisez pas EXPOSE
ou --publish
, le host
et les autres containers
du même réseau pourront accéder à un service que vous pouvez démarrer à l'intérieur de ce conteneur.
Comment tester cela:
J'ai utilisé ce qui suit Dockerfile
. Fondamentalement, je commence par ubuntu et installe un petit serveur Web:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
Je build
l'image comme "testexpose" et run
un nouveau conteneur avec:
docker run --rm -it testexpose bash
À l'intérieur du conteneur, je lance quelques exemples de mini-httpd
:
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
Je peux ensuite utiliser à curl
partir de l'hôte ou d'autres conteneurs pour récupérer la page d'accueil de mini-httpd
.