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