Ich habe zwei separate docker-compose.yml
Dateien in zwei verschiedenen Ordnern:
~/front/docker-compose.yml
~/api/docker-compose.yml
Wie kann ich sicherstellen, dass ein Container in front
Anforderungen an einen Container in senden kann api
?
Ich weiß, dass die --default-gateway
Option docker run
für einen einzelnen Container festgelegt werden kann, sodass diesem Container eine bestimmte IP-Adresse zugewiesen werden kann, aber es scheint, dass diese Option bei Verwendung nicht verfügbar ist docker-compose
.
Momentan mache ich ein docker inspect my_api_container_id
und schaue mir das Gateway in der Ausgabe an. Es funktioniert, aber das Problem ist, dass diese IP zufällig zugewiesen wird, sodass ich mich nicht darauf verlassen kann.
Eine andere Form dieser Frage könnte daher sein:
- Kann ich mit Docker-Compose einem bestimmten Container eine feste IP-Adresse zuweisen?
Aber am Ende kümmere ich mich um:
- Wie können zwei verschiedene Docker-Compose-Projekte miteinander kommunizieren?
quelle
Antworten:
Sie müssen nur sicherstellen, dass sich die Container, mit denen Sie miteinander kommunizieren möchten, im selben Netzwerk befinden. Netzwerke sind ein erstklassiges Docker-Konstrukt und nicht spezifisch für die Erstellung.
...
Sie können dann unter Verwendung des Dienstnamens miteinander sprechen. Von
front
dir aus kannst duping api
und umgekehrt.quelle
name
Eigenschaft einen Namen geben , wodurch das automatische Voranstellen des Projektnamens deaktiviert wird. Dann kann jedes Projekt dieses Netzwerk verwenden und es automatisch erstellen, wenn es noch nicht vorhanden ist.Nur eine kleine Ergänzung zu @ johnharris85s großartiger Antwort: Wenn Sie eine Docker-Compose-Datei ausführen, wird ein "
default
" Netzwerk erstellt, das Sie einfach als externes Netzwerk zur anderen Compose-Datei hinzufügen können:...
Für mich war dieser Ansatz besser geeignet, da ich nicht die erste Docker-Compose-Datei besaß und mit ihr kommunizieren wollte.
quelle
services:
Tags gemanagt, die Sintax wurdenetworks:
dann verschachteltfront_default:
(entfernen Sie das "-") und dann verschachteln wir eine statische IP:ipv4_address: '172.20.0.44'
UPDATE: Ab Compose File Version 3.5:
Das funktioniert jetzt:
docker-compose up -d
tritt einem Netzwerk mit dem Namen 'custom_network' bei. Wenn es nicht existiert, wird es erstellt!Jetzt können Sie dies tun:
Dadurch wird ein Container erstellt, der sich im externen Netzwerk befindet.
Ich kann noch keine Referenz in den Dokumenten finden, aber es funktioniert!
quelle
Alle Container von
api
können mit der folgenden Konfiguration demfront
Standardnetzwerk beitreten :Siehe Docker-Erstellungshandbuch: Verwenden eines bereits vorhandenen Netzwerks (siehe unten)
quelle
Die vorherigen Beitragsinformationen sind korrekt, enthalten jedoch keine Details zum Verknüpfen von Containern, die als "external_links" verbunden werden sollten.
Hoffe, dieses Beispiel macht Ihnen klarer:
Angenommen, Sie haben app1 / docker-compose.yml mit zwei Diensten (svc11 und svc12) und app2 / docker-compose.yml mit zwei weiteren Diensten (svc21 und svc22) und müssen eine gekreuzte Verbindung herstellen:
svc11 muss eine Verbindung zum Container von svc22 herstellen
Die Konfiguration sollte also folgendermaßen aussehen:
Dies ist app1 / docker-compose.yml:
Dies ist app2 / docker-compose.yml:
quelle
Seit Compose 1.18 (Spezifikation 3.5) können Sie das Standardnetzwerk einfach mit Ihrem eigenen Namen für alle benötigten Compose YAML-Dateien überschreiben. Es ist so einfach, wie Folgendes an sie anzuhängen:
Andere Antworten haben dasselbe gezeigt; Dies ist eine vereinfachte Zusammenfassung.
quelle
Ich würde sicherstellen, dass alle Container
docker-compose
zum selben Netzwerk gehören, indem ich sie zur gleichen Zeit zusammensetze, indem ich Folgendes verwende:quelle
link
oderdepends_on
von einem Container vorne zu einem Container api zu machen?build path ~/front/api either does not exist or is not accessible
oder umgekehrt,build path ~/api/front either does not exist or is not accessible
UPDATE: Ab Compose File Version 3.5:
Ich bin auf ein ähnliches Problem gestoßen und habe es gelöst, indem ich eine kleine Änderung in einem meiner docker-compose.yml-Projekte hinzugefügt habe.
Zum Beispiel haben wir zwei APIs
scoring
undner
.Scoring
Die API muss eine Anfrage an diener
API senden, um die Eingabeanforderung zu verarbeiten. Zu diesem Zweck müssen beide dasselbe Netzwerk gemeinsam nutzen.Hinweis: Jeder Container verfügt über ein eigenes Netzwerk, das zum Zeitpunkt der Ausführung der App im Docker automatisch erstellt wird. Zum Beispiel wird ner API-Netzwerk wie erstellt
ner_default
und das Scoring-API-Netzwerk wird als benanntscoring default
. Diese Lösung funktioniert für Version: '3'.Wie im obigen Szenario möchte meine Scoring-API mit ner API kommunizieren, dann füge ich die folgenden Zeilen hinzu. Das heißt, wenn ich den Container für ner api erstelle, wird er automatisch zum Scoring_Default-Netzwerk hinzugefügt.
ner / docker-compose.yml
Scoring / Docker-Compose.yml
Wir können sehen, wie die oben genannten Container jetzt Teil desselben Netzwerks sind, das
scoring_default
mit dem folgenden Befehl aufgerufen wird:quelle
Sie können
.env
allen Ihren Projekten eine Datei hinzufügen, die Folgendes enthältCOMPOSE_PROJECT_NAME=somename
.COMPOSE_PROJECT_NAME überschreibt das Präfix, das zum Benennen von Ressourcen verwendet wird. Daher werden alle Ihre Projekte
somename_default
als Netzwerk verwendet, sodass Dienste wie im selben Projekt miteinander kommunizieren können.NB: Sie erhalten Warnungen für "verwaiste" Container, die aus anderen Projekten erstellt wurden.
quelle
quelle
zweite docker-compose.yml
quelle
Eine andere Option besteht darin, das erste Modul mit dem 'Docker-Compose' hochzufahren, die mit dem Modul verbundene IP zu überprüfen und das zweite Modul wie extern mit dem vorherigen Netz zu verbinden und auf die interne IP zu zeigen
Beispiel App1 - Neues Netzwerk in den Servicezeilen erstellt, unten als extern: true markieren app2 - Das von App1 beim Hochfahren erstellte "neue Netzwerk" angeben, unten als extern: true markieren und in der Konfiguration festlegen Zum Verbinden die IP, die App1 in diesem Netz hat.
Damit sollten Sie in der Lage sein, miteinander zu sprechen
* Dieser Weg ist nur für den Fokus auf lokale Tests gedacht, um keine überkomplexe Konfiguration vorzunehmen. ** Ich weiß, dass dies ein sehr 'Patch-Weg' ist, aber für mich funktioniert und ich denke, dass es so einfach ist, dass andere dies nutzen können
quelle
Wenn du bist
Connection refused
beim Versuch, zwischen zwei Containern zu kommunizierenUnd du willst
api_a
kommunizieren mitapi_b
(oder umgekehrt) ohne dasselbe "Docker-Netzwerk"(Beispiel unten)
Sie können "Host" des zweiten Containers als IP Ihres Computers und Ports verwenden, der im Docker-Container zugeordnet ist. Sie können die IP Ihres Computers mit diesem Skript abrufen (von: Suchen lokaler IP-Adressen mit Pythons stdlib ):
Beispiel:
project_api_a/docker-compose.yml
::Im
api_a
Container wird die Django-App ausgeführt:manage.py runserver 0.0.0.0:8000
und zweite docker-compose.yml aus einem anderen Projekt:
project_api_b/docker-compose-yml
::Im
api_b
Container wird die Django-App ausgeführt:manage.py runserver 0.0.0.0:8001
Und versucht , aus dem Behälter zu verbinden ,
api_a
umapi_b
dann URLapi_b
wird ein Container sein:http://<get_ip_from_script_above>:8001/
Dies kann besonders nützlich sein, wenn Sie mehr als zwei (drei oder mehr) Docker-Compose-Projekte verwenden und es schwierig ist, ein gemeinsames Netzwerk für alle Projekte bereitzustellen - es ist eine gute Problemumgehung und Lösung
quelle