Dans le fichier docker-compose.yml, il existe des options pour ports
et expose
. Comment sont-ils différents?
Selon la référence docker-compose ,
Exposer ports. Spécifiez les deux ports (Host: CONTAINER) ou uniquement le port conteneur (un port hôte aléatoire sera choisi).
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
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
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.
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 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.
ports:
exposer:
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.