Verbinden Sie zwei Docker -Container, die ihre eigenen Docker Compose -Dateien haben
Der Provider-Container erstellt ein Docker -Netzwerk, das von einem Consumer-Container verwendet werden kann.
Ich wollte ein Netzwerk zwischen einem Datenbank Docker -Container und einem Anwendungs Docker -Container erstellen, die beide ihre eigenen Docker Compose -Dateien haben. Und ich wollte auch sichergehen, dass ich es richtig mache, bevor ich es in den eigentlichen docker-compose -Dateien implementiere. Test first baby ...
Ich habe das auch schon vor einiger Zeit gemacht, musste mir das aber noch einmal ansehen, weil Docker Compose jetzt eine Namensoption im Abschnitt Netzwerke hat. Ich schreibe diesen Beitrag, um zu dokumentieren, wie ich es gemacht habe, und hoffe, Sie finden ihn auch nützlich.
Zwei Container und Befehle zum Testen
In diesem Setup verwende ich zwei Container:
- container#1: der Datenbank-Container
- container#2: der Anwendungscontainer
Ein nettes Tool, um mit Containern und Netzwerken zu spielen, ist das Image Busybox . Es ist klein und enthält eine Menge an Netzwerkbefehlen.
Datenbank-Container
Der Datenbank-Container (der Provider) sollte einen Deamon enthalten, der auf eingehende Verbindungen lauscht. Im Anwendungscontainer (dem Consumer) führen wir ein Programm aus, das den Deamon im Datenbankcontainer aufruft.
Für das Lauschen (ein tatsächlicher Datenbank-Deamon lauscht) habe ich zunächst den offensichtlichen Befehl netcat ausprobiert, z. B. beim Lauschen auf Port 1234:
nc -l -p 1234
Aber es zeigte sich, dass netcat abbrach, wenn die Verbindung geschlossen wurde (durch telnet), und dies beendete den Container. Netcat hat auch eine '-k' persistent Option, aber das hat nicht funktioniert, es ist ein bekanntes Problem. Es scheint eine bessere Version namens ncat zu geben, aber die ist im Image Busybox nicht verfügbar.
Deshalb verwende ich den Befehl httpd :
httpd -f -v -p 1234
Zusammenfassung, im Datenbankcontainer verwenden wir httpd als Listening Service.
Anwendungs-Container
Leider ist curl im Busybox -Image nicht verfügbar und das wget -Kommando in Busybox unterstützt keine anderen Ports als 80. Deshalb verwende ich telnet im Anwendungscontainer, um mich mit dem httpd -Server zu verbinden.
Schließlich verwende ich netstat, um die lauschenden Ports in den Containern zu überprüfen.
Die beiden docker-compose -Dateien
Die Datenbank docker-compose -Datei, db.yml
Im Datenbankcontainer legen wir das Netzwerk 'postgres12_network' an.
# db.yml
version: '3.7'
services:
postgres12:
image: busybox
container_name: postgres12_container
command: /bin/httpd -f -v -p 1234
networks:
- default
networks:
default:
name: postgres12_network
In der Anwendung die Datei ' docker-compose ', ' app.yml'.
Im Anwendungscontainer konsumieren wir das Netzwerk 'postgres12_network'.
# app.yml
version: '3.7'
services:
app:
image: busybox
container_name: app_container
command: sleep infinity
networks:
- default
- postgres
networks:
postgres:
external:
name: postgres12_network
Testen des Datenbank-Containers
Seien Sie darauf vorbereitet, dass wir hier viele Terminalfenster verwenden.
Öffnen Sie ein Terminalfenster und starten Sie den Datenbankcontainer:
docker-compose -f db.yml up
Um zu prüfen, ob der Container läuft, öffnen Sie ein weiteres Terminalfenster und geben Sie ein:
docker ps
Ergebnis:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ab28dc6d47b busybox "/bin/httpd -f -v -p…" 19 minutes ago Up 19 minutes postgres12_container
Um zu prüfen, ob das Netzwerk Docker angelegt ist, geben Sie ein:
docker network ls
Ergebnis:
NETWORK ID NAME DRIVER SCOPE
539decc283dd postgres12_network bridge local
In einem dritten Terminalfenster betreten wir mit exec den Datenbank-Container und starten eine Shell-Sitzung (sh) :
docker-compose -f db.yml exec postgres12 /bin/sh
Prüfen Sie, ob der Deamon httpd auf Port 1234 lauscht:
netstat -l -t
Ergebnis:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:41825 0.0.0.0:* LISTEN
tcp 0 0 :::1234 :::* LISTEN
Verbinden Sie sich nun mit dem Deamon httpd :
telnet postgres12 1234
Ergebnis:
Connected to postgres12
Drücken Sie in telnet <ENTER> oder geben Sie etwas anderes ein und drücken Sie <ENTER>.
Ergebnis:
HTTP/1.1 408 Request Timeout
Date: Wed, 26 May 2021 11:42:22 GMT
Connection: close
Content-type: text/html
<HTML><HEAD><TITLE>408 Request Timeout</TITLE></HEAD>
<BODY><H1>408 Request Timeout</H1>
No request appeared within 60 seconds
</BODY></HTML>
Connection closed by foreign host
Es sieht vielleicht schlecht aus, aber es sieht tatsächlich gut aus, wir haben eine Antwort vom Deamon httpd erhalten!
Im ersten Terminalfenster sollte eine Meldung wie diese erscheinen:
postgres12_container | [::ffff:192.168.48.2]:33264: response:400
Wenn Sie telnet mit einem anderen Port versuchen, wird die Meldung lauten:
telnet: can't connect to remote host (192.168.48.2): Connection refused
So weit so gut, machen wir weiter mit dem Applikationscontainer.
Testen des Applikationscontainers
Öffnen Sie ein Terminalfenster und starten Sie den Applikationscontainer:
docker-compose -f app.yml up
Prüfen Sie in einem anderen Terminalfenster, ob der Container läuft, geben Sie ein:
docker ps
Ergebnis:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9df4c69b8772 busybox "sleep infinity" 58 seconds ago Up 57 seconds app_container
4ab28dc6d47b busybox "/bin/httpd -f -v -p…" 42 minutes ago Up 42 minutes postgres12_container
Beide Container sind jetzt hochgefahren und laufen.
In einem weiteren Terminalfenster betreten wir den Anwendungscontainer mit exec und starten eine Shell (sh) -Sitzung:
docker-compose -f app.yml exec app /bin/sh
Prüfen Sie, ob wir uns mit dem Deamon httpd im Datenbank-Container verbinden können:
telnet postgres12 1234
Ergebnis:
Connected to postgres12
Das ist gut, alles funktioniert wie erwartet.
Zusammenfassung
Es ist lustig (NICHT), dass die Frage + , wie man zwei Docker -Container verbindet, eine riesige Anzahl von Stimmen auf Stack Overflow hat, siehe Links unten. Ich denke, die Dokumentation auf der Docker -Webseite hat sich sehr verbessert, aber sie braucht mehr (triviale) Beispiele. Die Option 'name' im Abschnitt networks macht es einfacher, Netzwerke zu definieren und zu lesen, was in einer docker-compose -Datei vor sich geht.
Schließlich ist Busybox ein kleines Image, aber auch sehr begrenzt. Es wäre schön, wenn mehr Netzwerkbefehle hinzugefügt würden.
Links / Impressum
BusyBox - The Swiss Army Knife of Embedded Linux
https://www.busybox.net/downloads/BusyBox.html
Communication between multiple docker-compose projects
https://stackoverflow.com/questions/38088279/communication-between-multiple-docker-compose-projects/38089080#38089080
netcat - keep listening for connection in Debian
https://superuser.com/questions/1008348/netcat-keep-listening-for-connection-in-debian
Networking in Compose
https://docs.docker.com/compose/networking/
Mehr erfahren
Docker Docker-compose
Neueste
- Ausblenden der Primärschlüssel der Datenbank UUID Ihrer Webanwendung
- Don't Repeat Yourself (DRY) mit Jinja2
- SQLAlchemy, PostgreSQL, maximale Anzahl von Zeilen pro user
- Anzeige der Werte in den dynamischen Filtern SQLAlchemy
- Sichere Datenübertragung mit Public Key Verschlüsselung und pyNaCl
- rqlite: eine hochverfügbare und distverteilte SQLite -Alternative
Meistgesehen
- Verwendung von Pythons pyOpenSSL zur Überprüfung von SSL-Zertifikaten, die von einem Host heruntergeladen wurden
- Verwendung von UUIDs anstelle von Integer Autoincrement Primary Keys mit SQLAlchemy und MariaDb
- Verbindung zu einem Dienst auf einem Docker -Host von einem Docker -Container aus
- PyInstaller und Cython verwenden, um eine ausführbare Python-Datei zu erstellen
- SQLAlchemy: Verwendung von Cascade Deletes zum Löschen verwandter Objekte
- Flask RESTful API Validierung von Anfrageparametern mit Marshmallow-Schemas