Différence entre Expose et Ports dans Docker

Isaac Tony 21 mai 2022
  1. l’instruction DockerFile EXPOSE dans Docker
  2. les ports de composition Docker
Différence entre Expose et Ports dans Docker

Dans Docker, après avoir créé un conteneur à l’aide du docker create ou du docker run, nous pouvons souhaiter que notre conteneur interagisse avec des services externes ou d’autres conteneurs externes. Nous devons rendre les ports accessibles au monde extérieur pour y parvenir.

Dans cet article, nous présenterons deux méthodes importantes que nous pouvons utiliser pour exposer les ports dans Docker. Nous discuterons également de la manière dont nous pouvons mapper le port de conteneur sur un port hôte et des différences dans les méthodes.

l’instruction DockerFile EXPOSE dans Docker

Un fichier docker est simplement un fichier texte qui spécifie des instructions pour assembler une image à l’aide de la commande docker build. Parmi celles-ci se trouve l’instruction EXPOSE.

L’instruction EXPOSE est utilisée pour informer Docker que le conteneur que nous construisons doit écouter sur un port réseau particulier lors de l’exécution. Cependant, notez que cette instruction n’est qu’un point de référence et ne mappe pas le port de conteneur au port hôte.

Syntaxe:

EXPOSE <port>/<protocol>

Nous n’avons pas besoin de spécifier le protocole puisque Docker peut utiliser le protocole TCP par défaut. Cependant, nous pouvons fournir d’autres protocoles, tels que le protocole UDP.

Le Docker utilisera le protocole TCP par défaut car le protocole n’est pas spécifié dans le fichier docker officiel de Nginx.

COPY docker-entrypoint.sh /
COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d
COPY 20-envsubst-on-templates.sh /docker-entrypoint.d
COPY 30-tune-worker-processes.sh /docker-entrypoint.d
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 80
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]

Supposons que nous extrayons l’image Nginx officielle du registre Docker, créons un conteneur et exécutons le conteneur. Dans ce cas, nous pouvons rapidement déterminer certaines informations utiles à partir du conteneur, telles que le numéro de port et le protocole utilisé.

~/isaac$ docker ps -a

Production:

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
99edfdea0443   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 2 minutes   80/tcp    nice_volhard

La sortie ci-dessus montre que le conteneur Nginx s’exécute sur le port 80 comme indiqué dans le Dockerfile et le protocole TCP.

Alternativement, nous pouvons également exposer un port lors de l’exécution en utilisant la balise --expose lors de la création du conteneur, comme indiqué ci-dessous.

docker run --expose 80 nginx

Maintenant, liez ce port au numéro de port de l’hôte. Nous devons utiliser la balise -P majuscule ou la balise -P minuscule.

Bien que nous puissions obtenir les résultats avec l’un ou l’autre, ces balises présentent des différences significatives.

La balise -P majuscule, lorsqu’elle est utilisée lors de l’exécution, nous permet de lier toutes les balises exposées à des ports aléatoires sur l’hôte. Cela nous permet d’éviter les conflits dans les ports.

$ docker run -d -P nginx
006b88a06e51eac45895f13b33a89221676029e8fa654aaaccc79b81f74efb4d

Code:

isaac$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                   NAMES
006b88a06e51   nginx     "/docker-entrypoint.…"   27 seconds ago   Up 6 seconds   0.0.0.0:49153->80/tcp   angry_babbage

Nous pouvons également publier un conteneur sur un port spécifique de l’hôte en utilisant la petite balise -p.

les ports de composition Docker

Docker-compose est un outil utilitaire qui nous permet d’exécuter des applications multi-conteneurs sur Docker.

Sous le fichier docker-compose.yml, nous pouvons spécifier la configuration de nos conteneurs parmi d’autres fichiers, tels que les services, la version du fichier, les volumes utilisés et les réseaux qui connectent les services.

Comme nous avons spécifié les numéros de port dans le Dockerfile, nous devons également spécifier les numéros de port dans le fichier docker-compose.yml. Nous pouvons le faire en utilisant l’instruction expose ou ports.

rabbitmq:
   image: rabbitmq
   expose: 
        - 3000
        - 5000

L’instruction expose nous permet d’exposer les ports sans les publier ni les lier aux ports hôtes, c’est-à-dire que les ports ne sont pas exposés aux machines hôtes, uniquement exposés à d’autres services.

D’autre part, l’instruction ports nous permet de spécifier à la fois les numéros de port de l’hôte et du conteneur. En outre, ces ports seront partagés entre d’autres services et exposés à la machine hôte sur un port aléatoire ou donné.

rabbitmq:
   image: rabbitmq
   ports: 
        - "8000:80"
        - "5000: 70"
Auteur: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn