web-dev-qa-db-fra.com

Différence entre les liens et depend_on dans docker_compose.yml

Selon le Docker Compose documentation de composition :

  • depends_on - Dépendance rapide entre services.
  • links - Lien vers les conteneurs d'un autre service et également exprimer la dépendance entre services de la même manière que includes_on .

Je ne comprends pas l’objectif de la liaison à d’autres conteneurs, la différence entre deux options me semble donc assez difficile.

Ce serait beaucoup plus facile s'il y avait un exemple, mais je n'en trouve aucun.

J'ai remarqué que, lorsque je relie le conteneur B au conteneur A, celui-ci sera "pingable" à l'intérieur de la coque du conteneur A.

J'ai exécuté ping B à l'intérieur du bash du conteneur A et j'ai obtenu le résultat suivant (juste pour référence, image tirée d'Internet)

enter image description here

235
itsjef

La publication nécessite une mise à jour après que l’option links soit obsolète.

Fondamentalement, links n'est plus nécessaire car son objectif principal, qui consiste à rendre le conteneur accessible par un autre en ajoutant une variable d'environnement, est implicitement inclus avec network. Lorsque les conteneurs sont placés sur le même réseau, ils sont accessibles les uns aux autres en utilisant leur nom de conteneur et un autre alias en tant qu'hôte.

Pour docker run, --link est également obsolète et doit être remplacé par un réseau personnalisé.

docker network create mynet
docker run -d --net mynet --name container1 my_image
docker run -it --net mynet --name container1 another_image

depends_on exprime l'ordre de démarrage (et implicitement l'ordre de tirage des images), ce qui était un bon effet secondaire de links.

55
Siyu

Cette réponse concerne Docker-Composer version 2 et fonctionne également sur version 3

Vous pouvez toujours accéder aux données lorsque vous utilisez depend_on.

Si vous regardez docker docs Docker Compose et Django , vous pouvez toujours accéder à la base de données de la manière suivante:

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

Quelle est la difference entre links et depend_on?

liens:

Lorsque vous créez un conteneur pour une base de données, par exemple:

docker run -d --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -P mysql

docker inspect d54cf8a0fb98 |grep HostPort

Et vous pouvez trouver

"HostPort": "32777"

Cela signifie que vous pouvez connecter la base de données à partir du port 32777 de votre hôte local (3306 dans le conteneur), mais ce port changera à chaque fois que vous redémarrez ou supprimez le conteneur. Vous pouvez donc utiliser des liens pour vous assurer de toujours vous connecter à la base de données et ne pas avoir à savoir de quel port il s'agit.

web:
  links:
   - db

depend_on:

J'ai trouvé un blog sur Nice de Giorgio Ferraris Docker-compose.yml: de V1 à V2

Lorsque docker-compose exécute des fichiers V2, il crée automatiquement un réseau entre tous les conteneurs définis dans le fichier et chaque conteneur peut immédiatement faire référence aux autres en utilisant simplement les noms définis dans le fichier docker-compose.yml.

Et

Donc, nous n’avons plus besoin de liens; des liens ont été utilisés pour établir une communication réseau entre notre conteneur de base de données et notre conteneur de serveur Web, mais cela est déjà fait par docker-compose

Mise à jour

dépend_on

Dépendance express entre services, ce qui a deux effets:

  • docker-compos up va démarrer les services dans l’ordre des dépendances. Dans l'exemple suivant, db et redis seront lancés avant Web.
  • docker-compos up up SERVICE inclura automatiquement les dépendances de SERVICE. Dans l'exemple suivant, docker-compose up web va également créer et démarrer db et redis.

Exemple simple:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

Remarque: depend_on n'attendra pas que les bases de données et redis soient "prêtes" avant de démarrer Web - uniquement jusqu'à ce qu'elles aient été démarrées. Si vous devez attendre qu'un service soit prêt, voir Contrôler l'ordre de démarrage pour en savoir plus sur ce problème et les stratégies pour le résoudre.

176
Windsooon

[Mise à jour sept. 2016]: Cette réponse était destinée au fichier de composition docker v1 (comme le montre l'exemple de fichier de composition ci-dessous). Pour la v2, voir l'autre réponse de @Windsooon.

[Réponse originale]:

C'est assez clair dans la documentation. depends_on décide de la dépendance et de l'ordre de création du conteneur et links non seulement, mais également

Les conteneurs du service lié seront accessibles à un nom d'hôte identique à l'alias ou au nom du service si aucun alias n'a été spécifié.

Par exemple, en supposant que le fichier _docker-compose.yml_ suivant:

_web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest
_

Avec links, le code dans web pourra accéder à la base de données à l'aide de _db:5432_, en supposant que le port 5432 est exposé dans l'image db. Si _depends_on_ était utilisé, cela ne serait pas possible, mais l'ordre de démarrage des conteneurs serait correct.

44
Xiongbing Jin