Docker-Container-Verbindung

Zuvor haben wir den Zugriff auf Dienste, die in Docker-Containern laufen, über Netzwerkports implementiert.

Einige Netzwerkanwendungen können in Containern ausgeführt werden. Um externen Zugriff auf diese Anwendungen zu ermöglichen, können Sie den Parameter-Poder-pverwenden, um das Port-Mapping anzugeben.

Nachfolgend implementieren wir die Verbindung zu einem Docker-Container über einen Port.


Netzwerk-Portzuordnung

Wir haben einen Container für eine Python-Anwendung erstellt.

example@example:~$ docker run -d -P training/webapp python app.py
fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d

Darüber hinaus können wir die Netzwerkadresse angeben, an die der Container bindet, wie z. B. 127.0.0.1.

Wir verwenden-P, um die Portnummer zu binden, verwendendocker psSie können sehen, dass Container-Port 5000 an Host-Port 32768 gebunden ist.

example@example:~$ docker ps
CONTAINER ID    IMAGE               COMMAND            ...           PORTS                     NAMES
fce072cc88ce    training/webapp     "python app.py"    ...     0.0.0.0:32768->5000/tcp   grave_hopper

Wir können auch-pdas Flag verwenden, das verwendet wird, um die Bindung des Container-Ports an den Host-Port anzugeben.

Der Unterschied zwischen den beiden Methoden ist:

  • -P:ist der interne Port des Containers,zufälligauf den Port des Hosts abgebildet.
  • -p:ist das Binden des internen Container-Ports anden angegebenenHost-Port.
example@example:~$ docker run -d -p 5000:5000 training/webapp python app.py
33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
example@example:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...           PORTS                     NAMES
33e4523d30aa        training/webapp     "python app.py"   ...   0.0.0.0:5000->5000/tcp    berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...   0.0.0.0:32768->5000/tcp   grave_hopper

Darüber hinaus können wir die Netzwerkadresse angeben, an die der Container bindet, wie z. B. 127.0.0.1.

example@example:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
example@example:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...     PORTS                                NAMES
95c6ceef88ca        training/webapp     "python app.py"   ...  5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...  0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

Auf diese Weise können wir auf den Port 5000 des Containers zugreifen, indem wir 127.0.0.1:5001 besuchen.

In den obigen Beispielen werden TCP-Ports standardmäßig gebunden. Wenn Sie einen UDP-Port binden möchten, können Sie /udp nach dem Port hinzufügen./udp。

example@example:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
example@example:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...   PORTS                                NAMES
6779686f06f6        training/webapp     "python app.py"   ...   5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya
95c6ceef88ca        training/webapp     "python app.py"   ...    5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...     0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

docker portDer Befehl ermöglicht es uns, den Status der Portbindung schnell anzuzeigen.

example@example:~$ docker port adoring_stonebraker 5000
127.0.0.1:5001

Docker-Container-Vernetzung

Port-Mapping ist nicht die einzige Möglichkeit, Docker mit einem anderen Container zu verbinden.

Docker verfügt über ein Verbindungssystem, mit dem mehrere Container miteinander verbunden werden können und Verbindungsinformationen gemeinsam genutzt werden können.

Eine Docker-Verbindung erstellt eine Eltern-Kind-Beziehung, in der der übergeordnete Container die Informationen des untergeordneten Containers sehen kann.


Container-Benennung

Wenn wir einen Container erstellen, benennt Docker ihn automatisch. Außerdem können wir auch --name.--nameBezeichner verwenden, um den Container zu benennen, zum Beispiel:

example@example:~$  docker run -d -P --name example training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

Wir könnendocker psBefehl verwenden, um den Container-Namen anzuzeigen.

example@example:~$ docker ps -l
CONTAINER ID     IMAGE            COMMAND           ...    PORTS                     NAMES
43780a6eabaa     training/webapp   "python app.py"  ...     0.0.0.0:32769->5000/tcp   example

