wake-up-neo.com

Unterschied zwischen links und depend_on in docker_compose.yml

Laut Docker Compose Dokumentation zum Verfassen von Dateien :

  • depends_on - Express-Abhängigkeit zwischen Diensten.
  • links - Verknüpfung zu Containern in einem anderen Dienst und Ausdrücken der Abhängigkeit zwischen Diensten auf dieselbe Weise wie abhängig von .

Ich verstehe den Zweck der Verknüpfung mit anderen Containern nicht, daher scheint mir der Unterschied zwischen zwei Optionen immer noch ziemlich schwierig zu sein.

Es wäre viel einfacher, wenn es ein Beispiel gäbe, aber ich kann keines finden.

Wenn ich Container B mit Container A verbinde, ist Container B in der Shell von Container A "pingfähig".

Ich habe ping B im bash von Container A ausgeführt und habe das folgende Ergebnis erhalten (nur als Referenz, Bild aus dem Internet)

enter image description here

235
itsjef

Der Beitrag muss aktualisiert werden, nachdem die Option links veraltet ist.

Grundsätzlich wird links nicht mehr benötigt, da sein Hauptzweck, den Container durch Hinzufügen einer Umgebungsvariablen für andere zugänglich zu machen, implizit in network enthalten ist. Container, die sich im selben Netzwerk befinden, sind untereinander über ihren Containernamen und einen anderen Alias ​​als Host erreichbar.

Bei docker run ist --link ebenfalls veraltet und sollte durch ein benutzerdefiniertes Netzwerk ersetzt werden.

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

depends_on drückt die Startreihenfolge (und implizit die Abbildungsreihenfolge) aus, was eine gute Nebenwirkung von links war.

55
Siyu

Diese Antwort ist für Docker-Compose Version 2 und funktioniert auch für Version 3

Sie können weiterhin auf die Daten zugreifen, wenn Sie depend_on verwenden.

Wenn Sie sich Docker-Dokumente ansehen Docker Compose und Django , können Sie trotzdem wie folgt auf die Datenbank zugreifen:

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

Was ist der Unterschied zwischen links und depend_on?

Links:

Wenn Sie einen Container für eine Datenbank erstellen, zum Beispiel:

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

docker inspect d54cf8a0fb98 |grep HostPort

Und Sie können finden

"HostPort": "32777"

Dies bedeutet, dass Sie die Datenbank von Ihrem lokalen Host-Port 32777 (3306 im Container) aus verbinden können. Dieser Port ändert sich jedoch bei jedem Neustart oder Entfernen des Containers. Mithilfe von Links können Sie also sicherstellen, dass Sie immer eine Verbindung zur Datenbank herstellen und nicht wissen müssen, um welchen Port es sich handelt.

web:
  links:
   - db

abhängig von:

Ich habe einen netten Blog von Giorgio Ferraris gefunden Docker-compose.yml: von V1 nach V2

Wenn docker-compose V2-Dateien ausführt, wird automatisch ein Netzwerk zwischen allen in der Datei definierten Containern erstellt, und jeder Container kann sofort auf die anderen Container verweisen, indem er nur die in der Datei docker-compose.yml definierten Namen verwendet.

Und

Wir brauchen also keine Links mehr. Links wurden verwendet, um eine Netzwerkkommunikation zwischen unserem Datenbankcontainer und unserem Webservercontainer zu starten, dies wird jedoch bereits von docker-compose durchgeführt

Aktualisieren

abhängig von

Express-Abhängigkeit zwischen Diensten, die zwei Auswirkungen hat:

  • docker-compose up startet die Dienste in Abhängigkeitsreihenfolge. Im folgenden Beispiel werden db und redis vor dem Web gestartet.
  • docker-Compose-Up-Service berücksichtigt automatisch die Abhängigkeiten von Service. Im folgenden Beispiel erstellt und startet docker-compose up web auch db und redis.

Einfaches Beispiel:

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

Hinweis: depend_on wartet nicht, bis db und redis "bereit" sind, bevor das Web gestartet wird - nur bis sie gestartet wurden. Wenn Sie warten müssen, bis ein Dienst bereit ist, finden Sie unter Steuern der Startreihenfolge weitere Informationen zu diesem Problem und Strategien zu seiner Lösung.

176
Windsooon

[Update September 2016]: Diese Antwort war für die Docker-Erstellungsdatei v1 bestimmt (wie in der folgenden Beispielerstellungsdatei gezeigt). Informationen zu Version 2 finden Sie in der anderen Antwort von @Windsooon.

[Ursprüngliche Antwort]:

Es ist ziemlich klar in der Dokumentation. depends_on entscheidet über die Abhängigkeit und die Reihenfolge der Containererstellung und links macht nicht nur diese, sondern auch

Container für den verknüpften Dienst sind über einen Hostnamen erreichbar, der mit dem Aliasnamen identisch ist, oder über den Dienstnamen, wenn kein Alias ​​angegeben wurde.

Angenommen, die folgende _docker-compose.yml_ -Datei:

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

db:
  image: postgres:latest

cache:
  image: redis:latest
_

Mit links kann Code in web mit _db:5432_ auf die Datenbank zugreifen, sofern Port 5432 im db-Image verfügbar ist. Wenn _depends_on_ verwendet würde, wäre dies nicht möglich, aber die Startreihenfolge der Container wäre korrekt.

44
Xiongbing Jin