Quelle est la différence entre exposer et publier un port Docker ?

0
55
Michael Vi/Shutterstock.com

Exposé et les ports de conteneurs 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 les instructions EXPOSE dans un Image’s Dockerfile :

EXPOSE 80

Exposer un port n'a cependant pas d'effet immédiat. L'instruction communique uniquement que l'application à l'intérieur du conteneur écoute sur le port 80. Elle n'ouvre pas ce port au monde et ne donne pas explicitement accès à d'autres conteneurs.

En tant qu'auteur d'image, la liste des ports utilisés par votre charge de travail avec EXPOSE aide les utilisateurs à configurer les règles de transfert 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 répertoriez vos conteneurs avec docker ps. Ils apparaîtront dans la colonne PORTS, même s'ils ne seront pas réellement accessibles à l'extérieur 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 la balise ou l'ID de votre image à la place de l'image de démonstration :

docker inspect –format=”{{json .Config.ExposedPorts}}” image de démonstration

Publication des ports

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 une instruction EXPOSE, puis de lui lier un port hôte.

Publicité

Les ports sont exposés avec l'indicateur -p pour la commande docker run :

docker run -d -p 8080:80 httpd:latest

Cette commande lie le port 8080 de votre hôte Docker au port 80 à l'intérieur de votre nouveau conteneur. Vous pouvez maintenant visiter http://localhost:8080 pour accéder au port du conteneur. Si vous exécutez docker ps, vous verrez que la colonne PORTS affiche maintenant ce mappage. Le port de conteneur exposé 80 a été publié sur l'hôte.

L'indicateur -p 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 Advertisement

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 l'indicateur –publish-all pour que Docker publie automatiquement tous les ports exposés répertoriés dans le fichier Docker 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 la commande docker ps pour voir les attributions de ports qui ont été effectuées. 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 des mappages explicites -p. Dans ce cas, un mappage créé par un indicateur -p remplacera le port aléatoire attribué par –publish-all.

Quand vous n'avez pas besoin de publier un port

Vous n'avez besoin de publier les ports de conteneur avec -p que 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:dernière publicité

Dans cet exemple , le conteneur Web peut se connecter à un serveur MySQL exécuté sur le port 3306 du conteneur de base de données à l'aide de l'adresse database:3306. 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 car une règle iptables sera créée pour chacun.

Résumé

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 à moins que vous ne les publiiez manuellement. En 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 doit être traité comme une documentation alors que l'indicateur -p crée un mappage de port fonctionnel.

Docker fournit un comportement supplémentaire basé sur les instructions EXPOSE. Vous pouvez afficher les ports exposés d'un conteneur avec docker ps, qu'ils aient été publiés ou non. Il existe également l'indicateur –publish-all qui publie les ports exposés d'une image sur des ports hôtes aléatoires.

Vous n'avez besoin de publier les ports que lorsque vous souhaitez accéder à un conteneur depuis l'extérieur. 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.