845 votes

Quelle est la différence entre docker-compose ports et expose ?

Quelle est la différence entre ports y expose options dans docker-compose.yml

877voto

bibstha Points 520

Selon le référence docker-compose ,

Ports est défini comme suit :

Exposez ports . Vous pouvez spécifier les deux ports (HOST:CONTAINER), ou seulement le port du conteneur (un port hôte aléatoire sera choisi).

  • Les ports mentionnés dans le fichier docker-compose.yml seront partagés entre les différents services lancés par le docker-compose.
  • Les ports seront exposés à la machine hôte sur un port aléatoire ou sur un port donné.

Mon docker-compose.yml ressemble :

mysql:
  image: mysql:5.7
  ports:
    - "3306"

Si je le fais docker-compose ps il ressemblera à :

  Name                     Command               State            Ports
-------------------------------------------------------------------------------------
  mysql_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:32769->3306/tcp

Exposez est défini comme suit :

Exposez les ports sans les publier sur la machine hôte - ils ne seront accessibles qu'aux services liés. Seul le port interne peut être spécifié.

Les ports ne sont pas exposés aux machines hôtes, mais uniquement aux autres services.

mysql:
  image: mysql:5.7
  expose:
    - "3306"

Si je le fais docker-compose ps il ressemblera à :

  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp

Modifier

Dans les versions récentes de Dockerfile, EXPOSE n'a plus d'impact opérationnel, il est juste informatif. ( voir aussi )

57 votes

Serait-il possible d'expliquer quels avantages il y a à spécifier expose dans un docker-compose ? Pour autant que je sache, vous n'avez pas besoin de spécifier expose pour rendre les ports accessibles aux services liés.

5 votes

Ne devrait-il pas dire que les ports exposés ne seront disponibles que pour les services du même réseau docker (la liaison est remplacée pour la plupart des pièces) ?

15 votes

@Juicy Je suppose que c'est similaire à expose dans les Dockerfiles : "L'instruction EXPOSE ne publie pas réellement le port. Elle fonctionne comme un type de documentation..." docs.docker.com/engine/reference/builder/#expose

394voto

Mehraj Malik Points 3248

ports :

  1. Active le conteneur pour qu'il écoute le(s) port(s) spécifié(s) depuis le monde extérieur au docker (peut être la même machine hôte ou une machine différente) ET également le monde accessible à l'intérieur du docker.
  2. Plus d'un port peut être spécifié (c'est la raison pour laquelle ports pas de port)

enter image description here

exposer :

  1. Active le conteneur pour qu'il écoute un port spécifique uniquement depuis le monde à l'intérieur du docker ET non accessible depuis le monde à l'extérieur du docker.
  2. Plus d'un port peut être spécifié

enter image description here

5 votes

Notez que expose autorise plusieurs ports - docs.docker.com/compose/compose-file/#expose - cependant vous ne fournissez que le port interne plutôt que interne + externe

0 votes

Mais que faire si je veux accéder au monde extérieur depuis mon conteneur ? stackoverflow.com/questions/61322256/

1 votes

C'est une partie très importante : "Active le conteneur pour écouter un port spécifique uniquement depuis le monde intérieur".

68voto

sorabzone Points 54

Ports Cette section est utilisée pour définir le mappage entre le serveur hôte et le conteneur Docker.

ports:
   - 10005:80

Cela signifie que l'application fonctionnant à l'intérieur du conteneur est exposée au port 80. Mais un système/entité externe ne peut pas y accéder, il faut donc le mapper sur le port du serveur hôte.

Remarque : vous devez ouvrir le port hôte 10005 et modifier les règles du pare-feu pour permettre aux entités externes d'accéder à l'application.

Ils peuvent utiliser

http://{host IP}:10005

quelque chose comme ceci

EXPOSE Ceci est exclusivement utilisé pour définir le port sur lequel l'application s'exécute à l'intérieur du conteneur docker.

Vous pouvez également le définir dans le fichier docker. En général, il est bon et largement utilisé de définir EXPOSE dans le fichier docker car il est très rare que quelqu'un les exécute sur un autre port que le port 80 par défaut.

