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

292

Selon le Docker Compose la documentation Compose-file :

  • depends_on - Dépendance express entre services.
  • links- Lien vers des conteneurs dans un autre service et exprime également la dépendance entre les services de la même manière que depend_on .

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

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

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

J'ai couru à l' ping Bintérieur du conteneur A bashet j'ai obtenu un résultat comme celui-ci (juste pour référence, image provenant d'Internet)

entrez la description de l'image ici

itsjef
la source
6
L' --linkindicateur est désormais une fonctionnalité héritée obsolète de Docker et la documentation suggère "Il peut éventuellement être supprimé" Docker: Liens de conteneur hérités . Il est conseillé de ne pas utiliser la fonction de réseaux Docker ou la méthode de composition Docker . Je pensais que cela serait utile à quiconque ici se renseignerait sur cette fonctionnalité.
Une étoile du

Réponses:

122

La publication a besoin d'une mise à jour après que l' linksoption est obsolète.

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

Pour docker run, --linkest également déconseillé 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_onexprime l'ordre de départ (et implicitement l'image de tirage), ce qui était un bon effet secondaire de links.

Siyu
la source
13
StackOverflow commun, pourquoi dois-je faire défiler les réponses en dessous de 147 et 43 points pour trouver une réponse en 1 point qui est en fait la meilleure.
u8it
3
@ u8it C'est la nature du temps et d'Internet.
Michael Cole
Comment faire la même chose dans docker-compose? Je pense qu'avec docker compose tous les services sont déjà sur le même réseau et il n'est pas nécessaire d'ajouter quoi que ce soit. La liaison entre les conteneurs ne fonctionne toujours pas si l'un des conteneurs tente de se connecter à un conteneur qui n'est pas à l'état Prêt.
makkasi
Je ne peux pas voir d'informations sur les liens dépréciés dans les documents Docker -compose version 3: docs.docker.com/compose/compose-file/#links . Je ne vois pas l'option trop utile, car nous avons des réseaux partagés et depend_on, mais elle n'est pas déconseillée si je lis les documents correctement (ils mentionnent uniquement --link flag sur le conteneur docker).
rideronthestorm
Remarque: les conteneurs (en fait des services) dans le même réseau sont accessibles par nom de service et non par nom de conteneur. Documentation officielle: docs.docker.com/compose/networking/#links
GarryOne
194

Cette réponse est pour la version 2 de docker-compose et elle fonctionne également sur la version 3

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

Si vous regardez les documents Docker 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 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 trouverez peut-être

"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 change à chaque redémarrage ou suppression du 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

dépend de:

J'ai trouvé un joli blog 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 pourra immédiatement se référer aux autres en utilisant simplement les noms définis dans le fichier docker-compose.yml.

Et

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

Mettre à jour

dépend de

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

  • docker-compose updémarrera les services dans l'ordre de dépendance. Dans l'exemple suivant, db et redis seront démarrés avant Web.
  • docker-compose up SERVICEinclura automatiquement les dépendances de SERVICE. Dans l'exemple suivant, docker-compose up web créera et démarrera également 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 db et redis soient «prêts» avant de démarrer Web - uniquement jusqu'à ce qu'ils aient été démarrés. Si vous devez attendre qu'un service soit prêt, voir Contrôle de l'ordre de démarrage pour plus d'informations sur ce problème et les stratégies pour le résoudre.

Windsooon
la source
J'ai mis à jour ma réponse pour préciser qu'elle était destinée au fichier de composition v1.
Xiongbing Jin
1
Est-ce toujours valable pour la version 3?
fabiomaia
Oui, vous pouvez voirhttps://docs.docker.com/compose/compose-file/compose-versioning/
Windsooon
"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émarrerez ou supprimerez le conteneur" pas si vous spécifiez la liaison de port dans le fichier docker-compose-file, il ne sera pas . Et puisque cette question concerne spécifiquement la composition de docker, je pense que l'exemple avec docker runici est complètement hors de propos, ce n'est pas de cette façon que le conteneur sera exécuté de toute façon. Qu'est-ce que je rate?
Andrew Savinykh
Oui, vous avez raison si vous spécifiez le port. Mon docker run exemple veut montrer pourquoi nous devons utiliser depend_on ou links au lieu de coder en dur un numéro de port.juste parce que si vous ne le spécifiez pas, il change à chaque fois. Je pense que cela permettra aux gens de mieux comprendre le depend_on ou les liens.
Windsooon
50

[Mise à jour septembre 2016]: Cette réponse était destinée au fichier de composition Docker v1 (comme illustré par 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_ondécide de la dépendance et de l'ordre de création des conteneurs et linksnon seulement ceux-ci, mais aussi

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 le docker-compose.ymlfichier 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 webpourra accéder à la base de données en utilisant db:5432, en supposant que le port 5432 est exposé dans l' dbimage. Si elles depends_onétaient utilisées, cela ne serait pas possible, mais l'ordre de démarrage des conteneurs serait correct.

Xiongbing Jin
la source
Peux-tu me donner un exemple? Parce que c'est ce dont je ne suis toujours pas sûr. Il existe peut-être d'autres options de composition de fichier qui peuvent le rendre plus spécifique. Veuillez fournir plus de détails. Merci!
itsjef
Merci beaucoup! J? ai compris. Une dernière question, s'il vous plaît. Donc, dans mon cas particulier, je déploie mon application rails, dois-je utiliser linksou l'un depends_onou l'autre est ok? Mes docker-compose.ymlutilisations depends_onet choses actuelles semblent bien fonctionner. :)
itsjef
Si vous n'avez pas besoin d'accéder directement à l'autre conteneur par l' intermédiaire name:portpuis depends_onest ok.
Xiongbing Jin
9
name: le port fonctionne même sans lien lorsque vous utilisez expose:
Amit Goldstein
7
"Si depend_on était utilisé, cela ne serait pas possible, mais l'ordre de démarrage des conteneurs serait correct.". Ce n'est pas correct. Cela fonctionnerait si vous utilisez simplement depend_on. Vous pouvez toujours accéder à votre dbdans le webnom d'hôte des bases de données.
prog.Dusan