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)
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
.
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
Dépendance express entre services, ce qui a deux effets:
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.
[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.