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)
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.
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
Express-Abhängigkeit zwischen Diensten, die zwei Auswirkungen hat:
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.
[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.