web-dev-qa-db-fra.com

Quelle est la difference entre docker-compose ports vs expose

Dans le fichier docker-compose.yml, il existe des options pour ports et expose. Comment sont-ils différents?

214
bibstha

Selon la référence docker-compose ,

Ports est défini comme:

Exposer ports. Spécifiez les deux ports (Host: CONTAINER) ou uniquement le port conteneur (un port hôte aléatoire sera choisi).

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

Mon docker-compose.yml ressemble à:

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

Si je fais docker-compose ps, cela ressemblera à:

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

Exposer est défini comme:

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 ordinateurs hôtes, mais uniquement à d'autres services.

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

Si je fais docker-compose ps, cela ressemblera à:

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

Ports Cette section permet de définir le mappage entre le serveur hôte et le conteneur Docker.

ports:
   - 10005:80

Cela signifie que l'application qui s'exécute à l'intérieur du conteneur est exposée sur le port 80. Mais les systèmes/entités externes ne peuvent pas y accéder et doivent donc être mappés sur le port du serveur hôte.

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

Ils peuvent utiliser 

http: // {Host IP}: 10005

quelque chose comme ça

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

Vous pouvez également le définir dans dockerfile. En règle générale, il est bon et largement répandu de définir EXPOSE à l'intérieur du fichier de docker car très rarement, quelqu'un les exécute sur un port autre que le port par défaut 80.

5
sorabzone

Les ports

La section ports publiera les ports sur l'hôte. Docker configurera un transfert pour un port spécifique du réseau de l'hôte dans le conteneur. Par défaut, cela est implémenté avec un processus proxy d'espace utilisateur (docker-proxy) qui écoute sur le premier port et le transfère dans le conteneur, qui doit être écouté sur le deuxième point. Si le conteneur n'écoute pas sur le port de destination, vous verrez toujours quelque chose à l'écoute sur l'hôte, mais la connexion sera refusée si vous essayez de vous connecter à ce port de l'hôte, à partir de la transmission échouée dans votre conteneur.

Notez que le conteneur doit écouter toutes les interfaces réseau car ce proxy ne s'exécute pas dans l'espace de noms 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 qu’elle écoute sur 0.0.0.0.

Notez également que les ports publiés ne fonctionnent pas dans la direction opposée. 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 menu fixe en essayant d'écouter le port hôte déjà utilisé.

Exposer

Exposer est la documentation. Il définit également les métadonnées sur l'image et, lors de l'exécution, sur le conteneur. En règle générale, vous configurez cette opération dans le fichier Dockerfile à l'aide de l'instruction EXPOSE. Cette information sert de documentation aux utilisateurs qui exécutent votre image pour leur permettre de savoir sur quels ports votre application écoutera par défaut. Lorsqu'il est configuré avec 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 un docker inspect sur l'image ou le conteneur.

Il existe quelques outils qui reposent sur des ports exposés. Dans le menu fixe, l'indicateur -P publiera tous les ports exposés sur les ports éphémères de l'hôte. Il existe également divers proxys inverses 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 de conteneur.

À l'exception de ces outils externes, expose n'a aucun impact sur la mise en réseau des conteneurs. Vous avez uniquement besoin d'un réseau de docker commun et d'une connexion 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 DNS pour vous connecter aux autres conteneurs.

4
BMitch

ports

  1. Active le conteneur pour écouter les ports spécifiés du monde extérieur au docker (il peut s'agir du même ordinateur hôte ou d'un ordinateur différent) ET du monde accessible à l'intérieur du menu fixe. 
  2. Plusieurs ports peuvent être spécifiés (c'est pourquoi ports n'est pas un port)

 enter image description here

exposer

  1. Active le conteneur pour écouter un port spécifique uniquement du monde situé à l'intérieur du menu fixe ET du monde non accessible en dehors du menu fixe. 
  2. Un seul port peut être spécifié

 enter image description here

2
Mehraj Malik

Je suis totalement d'accord avec les réponses avant. Je voudrais juste mentionner que la différence entre expose et ports fait partie du concept de sécurité de docker. Cela va de pair avec le réseau de docker. Par exemple:

Imaginez une application avec une interface Web et une base de données . Le monde extérieur a besoin d'accéder au serveur Web (peut-être sur le port 80), mais seul le serveur lui-même a besoin d'accéder à la base de données Host et le port. Avec un pont défini par l'utilisateur, seul le port Web doit être ouvert, et l’application base de données n’a pas besoin de ports ouverts, puisque l'interface Web peut l'atteindre via le pont défini par l'utilisateur.

Il s'agit d'un cas d'utilisation courant lors de la configuration d'une architecture réseau dans le menu fixe. Ainsi, par exemple, dans un réseau de pontage par défaut, les ports ne sont pas accessibles depuis le monde extérieur . Vous pouvez donc ouvrir un point d'entrée avec "ports". Avec "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.

0
medTech