Que sont les étiquettes Docker et quand les utiliser ?  – CloudSavvy IT
Agence web » Actualités du digital » Quelle est la différence entre exposer et publier un port Docker ? – CloudSavvy IT

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.

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.

★★★★★