27 votes

docker-compose: différence entre réseau et lien

J'apprends le docker. Je vois que ces deux termes me rendent confus. Par exemple, voici un docker-compose qui définit deux services redis et web-app .

 services:
  redis:
    container_name: redis
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      - lognet

  app:
    container_name: web-app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - ".:/webapp"
    links:
      - redis
    networks:
      - lognet

networks:
  lognet:
    driver: bridge
 

Ce fichier docker-compose définit un réseau de pont nommé lognet et tous les services se connecteront à ce réseau. Si je comprends bien, cette action permet à ces services d'en voir d'autres. Alors pourquoi le service d'application doit toujours être lié au service redis dans le cas ci-dessus.

Merci

34voto

BMitch Points 3744

Des liens ont été remplacés par des réseaux. Docker décrit comme un héritage de la fonctionnalité que vous devriez éviter d'utiliser. Vous pouvez supprimer le lien et les deux conteneurs seront en mesure de référer les uns aux autres par leur nom de service (ou container_name).

Avec composer, des liens ont un effet de bord de la création d'un implicite de la dépendance. Vous devez le remplacer par un plus explicite depends_on section, de sorte que l'application ne permet pas de tenter de l'exécuter sans ou avant le redis commence.

En aparté, je ne suis pas un fan de codage en dur container_name sauf si vous êtes certain que c'est le seul conteneur qui existent avec ce nom sur l'ordinateur hôte et vous avez besoin de le consulter à partir du menu fixe de la cli par son nom. Sans le nom de conteneur, docker-composer donnera une moins intuitive nom, mais il va aussi lui donner un alias de redis sur le réseau, ce qui est exactement ce dont vous avez besoin pour un conteneur à l'autre réseau. De sorte que le résultat final avec ces suggestions:

version: '2'
# do not forget the version line, this file syntax is invalid without it

services:
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      - lognet

  app:
    container_name: web-app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - ".:/webapp"
    depends_on:
      - redis
    networks:
      - lognet

networks:
  lognet:
    driver: bridge

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