Ich habe zwei Docker-Container basierend auf zwei verschiedenen Bildern erstellt. eine von db und eine andere für den Webserver. Beide Container laufen auf meinem Mac OSX.
Ich kann vom Host-Computer aus auf den DB-Container zugreifen und auf die gleiche Weise vom Host-Computer aus auf den Webserver zugreifen.
Wie greife ich jedoch vom Webserver auf die Datenbankverbindung zu?
Die Art und Weise, wie ich DB Container gestartet habe, ist
docker run --name oracle-db -p 1521:1521 -p 5501:5500 oracle/database:12.1.0.2-ee
Ich habe wls container als gestartet
docker run --name oracle-wls -p 7001:7001 wls-image:latest
Ich kann auf db auf dem Host zugreifen, indem ich eine Verbindung zu herstelle
sqlplus scott/welcome1@//localhost:1521/ORCLCDB
Ich kann auf wls auf dem Host als zugreifen
http://localhost:7001/console
Antworten:
Am einfachsten ist es, --link zu verwenden. Die neueren Versionen von Docker entfernen sich jedoch davon, und tatsächlich wird dieser Schalter bald entfernt.
Der unten stehende Link bietet auch eine schöne Anleitung zum Verbinden zweier Container. Sie können den Anhangsteil überspringen, da dies nur eine nützliche Anleitung zum Hinzufügen von Elementen zu Bildern ist.
https://deis.com/blog/2016/connecting-docker-containers-1/
Der Teil, an dem Sie interessiert sind, ist die Kommunikation zwischen zwei Containern. Am einfachsten ist es, den Webserver-Container namentlich aus dem Webserver-Container zu referenzieren.
Beispiel:
Sie haben den Datenbankcontainer DB1 und den Webservercontainer WEB0 benannt. Die Container sollten sich beide im Brückennetzwerk befinden. Dies bedeutet, dass der Webcontainer unter Bezugnahme auf seinen Namen eine Verbindung zum DB-Container herstellen kann.
Wenn Sie also eine Webkonfigurationsdatei für Ihre App haben, verwenden Sie für den DB-Host den Namen DB1.
Wenn Sie eine ältere Version von Docker verwenden, sollten Sie --link verwenden.
Beispiel:
Schritt 1:
docker run --name db1 oracle/database:12.1.0.2-ee
dann, wenn Sie die Web-App starten. verwenden:
Schritt 2:
docker run --name web0 --link db1 webapp/webapp:3.0
und die Web-App wird mit der DB verknüpft. Wie gesagt, der --link-Schalter wird jedoch bald entfernt.
Ich würde stattdessen Docker Compose verwenden, um ein Netzwerk für Sie aufzubauen. Jedoch; Sie müssen Docker Compose für Ihr System herunterladen. https://docs.docker.com/compose/install/#prerequisites
Ein Beispiel-Setup sieht folgendermaßen aus:
Dateiname ist
base.yml
Dadurch wird dem Netzwerk ein generischer Name zugewiesen. Ich kann mich nicht genau erinnern, wie dieser Name lautet, es sei denn, Sie verwenden den Schalter --name.
IE
docker-compose --name setup1 up base.yml
HINWEIS: Wenn Sie den Schalter --name verwenden, müssen Sie ihn verwenden, wenn Sie Docker Compose aufrufen. Auf
docker-compose --name setup1 down
diese Weise können Sie mehr als eine Instanz von Webserver und DB haben. In diesem Fall weiß Docker Compose, welche Instanz Sie möchten Befehle ausführen; und so können Sie mehr als eine gleichzeitig laufen lassen. Ideal für CI / CD, wenn Sie den Test parallel auf demselben Server ausführen.Docker Compose hat also auch die gleichen Befehle wie Docker
docker-compose --name setup1 exec webserver do_some_command
Das Beste daran ist, wenn Sie DBs oder ähnliches für den Komponententest ändern möchten, können Sie dem Befehl up eine zusätzliche .yml-Datei hinzufügen, die alle Elemente mit ähnlichen Namen überschreibt. Ich halte dies für einen Schlüssel => Wertersatz .
Beispiel:
db.yml
Dann ruf an
docker-compose --name setup1 up base.yml db.yml
Dadurch wird die Datenbank überschrieben. mit einem anderen Setup. Wenn Sie von jedem Container aus eine Verbindung zu diesen Diensten herstellen müssen, verwenden Sie den unter Dienst festgelegten Namen, in diesem Fall Webserver und Datenbank.
Ich denke, dies könnte in Ihrem Fall tatsächlich ein nützlicheres Setup sein. Da Sie alle benötigten Variablen in den yml-Dateien festlegen und einfach den Befehl für Docker Compose ausführen können, wenn Sie sie starten müssen. Also mehr starten und vergessen Sie das Setup.
HINWEIS: Ich habe das nicht verwendet
--port
Befehl, da das Offenlegen der Ports für die Container-> Containerkommunikation nicht erforderlich ist. Dies ist nur erforderlich, wenn der Host eine Verbindung zum Container oder zur Anwendung von außerhalb des Hosts herstellen soll. Wenn Sie den Port verfügbar machen, ist der Port für die gesamte Kommunikation offen, die der Host zulässt. Das Offenlegen von Web auf Port 80 entspricht dem Starten eines Webservers auf dem physischen Host und ermöglicht externe Verbindungen, sofern der Host dies zulässt. Wenn Sie aus irgendeinem Grund mehr als eine Webanwendung gleichzeitig ausführen möchten, können Sie durch das Offenlegen von Port 80 keine zusätzlichen Webanwendungen ausführen, wenn Sie versuchen, auch diesen Port verfügbar zu machen. Für CI / CD ist es daher am besten, Ports überhaupt nicht verfügbar zu machen. Wenn Sie Docker Compose mit dem Schalter --name verwenden, befinden sich alle Container in ihrem eigenen Netzwerk, damit sie nicht kollidieren. Sie werden also so ziemlich einen Container mit Containern haben.UPDATE: Nachdem Sie weitere Funktionen verwendet und gesehen haben, wie andere dies für CICD-Programme wie Jenkins getan haben. Netzwerk ist auch eine praktikable Lösung.
Beispiel:
Mit dem obigen Befehl wird ein "test_network" erstellt, an das Sie auch andere Container anhängen können. Was mit dem
--network
Schalterbediener einfach gemacht wird .Beispiel:
Wenn Sie über Proxy-Netzwerkeinstellungen verfügen, sollten Sie diese natürlich weiterhin mit den switch-Anweisungen "-e" oder "--env-file" an die Container übergeben. So kann der Container mit dem Internet kommunizieren. Laut Docker sollten die Proxy-Einstellungen in den neueren Docker-Versionen vom Container übernommen werden. Ich gebe sie jedoch immer noch als Gewohnheit weiter. Dies ist der Ersatz für den "--link" -Schalter, der weggeht. Sobald die Container mit dem von Ihnen erstellten Netzwerk verbunden sind, können Sie mit dem 'Namen' des Containers weiterhin auf diese Container aus anderen Containern verweisen. Nach dem obigen Beispiel wäre das DB1. Sie müssen nur sicherstellen, dass alle Container mit demselben Netzwerk verbunden sind, und schon kann es losgehen.
Ein detailliertes Beispiel für die Verwendung des Netzwerks in einer Cicd-Pipeline finden Sie unter folgendem Link: https://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh
Welches ist das Skript, das in Jenkins für einen großen Integrationstest für Moodle ausgeführt wird, aber die Idee / das Beispiel kann überall verwendet werden. Ich hoffe das hilft anderen.
quelle
psql -U {USER} -h database -p 5432 {DATABASE}
Es ist einfach. Wenn Sie zwei oder mehr laufende Container haben, führen Sie die folgenden Schritte aus:
Jetzt verbinden Sie sich von web1 zu web2 Container oder umgekehrt.
Verwenden Sie die internen Netzwerk-IP-Adressen, die Sie finden können, indem Sie Folgendes ausführen:
Beachten Sie, dass nur interne IP-Adressen und Ports für die über die Netzwerkbrücke verbundenen Container zugänglich sind.
Angenommen, der web1-Container wurde gestartet mit:
docker run -p 80:8888 web1
(was bedeutet, dass sein Server intern auf Port 8888 ausgeführt wird), und die ÜberprüfungmyNetwork
zeigt, dass die IP von web1 172.0.0.2 lautet, können Sie mithilfe von web2 eine Verbindung zu web1 herstellencurl 172.0.0.2:8888
.quelle
web1
) als Hostnamen.Sie müssen über die IP-Adresse des Host-Computers auf db zugreifen. Wenn Sie über localhost: 1521 darauf zugreifen möchten, führen Sie den Webserver wie folgt aus:
Siehe hier
quelle
-p 7001:7001
, da alle Container den Netzwerkstapel des Hosts selbst verwenden.Bei Verwendung
docker-compose
werden Dienste standardmäßig standardmäßig einander ausgesetzt. Docs .Sie können auch einen Alias wie angeben.
Und dann Zugriff auf den Service angegebenen Alias als Hostnamen verwenden, zB
mongo.openconceptlab.org
fürmongo
in diesem Fall.quelle