Différence entre les liens et dépend de dans Docker compose.yml

Selon la documentation du Docker Compose compose-file :

  • depends_on - dépendance Express entre les services.
  • links - Lien vers des conteneurs dans un autre service et aussi exprimer la dépendance entre les services de la même manière que depends_on .

Je ne comprends pas le but de lier à d'autres conteneurs, donc la différence entre deux options me semble encore assez difficile.

Ce serait beaucoup plus facile s'il y avait est un exemple, mais je ne peux pas en trouver.

J'ai remarqué que lorsque je lie le conteneur B au conteneur a, le conteneur B sera "pingable" à l'intérieur du shell du conteneur A.

J'ai couru ping B à l'intérieur du conteneur a bash et j'ai obtenu un résultat comme celui-ci (juste pour référence, image d'Internet)

entrez la description de l'image ici

160
demandé sur halfer 2016-03-06 23:24:13

2 réponses

Cette réponse est pour docker-composer version 2 et il fonctionne aussi sur version 3

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

Si vous regardez Docker docs Docker Compose et Django, Vous pouvez toujours accéder à la base de données comme ceci:

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 différence entre les liens et depends_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 peut trouver

"HostPort": "32777"

Cela signifie que vous pouvez connecter la base de données à partir de votre port localhost 32777 (3306 dans le conteneur) mais ce port changera chaque fois que vous redémarrez ou supprimez le conteneur. Ainsi, vous pouvez utiliser des liens pour vous assurer que vous vous connecterez toujours à la base de données et que vous n'avez pas besoin de savoir de quel port il s'agit.

web:
  links:
   - db

Depends_on:

J'ai trouvé un joli blog de Giorgio Ferraris docker-compose.yml: de V1 à V2

Quand docker-compose exécute les fichiers V2, il construira automatiquement un réseau entre tous les conteneurs définis dans le fichier, et chaque conteneur sera immédiatement en mesure de se référer aux autres en utilisant simplement les noms définis dans le docker-compose.fichier yml.

Et

Nous n'avons donc plus besoin de liens; les liens ont été utilisés pour démarrer une communication réseau entre notre conteneur db et notre conteneur serveur web, mais cela est déjà fait par docker-composer

Mise à jour

Depends_on

Exprimer la dépendance entre les services, ce qui a deux effets:

  • docker-composez le début des services dans l'ordre des dépendances. Dans l'exemple suivant, db et redis seront démarrés avant web.
  • docker-compose le SERVICE inclura automatiquement les dépendances du SERVICE. Dans l'exemple suivant, docker-compose up web créera et démarrera également db et redis.

Simple exemple:

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

Note: depends_on n'attendra pas que db et redis soient "prêts" avant de démarrer web-only jusqu'à ce qu'ils aient été démarrés. Si vous devez attendre qu'un service soit prêt, consultez Contrôle de l'ordre de démarrage pour en savoir plus sur ce problème et les stratégies pour le résoudre.

133
répondu Windsooon 2017-08-17 10:19:24

[Update Sep 2016]: cette réponse était destinée à Docker compose file v1 (comme indiqué par l'exemple de fichier de composition ci-dessous). Pour v2, voir l'autre réponse par @ Windsooon.

[réponse originale]:

C'est assez clair dans la documentation. depends_on qui décide de la dépendance et de l'ordre de création des conteneurs et links non seulement cela, mais aussi

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

Par exemple, en supposant 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 à l'intérieur de web pourra accéder à la base de données en utilisant db:5432, en supposant que le port 5432 est exposé dans l'image db. Si depends_on étaient utilisés, cela ne serait pas possible, mais l'ordre de démarrage des conteneurs serait correct.

42
répondu Xiongbing Jin 2016-09-23 13:35:32