Réponses:
Selon la référence docker-compose ,
Exposez les ports . Spécifiez les deux ports (HOST: CONTAINER) ou simplement le port de conteneur (un port d'hôte aléatoire sera choisi).
Mes docker-compose.yml
looks:
mysql:
image: mysql:5.7
ports:
- "3306"
Si je le 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 machines hôtes, mais uniquement aux autres services.
mysql:
image: mysql:5.7
expose:
- "3306"
Si je le fais docker-compose ps
, cela ressemblera à:
Name Command State Ports
---------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp
expose
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
docker-compose run
, la définition de port dans docker-compose.yml
est ignorée par défaut. Utilisez docker-compose up
ou fournissez le paramètre--service-ports
ports :
exposer :
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 exécutée à l'intérieur du conteneur est exposée au port 80. Mais le système / l'entité externe ne peut pas y accéder, elle doit donc être mappée au port du serveur hôte.
Remarque: vous devez ouvrir le port hôte 10005 et modifier les règles de pare-feu pour permettre aux entités externes d'accéder à l'application.
Ils peuvent utiliser
http: // {hôte IP}: 10005
quelque chose comme ça
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 dockerfile. En règle générale, il est bon et largement utilisé de définir EXPOSE dans le dockerfile car très rarement, quiconque les exécute sur un autre port que le port 80 par défaut
La ports
section publiera 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, cela est implémenté avec un processus proxy d'espace utilisateur (docker-proxy
) qui écoute sur le premier port, et transfère dans le 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 à l'écoute sur l'hôte, mais vous obtiendrez une connexion refusée si vous essayez de vous connecter à ce port hôte, de l'échec vers l'avant dans votre conteneur.
Remarque, le conteneur doit écouter sur 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 consiste à configurer votre application pour écouter 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 docker lors de l'écoute du port hôte déjà utilisé.
Exposer est la documentation. Il définit des métadonnées sur l'image et, lors de l'exécution, sur le conteneur également. Généralement, vous configurez cela dans le Dockerfile avec l' EXPOSE
instruction, et elle sert de documentation aux utilisateurs exécutant votre image, pour qu'ils sachent sur quels ports par défaut votre application écoutera. Lorsqu'elles sont configurées 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 dépendent des ports exposés. Dans Docker, le-P
drapeau 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.
En dehors de ces outils externes, expose n'a aucun impact sur la mise en réseau entre les conteneurs. Vous n'avez besoin que d'un réseau Docker commun et d'une connexion au port de 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.
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. Cela va de pair avec la mise en réseau des dockers. Par exemple:
Imaginez une application avec un front-end web et un back-end de base de données. Le monde extérieur a besoin d'accéder au serveur Web frontal (peut-être sur le port 80), mais seul le serveur principal lui-même a besoin d'accéder à l'hôte et au port de la base de données. À l'aide d'un pont défini par l'utilisateur, seul le port Web doit être ouvert et l'application de base de données n'a pas besoin de ports ouverts, car 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 configuration d'une architecture réseau dans Docker. Ainsi, par exemple, dans un réseau de ponts par défaut, aucun port n'est accessible depuis le monde extérieur. Vous pouvez donc ouvrir un point d'entrée avec des "ports". En utilisant «exposer», vous définissez la communication au sein du réseau. Si vous souhaitez exposer les ports par défaut, vous n'avez pas besoin de définir «exposer» dans votre fichier docker-compose.
expose
dans undocker-compose
? Pour autant que je sache, vous n'avez pas besoin de spécifier exposer pour rendre les ports accessibles aux services liés.