Unterschied zwischen links und abhängigen_on in docker_compose.yml

292

Gemäß der Dokumentation der Docker Compose -Zusammenstellungsdatei :

  • depends_on - Expressabhängigkeit zwischen Diensten.
  • links- Verknüpfen Sie Container in einem anderen Dienst und drücken Sie die Abhängigkeit zwischen Diensten auf dieselbe Weise aus wie abhängige_on .

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

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

Ich habe festgestellt, dass Container B in der Hülle von Container A "pingbar" ist, wenn ich Container B mit Container A verbinde.

Ich bin ping Bin Container A gelaufen bashund habe ein Ergebnis wie dieses erhalten (nur als Referenz, Bild aus dem Internet)

Geben Sie hier die Bildbeschreibung ein

itsjef
quelle
6
Das --linkFlag ist jetzt eine veraltete Legacy-Funktion von Docker. In der Dokumentation wird vorgeschlagen, dass Docker: Legacy-Container-Links möglicherweise entfernt werden . Es wird empfohlen, die Docker-Netzwerkfunktion oder die Docker-Erstellungsmethode nicht zu verwenden . Ich dachte, dies wäre für jeden hier hilfreich, der etwas über diese Funktion erfährt.
Ein Stern

Antworten:

122

Der Beitrag muss aktualisiert werden, nachdem die linksOption veraltet ist.

Grundsätzlich wird linkses nicht mehr benötigt, da sein Hauptzweck, Container durch Hinzufügen von Umgebungsvariablen für andere erreichbar zu machen, implizit in enthalten ist network. Wenn Container im selben Netzwerk platziert werden, sind sie unter Verwendung ihres Containernamens und eines anderen Alias ​​als Host für einander erreichbar.

Für docker run, --linkveraltet auch und sollte von einem benutzerdefinierten 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_ondrückt die Startreihenfolge (und implizit die Bildabrufreihenfolge) aus, was ein guter Nebeneffekt von war links.

Siyu
quelle
13
Common StackOverflow, warum muss ich unter 147 und 43 Punkt Antworten nach unten scrollen, um eine 1 Punkt Antwort zu finden, die eigentlich die beste ist.
U8it
3
@ u8it Es liegt in der Natur der Zeit und des Internets.
Michael Cole
Wie mache ich dasselbe in Docker-Compose? Ich denke, dass mit Docker Compose alle Dienste bereits im selben Netzwerk sind und es nicht notwendig ist, etwas hinzuzufügen. Die Verknüpfung zwischen den Containern funktioniert weiterhin nicht, wenn einer der Container versucht, eine Verbindung zu einem Container herzustellen, der sich nicht im Status "Bereit" befindet.
Makkasi
Ich kann keine Informationen zu Links sehen, die in Docker-Compose-Dokumenten der Version 3 veraltet sind: docs.docker.com/compose/compose-file/#links . Ich sehe die Option nicht als zu nützlich an, da wir gemeinsame Netzwerke und abhängige_on haben, aber es ist nicht veraltet, wenn ich die Dokumente richtig lese (sie erwähnen nur das --link-Flag im Docker-Container).
Rideronthestorm
Hinweis: Auf Container (tatsächlich Dienste) im selben Netzwerk kann über den Dienstnamen und nicht über den Containernamen zugegriffen werden. Offizielle Dokumentation: docs.docker.com/compose/networking/#links
GarryOne
194

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

Sie können weiterhin auf die Daten zugreifen, wenn Sie abhängige_on verwenden.

Wenn Sie sich die Docker-Dokumente Docker Compose und Django ansehen , können Sie weiterhin 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 Depends_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 jedes Mal, wenn Sie den Container neu starten oder entfernen. Sie können also Links verwenden, um sicherzustellen, dass Sie immer eine Verbindung zur Datenbank herstellen und nicht wissen müssen, um welchen Port es sich handelt.

web:
  links:
   - db

kommt drauf an:

Ich habe einen schönen Blog von Giorgio Ferraris Docker-compose.yml gefunden: von V1 bis V2

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

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

kommt drauf an

