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)
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.
[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.