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
version: "2"
services:
webserver:
image: "moodlehq/moodle-php-apache:7.1
depends_on:
- db
volumes:
- "/var/www/html:/var/www/html"
- "/home/some_user/web/apache2_faildumps.conf:/etc/apache2/conf-enabled/apache2_faildumps.conf"
environment:
MOODLE_DOCKER_DBTYPE: pgsql
MOODLE_DOCKER_DBNAME: moodle
MOODLE_DOCKER_DBUSER: moodle
MOODLE_DOCKER_DBPASS: "m@0dl3ing"
HTTP_PROXY: "${HTTP_PROXY}"
HTTPS_PROXY: "${HTTPS_PROXY}"
NO_PROXY: "${NO_PROXY}"
db:
image: postgres:9
environment:
POSTGRES_USER: moodle
POSTGRES_PASSWORD: "m@0dl3ing"
POSTGRES_DB: moodle
HTTP_PROXY: "${HTTP_PROXY}"
HTTPS_PROXY: "${HTTPS_PROXY}"
NO_PROXY: "${NO_PROXY}"
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
version: "2"
services:
webserver:
environment:
MOODLE_DOCKER_DBTYPE: oci
MOODLE_DOCKER_DBNAME: XE
db:
image: moodlehq/moodle-db-oracle
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:
docker network create test_network
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:
docker run \
--detach \
--name DB1 \
--network test_network \
-e MYSQL_ROOT_PASSWORD="${DBPASS}" \
-e MYSQL_DATABASE="${DBNAME}" \
-e MYSQL_USER="${DBUSER}" \
-e MYSQL_PASSWORD="${DBPASS}" \
--tmpfs /var/lib/mysql:rw \
mysql:5
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.