Expressabhängigkeit zwischen Diensten, die zwei Auswirkungen hat:

  • docker-compose upstartet Dienste in Abhängigkeitsreihenfolge. Im folgenden Beispiel werden db und redis vor dem Web gestartet.
  • docker-compose up SERVICEschließt automatisch die Abhängigkeiten von SERVICE ein. 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: abhängige_on wartet nicht darauf, dass db und redis "bereit" sind, bevor sie das Web starten - 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 zur Lösung des Problems.

Windsooon
quelle
Ich habe meine Antwort aktualisiert, um zu verdeutlichen, dass die Antwort zum Erstellen der Datei v1 bestimmt war.
Xiongbing Jin
1
Gilt das noch für Version 3?
Fabiomaia
Ja, Sie können einen Blick aufhttps://docs.docker.com/compose/compose-file/compose-versioning/
Windsooon
"Dies bedeutet, dass Sie die Datenbank von Ihrem lokalen Host-Port 32777 (3306 im Container) verbinden können. Dieser Port ändert sich jedoch jedes Mal, wenn Sie den Container neu starten oder entfernen." Nicht, wenn Sie die Portbindung in der Docker-Compose-Datei angeben, wird dies nicht der Fall sein . Und da es bei dieser Frage speziell um Docker-Compose geht, ist das Beispiel docker runhier meines Erachtens völlig irrelevant. So wird der Container sowieso nicht ausgeführt. Was vermisse ich?
Andrew Savinykh
Ja, Sie haben Recht, wenn Sie den Port angeben. In meinem docker run Beispiel möchte ich darauf hinweisen, warum wir abhängige_on oder Links verwenden müssen, anstatt eine Portnummer fest zu codieren. Nur weil sie sich jedes Mal ändert, wenn Sie sie nicht angeben. Ich denke, dies wird es den Leuten ermöglichen, mehr über Abhängigkeiten oder Links zu verstehen.
Windsooon
50

[Update Sep 2016]: Diese Antwort war für die Docker-Erstellungsdatei v1 vorgesehen (wie in der folgenden Beispiel-Erstellungsdatei gezeigt). Für v2 siehe die andere Antwort von @Windsooon.

[Ursprüngliche Antwort]:

Es ist ziemlich klar in der Dokumentation. depends_onentscheidet über die Abhängigkeit und die Reihenfolge der Containererstellung und linkstut dies nicht nur, sondern auch

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

Angenommen, die folgende docker-compose.ymlDatei:

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

db:
  image: postgres:latest

cache:
  image: redis:latest

Mit linkskann der Code webdarin auf die Datenbank zugreifen db:5432, vorausgesetzt, Port 5432 ist im dbImage verfügbar . Wenn depends_onverwendet würde, wäre dies nicht möglich, aber die Startreihenfolge der Container wäre korrekt.

Xiongbing Jin
quelle
Kannst du mir ein Beispiel geben? Weil dieser Teil mir noch unklar ist. Möglicherweise gibt es andere Optionen zum Erstellen von Dateien, die es spezifischer machen. Bitte geben Sie weitere Details an. Vielen Dank!
itsjef
Vielen Dank! Ich habe es verstanden. Eine letzte Frage bitte. Also, in meinem Fall, ich bin die Bereitstellung meiner Rails - Anwendung, soll ich verwenden linksoder depends_onoder einer von ihnen ist in Ordnung? Meine aktuellen docker-compose.ymlVerwendungen depends_onund Dinge scheinen gut zu funktionieren. :)
itsjef
Wenn Sie nicht direkt mit dem anderen Behälter über zugreifen muß name:portdann depends_onist ok.
Xiongbing Jin
9
Name: Port funktioniert auch ohne Verknüpfung, wenn Sie Expose verwenden:
Amit Goldstein
7
"Wenn abhängige_on verwendet würden, wäre dies nicht möglich, aber die Startreihenfolge der Container wäre korrekt." Das ist nicht richtig. Es würde funktionieren, wenn Sie nur abhängige_on verwenden. Sie können weiterhin auf Ihren Hostnamen dbin den webverwendeten Datenbanken zugreifen.
Prog.Dusan