27 votes

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

Je suis en train d'apprendre 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 bridge nommé lognet et tous les services se connecteront à ce réseau. Comme je le comprends, cette action permet à ces services de voir les autres. Alors pourquoi le service app a-t-il encore besoin de se lier au service redis dans le cas ci-dessus.

Merci

34voto

BMitch Points 3744

Les liens ont été remplacés par des réseaux. Docker les décrit comme une fonctionnalité héritée que vous devriez éviter d'utiliser. Vous pouvez supprimer en toute sécurité le lien et les deux conteneurs pourront se référencer mutuellement par leur nom de service (ou container_name).

Avec compose, les liens ont pour effet secondaire de créer une dépendance implicite. Vous devriez remplacer cela par une section plus explicite de depends_on afin que l'application n'essaie pas de s'exécuter sans ou avant le démarrage de redis.

En passant, je ne suis pas fan du codage en dur du container_name à moins que vous soyez certain que c'est le seul conteneur qui existra avec ce nom sur l hôte et que vous avez besoin de vous y référer à partir de la docker CLI par nom. Sans le nom du conteneur, docker-compose lui donnera un nom moins intuitif, mais il lui donnera également un alias de redis sur le réseau, ce qui est exactement ce dont vous avez besoin pour le réseau de conteneurs à conteneur. Donc, le résultat final avec ces suggestions est :

version: '2'
# N'oubliez pas la ligne de version, la syntaxe de ce fichier est invalide sans elle

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