Neues Netzwerk

Erstellen Sie zunächst unten ein neues Docker-Netzwerk.
$ docker network create -d bridge test-net

Parameter description:

-dDer Parameter gibt den Docker-Netzwerktyp an, mit bridge und overlay.

Von ihnen wird der overlay-Netzwerktyp für den Swarm-Modus verwendet; in diesem Abschnitt können Sie ihn ignorieren.

Container verbinden

Führen Sie einen Container aus und verbinden Sie ihn mit dem neu erstellten test-net-Netzwerk:

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

Öffnen Sie ein neues Terminal, führen Sie einen weiteren Container aus und fügen Sie ihn zum test-net-Netzwerk hinzu:

$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

Klicken Sie auf das Bild, um eine größere Version anzuzeigen:

Verwenden Sie als Nächstes ping, um zu beweisen, dass der test1-Container und der test2-Container eine Verbindung zueinander hergestellt haben.

Wenn die Container test1 und test2 den Befehl ping nicht haben, führen Sie den folgenden Befehl in den Containern aus, um ping zu installieren (sofort lernen und anwenden: Sie können ihn in einem Container installieren, den Container in ein Image committen und dann die oben genannten beiden Container mit dem neuen Image erneut ausführen).

apt-get update
apt install iputils-ping

Geben Sie den folgenden Befehl im test1-Container ein:

Klicken Sie auf das Bild, um eine größere Version anzuzeigen:

Ebenso wird der test2-Container auch erfolgreich eine Verbindung herstellen zu:

Klicken Sie auf das Bild, um eine größere Version anzuzeigen:

Auf diese Weise haben der test1-Container und der test2-Container eine Verbindung zueinander hergestellt.

Wenn Sie mehrere Container haben, die sich miteinander verbinden müssen, wird Docker Compose empfohlen; es wird später vorgestellt.


DNS konfigurieren

Wir können den folgenden Inhalt zur Datei /etc/docker/daemon.json des Hosts hinzufügen, um den DNS für alle Container festzulegen:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

Nach der Konfiguration wird der DNS des gestarteten Containers automatisch auf 114.114.114.114 und 8.8.8.8 gesetzt.

Nach der Konfiguration müssen Sie Docker neu starten, damit die Änderungen wirksam werden.

Um zu prüfen, ob der DNS des Containers wirksam geworden ist, verwenden Sie den folgenden Befehl, der die DNS-Informationen des Containers ausgibt:

$ docker run -it --rm  ubuntu  cat etc/resolv.conf

Klicken Sie auf das Bild, um eine größere Version anzuzeigen:

Container-Konfiguration manuell festlegen

Wenn Sie DNS nur für einen bestimmten Container festlegen möchten, können Sie den folgenden Befehl verwenden:

$ docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

Parameter description:

--rm: Bereinigt automatisch das interne Dateisystem des Containers, wenn der Container beendet wird.

-h HOSTNAME oder --hostname=HOSTNAME: Legt den Hostnamen des Containers fest; er wird in /etc/hostname und /etc/hosts im Container geschrieben.

--dns=IP_ADDRESS: Fügt einen DNS-Server zur /etc/resolv.conf des Containers hinzu, sodass der Container diesen Server verwendet, um alle Hostnamen aufzulösen, die nicht in /etc/hosts stehen.

--dns-search=DOMAIN: Legt die Suchdomäne des Containers fest. Wenn die Suchdomäne auf .example.com gesetzt ist, sucht DNS bei der Suche nach einem Host namens host nicht nur nach host, sondern auch nach host.example.com.

Klicken Sie auf das Bild, um eine größere Version anzuzeigen:

Wenn beim Start des Containers--dnsund--dns-searchnicht angegeben werden, verwendet Docker standardmäßig die /etc/resolv.conf des Host-Rechners, um das DNS des Containers zu konfigurieren.

Weitere Erweiterungen