53voto

BMitch Points 3744

Ports

El ports va publier les ports sur l'hôte. Docker configurera un transfert pour un port spécifique du réseau hôte vers le conteneur. Par défaut, ceci est implémenté avec un processus proxy en espace utilisateur ( docker-proxy ) qui écoute sur le premier port, et transmet au conteneur, qui doit écouter sur le deuxième point. Si le conteneur n'écoute pas sur le port de destination, vous verrez toujours quelque chose qui écoute sur l'hôte, mais vous obtiendrez un refus de connexion si vous essayez de vous connecter au port de l'hôte, à partir du transfert échoué dans votre conteneur.

Notez que le conteneur doit être à l'écoute sur toutes les interfaces réseau, car ce proxy n'est pas exécuté dans l'espace de noms du réseau du conteneur et ne peut pas atteindre 127.0.0.1 à l'intérieur du conteneur. La méthode IPv4 pour cela consiste à configurer votre application pour écouter sur 0.0.0.0 .

Notez également que les ports publiés ne fonctionnent pas dans le sens inverse. Vous ne pouvez pas vous connecter à un service sur l'hôte à partir du conteneur en publiant un port. Au lieu de cela, vous trouverez des erreurs de docker essayant d'écouter le port de l'hôte déjà utilisé.

Exposez

Expose la documentation. Il définit les métadonnées sur l'image, et lorsqu'il est exécuté, sur le conteneur également. En général, vous configurez ceci dans le Dockerfile avec l'option EXPOSE et il sert de documentation pour les utilisateurs qui exécutent votre image, pour qu'ils sachent sur quels ports par défaut votre application écoutera. Lorsqu'elles sont configurées à l'aide d'un fichier de composition, ces métadonnées ne sont définies que sur le conteneur. Vous pouvez voir les ports exposés lorsque vous exécutez la commande docker inspect sur l'image ou le conteneur.

Il y a quelques outils qui dépendent des ports exposés. Dans docker, le -P publiera tous les ports exposés sur des ports éphémères sur l'hôte. Il existe également différents reverse proxies qui utiliseront par défaut un port exposé lors de l'envoi de trafic vers votre application si vous ne définissez pas explicitement le port du conteneur.

En dehors de ces outils externes, expose n'a aucun impact sur la mise en réseau des conteneurs. Il suffit d'avoir un réseau docker commun, et de se connecter au port du conteneur, pour accéder à un conteneur à partir d'un autre. Si ce réseau est créé par l'utilisateur (par exemple, pas le réseau de pont par défaut nommé bridge ), vous pouvez utiliser le DNS pour vous connecter aux autres conteneurs.

0 votes

Écoutez, les amis ! Cette réponse n'est peut-être pas très jolie, mais elle est extrêmement instructive.

9voto

medTech Points 104

Je suis totalement d'accord avec les réponses précédentes. Je voudrais juste mentionner que la différence entre exposer et ports fait partie du concept de sécurité dans Docker. Elle va de pair avec le mise en réseau de Docker. Par exemple :

Imaginez une application avec un frontal web et un back-end de base de données. Le monde extérieur a besoin d'accéder au frontal web (peut-être sur le port 80), mais seul le back-end lui-même a besoin d'accéder à l'hôte de la base de données et au port. En utilisant une passerelle définie par l'utilisateur, seul le port web doit être ouvert, et l'application de base de données n'a pas besoin d'être ouverte. web et l'application de base de données n'a pas besoin de ports ouverts, puisque le frontal web peut l'atteindre via le pont défini par l'utilisateur.

Il s'agit d'un cas d'utilisation courant lors de la mise en place d'une architecture réseau dans Docker. Par exemple, dans un réseau de pont par défaut, les ports ne sont pas accessibles depuis le monde extérieur. C'est pourquoi vous pouvez ouvrir un point d'entrée avec "ports". En utilisant "expose", vous définissez la communication au sein du réseau. Si vous voulez exposer les ports par défaut, vous n'avez pas besoin de définir "expose" dans votre fichier docker-compose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X