web-dev-qa-db-fra.com

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

Cette docker-compose Le fichier 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

30
Trần Kim Dự

Les liens ont été remplacés par des réseaux. Docker les décrit comme fonctionnalité héritée que vous devez éviter d'utiliser. Vous pouvez supprimer le lien en toute sécurité et les deux conteneurs pourront se référer l'un à l'autre par leur nom de service (ou nom_conteneur).

Avec la composition, les liens ont pour effet secondaire de créer une dépendance implicite. Vous devez remplacer cela par une section depend_on plus explicite afin que l'application ne tente pas de s'exécuter sans ou avant le démarrage de redis.

En passant, je ne suis pas un fan du codage en dur container_name, sauf si vous êtes certain que c'est le seul conteneur qui existera avec ce nom sur l'hôte et que vous devez vous y référer depuis le docker cli par son 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 la mise en réseau de conteneur à conteneur. Le résultat final avec ces suggestions est donc:

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
44
BMitch