Quelle est la différence entre exposer et publier un port Docker ? – CloudSavvy IT
Les ports de conteneurs exposés et publiés sont deux concepts différents mais liés dans Docker. Les ports exposés sont définis dans votre Dockerfile comme de simples métadonnées. Vous devez les publier au démarrage de votre conteneur si vous souhaitez activer l’accès extérieur.
Sommaire
Exposer un port
Les ports sont exposés via EXPOSE
instructions dans le Dockerfile d’une image :
EXPOSE 80
Cependant, exposer un port n’a pas d’effet immédiat. L’instruction communique uniquement que l’application à l’intérieur du conteneur écoute sur le port 80
. Il n’ouvre pas ce port au monde et ne donne pas explicitement accès à d’autres conteneurs.
En tant qu’auteur d’images, répertorier les ports utilisés par votre charge de travail avec EXPOSE
aide les utilisateurs à configurer les règles de redirection de port appropriées lorsqu’ils démarrent un conteneur. Ceci est particulièrement important lorsque des ports non standard sont utilisés : alors qu’un serveur Web peut être censé écouter sur le port 80, les utilisateurs ne pourront pas deviner le port utilisé par un serveur de socket personnalisé.
Les ports exposés sont visibles lorsque vous listez vos conteneurs avec docker ps
. Ils apparaîtront dans le PORTS
colonne, même s’ils ne seront pas réellement accessibles en dehors du conteneur. Cela vous donne un moyen simple de vérifier sur quels ports le logiciel à l’intérieur d’un conteneur écoute.
Vous pouvez inspecter les ports exposés par une image sans démarrer un conteneur en utilisant docker inspect
. Remplacez le tag ou l’ID de votre image au lieu de demo-image
:
docker inspect --format="{{json .Config.ExposedPorts}}" demo-image
Ports de publication
La publication d’un port le rend accessible depuis l’extérieur du conteneur. Il vous permet de prendre un port que vous avez découvert par un EXPOSE
instruction, puis liez-lui un port hôte.
Les ports sont exposés avec le -p
drapeau pour le docker run
commander:
docker run -d -p 8080:80 httpd:latest
Cette commande lie le port 8080
sur votre hôte Docker pour 80
à l’intérieur de votre nouveau conteneur. Vous pouvez maintenant visiter http://localhost:8080
pour accéder au port du conteneur. Si tu cours docker ps
, vous verrez le PORTS
La colonne affiche maintenant ce mappage. Le port à conteneurs exposé 80
a été publié sur l’hôte.
Les -p
flag peut être utilisé sans spécifier de port auquel se lier :
docker run -d -p 80 httpd:latest
Cette variante liera le port 80 du conteneur à un port aléatoire sur l’hôte. Vous pouvez vérifier le port qui a été attribué en exécutant docker ps
.
-p
prend également en charge la publication d’un port vers des interfaces réseau spécifiques :
docker run -d -p 127.0.0.1:8080:80 httpd:latest
Ici, le port de conteneur 80 ne sera accessible que via le port 8080 sur l’adresse de bouclage local de l’hôte. Cela protège votre conteneur des appels réseau effectués par vos autres appareils.
Publication de tous les ports exposés
Vous pouvez démarrer un conteneur avec le --publish-all
flag pour que Docker publie automatiquement tous les ports exposés répertoriés dans le Dockerfile de l’image :
docker run -d --publish-all httpd:latest
Cela affectera des ports libres aléatoires sur votre hôte à chaque port exposé dans le conteneur. Utilisez le docker ps
commande pour voir les affectations de port qui ont été faites. Cela simplifie le démarrage d’un nouveau conteneur à partir d’une image qui nécessite l’ouverture de plusieurs ports non standard.
Vous pouvez combiner --publish-all
avec explicite -p
mappages. Dans ce cas, un mappage créé par un -p
flag remplacera le port aléatoire assigné par --publish-all
.
Quand vous n’avez pas besoin de publier un port
Il vous suffit de publier les ports de conteneurs avec -p
si vous souhaitez y accéder depuis votre hôte Docker ou un autre appareil sur votre réseau physique. Les réseaux Docker sont l’approche alternative préférée pour le trafic inter-conteneurs.
Les conteneurs qui partagent un réseau peuvent toujours communiquer entre eux, même si leurs ports n’ont pas été explicitement publiés.
docker network create demo-network docker run -d --network demo-network --name web web:latest docker run -d --network demo-network --name database database:latest
Dans cet exemple, le web
conteneur pourrait se connecter à un serveur MySQL exécuté sur le port 3306 dans le database
conteneur à l’aide du database:3306
adresse. Docker configure automatiquement des tables de routage pour les noms de conteneurs sur le réseau.
Utilisation des plages de ports
Docker peut exposer et publier des plages de ports entières lorsque vous avez besoin de plusieurs ports disponibles :
EXPOSE 8000-8100 docker run --publish-all docker run -p 6000-6100:8000-8100
Dans le premier cas, --publish-all
attribuera 100 ports aléatoires sur votre hôte et les mappera dans la plage du conteneur. La deuxième forme lie explicitement une plage d’hôtes à une plage de conteneurs comme d’habitude. Les performances peuvent être affectées si vous utilisez un très grand nombre de ports comme iptables
une règle sera créée pour chacun.
Sommaire
Les ports exposés sont des éléments de métadonnées qui définissent les ports écoutés par le logiciel à l’intérieur d’une image de conteneur. La présence de ports exposés ne les rend pas accessibles, sauf si vous les publiez manuellement. Dans ce sens, le verbe « exposer » est un terme impropre, car beaucoup de gens supposent qu’il s’agit d’une action active alors qu’en fait, il s’agit d’une déclaration d’information. EXPOSE
doivent être traités comme des documents alors que le -p
flag crée un mappage de port fonctionnel.
Docker fournit un comportement supplémentaire basé sur EXPOSE
instructions. Vous pouvez afficher les ports exposés d’un conteneur avec docker ps
indépendamment du fait qu’ils aient été publiés. Il y a aussi le --publish-all
indicateur qui publie les ports exposés d’une image sur des ports hôtes aléatoires.
Vous n’avez besoin de publier des ports que lorsque vous souhaitez accéder à un conteneur depuis l’extérieur d’un réseau Docker. La communication entre les conteneurs d’un même réseau est toujours libre, que les ports concernés aient été ou non exposés ou publiés.