angle-uparrow-clockwisearrow-counterclockwisearrow-down-uparrow-leftatcalendarcard-listchatcheckenvelopefolderhouseinfo-circlepencilpeoplepersonperson-fillperson-plusphoneplusquestion-circlesearchtagtrashx

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.

26 Mai 2021
In Docker
post main image
Image by Pixabay

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/

Einen Kommentar hinterlassen

Kommentieren Sie anonym oder melden Sie sich zum Kommentieren an.

Kommentare

Eine Antwort hinterlassen

Antworten Sie anonym oder melden Sie sich an, um zu antworten.