J'expérimente avec Dockerfiles, et je pense que je comprends la plupart de la logique. Cependant, je ne vois pas la différence entre "exposer" et "publier" un port dans ce contexte.
Tous les tutoriels que j'ai vus en premier incluent la EXPOSE
commande dans le Dockerfile:
...
EXPOSE 8080
...
Ils construisent ensuite une image à partir de ce Dockerfile:
$ docker build -t an_image - < Dockerfile
Et puis publiez le même port que ci-dessus lors de l'exécution de l'image:
$ docker run -d -p 8080 an_image
ou publier tous les ports en utilisant
$ docker run -d -P an_image
Quel est l'intérêt d'exposer un port dans le Dockerfile, s'il est quand même publié? Serait-il jamais nécessaire d'exposer un port en premier, et de ne pas le publier plus tard? En effet, je voudrais spécifier tous les ports que j'utiliserai dans le Dockerfile lors de la création de l'image, puis ne plus les déranger, en les exécutant simplement avec:
$ docker run -d an_image
Est-ce possible?
EXPOSE
et-p
et non pas les trois points de balle nombreux précédents. Ça m'a un peu troublé.EXPOSE
, mais vous ne spécifiez-p
. Je crois comprendre que si vous utilisez-p
et exécutez toujours des conteneurs individuels, ilEXPOSE
est bon d'omettre, mais cela devient utile / nécessaire lorsque vous utilisez-P
ou--link
. (Et puisque vous ne savez pas comment les autres utiliseront votre image, celaEXPOSE
devrait être spécifié dans toutes les images publiques.)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écutionNotez ci-dessous que:
EXPOSE
est lié àDockerfiles
( documenter )--publish
est lié àdocker run ...
( exécution / exécution )Aussi,
Accès au service lorsque
EXPOSE
/--publish
ne sont pas définis:À la réponse de @Golo Roden, il est indiqué que:
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
, lehost
et les autrescontainers
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:Je
build
l'image comme "testexpose" etrun
un nouveau conteneur avec:À l'intérieur du conteneur, je lance quelques exemples de
mini-httpd
:Je peux ensuite utiliser à
curl
partir de l'hôte ou d'autres conteneurs pour récupérer la page d'accueil demini-httpd
.la source
172.17.0.2
) et tous les ports que je mentionne. Si vous utilisez Docker pour Mac / Windows, la mise en réseau est différente. Il n'y a pas dedocker0
pont.Voir la référence de la documentation officielle: https://docs.docker.com/engine/reference/builder/#expose
Vous
EXPOSE
permet de définir des ports privés (conteneur) et publics (hôte) à exposer au moment de la création de l'image lorsque le conteneur s'exécute si vous exécutez le conteneur avec-P
.Le port public et le protocole sont facultatifs, si aucun port public n'est spécifié, un port aléatoire sera sélectionné sur l'hôte par docker pour exposer le port de conteneur spécifié sur Dockerfile.
Une bonne pratique est de ne pas spécifier de port public, car cela limite un seul conteneur par hôte (un deuxième conteneur jettera un port déjà utilisé).
Vous pouvez utiliser
-p
indocker run
pour contrôler quel port public les ports de conteneurs exposés seront connectables.Quoi qu'il en soit, si vous n'utilisez pas
EXPOSE
(avec-P
sur docker run) ni-p
, aucun port ne sera exposé.Si vous utilisez toujours
-p
atdocker run
vous n'en avez pas besoinEXPOSE
mais si vous utilisezEXPOSE
votredocker run
commande peut être plus simple,EXPOSE
peut être utile si vous ne vous souciez pas du port qui sera exposé sur l'hôte, ou si vous êtes sûr qu'un seul conteneur sera chargé.la source
Vous exposez les ports à l'aide du mot clé EXPOSE dans le Dockerfile ou de l'indicateur --expose à l'exécution de docker. L'exposition des ports est un moyen de documenter les ports utilisés, mais ne mappe ni n'ouvre aucun port. L'exposition des ports est facultative.
Source: github commit
la source
La plupart des gens utilisent Docker Composer avec des réseaux. La documentation indique:
Ce qui signifie que si vous utilisez des réseaux pour la communication entre les conteneurs, vous n'avez pas à vous soucier de l'exposition des ports.
la source
EXPOSE est utilisé pour mapper le port de conteneur de port local, c'est-à-dire: si vous spécifiez exposer dans un fichier docker comme
EXPOSE 8090
Que fera-t-il pour mapper le port local de l'hôte 8090 au port de conteneur 8090
la source