Docker-Installationsmethode und detaillierte Erläuterung der vier Netzwerkmodi von Docker

Docker-Installationsmethode und detaillierte Erläuterung der vier Netzwerkmodi von Docker

1. Docker installieren

yum -y install docker-io

Die Meldung „Abgeschlossen“ wird angezeigt und zeigt damit an, dass die Installation abgeschlossen ist.

2. Starten Sie den Docker-Dienst

Dienst Docker starten

3. Docker-Start einrichten

chkconfig Docker ein

4. Grundlegende Informationsansicht

Docker-Version
Docker-Informationen
Docker-Bilder Bild anzeigen
Docker PS zum Anzeigen der laufenden Container
Docker RMI Bild löschen
docker save -o imageName:tag > path/name.tar speichert das Image
Docker laden < Name.tar Bild laden
Docker Pull zieht das Image

5. Wenn Sie deinstallieren möchten, lautet der Befehl wie folgt:

sudo yum remove docker-ce
sudo rm -rf /var/lib/docker

Wenn wir Docker Run verwenden, um einen Docker-Container zu erstellen, können wir die Option --net verwenden, um den Netzwerkmodus des Containers anzugeben. Docker verfügt über die folgenden vier Netzwerkmodi:

Hostmodus, angegeben mit --net=host.
Containermodus, angegeben mit --net=container:NAME_oder_ID.
Keiner-Modus, angegeben mit --net=none.
Bridge-Modus, angegeben mit --net=bridge, die Standardeinstellung.
Es gibt auch einen benutzerdefinierten Modus

Im Folgenden werden die einzelnen Netzwerkmodi von Docker vorgestellt.

1 Host-Modus

Format:

docker run -it --name myubuntu --net=host ubuntu /bin/bash

Wie wir alle wissen, verwendet Docker die Namespaces-Technologie von Linux, um Ressourcen zu isolieren, wie z. B. PID-Namespaces, um Prozesse zu isolieren, Mount-Namespaces, um Dateisysteme zu isolieren, und Network-Namespaces, um Netzwerke zu isolieren. Ein Netzwerk-Namespace bietet eine unabhängige Netzwerkumgebung, einschließlich Netzwerkkarten, Routing, Iptable-Regeln usw., die von anderen Netzwerk-Namespaces isoliert sind. Einem Docker-Container wird grundsätzlich ein unabhängiger Netzwerk-Namespace zugewiesen. Wenn beim Starten des Containers jedoch der Hostmodus verwendet wird, erhält der Container keinen unabhängigen Netzwerk-Namespace, sondern teilt einen Netzwerk-Namespace mit dem Host. Der Container virtualisiert nicht seine eigene Netzwerkkarte, konfiguriert nicht seine eigene IP usw., sondern verwendet die IP und den Port des Hosts.
Beispielsweise starten wir einen Docker-Container, der eine Webanwendung im Hostmodus auf der Maschine 10.10.101.105/24 enthält und auf Port tcp80 lauscht. Wenn wir im Container einen beliebigen Befehl wie „ifconfig“ ausführen, um die Netzwerkumgebung anzuzeigen, sehen wir die Informationen auf dem Hostcomputer. Wenn die Außenwelt auf die Anwendung im Container zugreift, können Sie 10.10.101.105:80 ohne NAT-Konvertierung direkt verwenden, als würde es direkt auf dem Hostcomputer ausgeführt. Andere Aspekte des Containers, etwa das Dateisystem und die Prozessliste, sind jedoch weiterhin vom Hostcomputer isoliert.

2 Container-Modus

Format:

docker run -it --name myubuntu --net=container:NAME_OR_ID ubuntu /bin/bash

Nachdem Sie den Host-Modus verstanden haben, ist auch dieser Modus leicht zu verstehen. Dieser Modus gibt an, dass der neu erstellte Container einen Netzwerk-Namespace mit einem vorhandenen Container teilt, anstatt ihn mit dem Host zu teilen. Der neu erstellte Container erstellt keine eigene Netzwerkkarte und konfiguriert keine eigene IP, sondern teilt die IP, den Portbereich usw. mit einem angegebenen Container. Ebenso sind mit Ausnahme des Netzwerks auch andere Aspekte der beiden Container, wie etwa das Dateisystem und die Prozessliste, noch immer isoliert. Die Prozesse der beiden Container können über das Lo-Netzwerkkartengerät kommunizieren.

3 Keiner-Modus

Format:

docker run -it --name myubuntu --net=none ubuntu /bin/bash

Dieser Modus unterscheidet sich von den beiden vorherigen. In diesem Modus verfügt der Docker-Container über einen eigenen Netzwerk-Namespace, es wird jedoch keine Netzwerkkonfiguration für den Docker-Container durchgeführt. Mit anderen Worten, dieser Docker-Container hat keine Netzwerkkarte, IP, Routing und andere Informationen. Wir müssen Netzwerkkarten hinzufügen und die IP für den Docker-Container selbst konfigurieren.

4-Brücken-Modus

Der Bridge-Modus ist die Standardnetzwerkeinstellung für Docker. Dieser Modus weist jedem Container einen Netzwerk-Namespace zu, legt eine IP-Adresse usw. fest und verbindet einen Docker-Container auf einem Host mit einer virtuellen Bridge. Im Folgenden liegt der Schwerpunkt auf diesem Modus.

4.1 Bridge-Modus-Topologie

Beim Starten des Docker-Servers wird auf dem Host eine virtuelle Brücke mit dem Namen docker0 erstellt und die auf diesem Host gestarteten Docker-Container werden mit dieser virtuellen Brücke verbunden. Die virtuelle Brücke funktioniert ähnlich wie ein physischer Switch, sodass alle Container auf dem Host über den Switch mit einem Layer-2-Netzwerk verbunden sind. Der nächste Schritt besteht darin, dem Container eine IP zuzuweisen. Docker wählt aus dem in RFC1918 definierten privaten IP-Segment eine IP-Adresse und ein Subnetz, die sich von denen des Hostcomputers unterscheiden, und weist es docker0 zu. Der mit docker0 verbundene Container wählt aus diesem Subnetz eine freie IP. Beispielsweise verwendet Docker im Allgemeinen das Netzwerksegment 172.17.0.0/16 und weist der Docker0-Brücke 172.17.42.1/16 zu (Docker0 kann mit dem Befehl ifconfig auf dem Host angezeigt werden. Es kann als Verwaltungsschnittstelle der Brücke betrachtet werden und wird als virtuelle Netzwerkkarte auf dem Host verwendet). Die Netzwerktopologie in einer Einzelcomputerumgebung ist wie folgt und die Hostadresse ist 10.10.101.105/24.

Der Vorgang, mit dem Docker die obige Netzwerkkonfiguration abschließt, läuft ungefähr wie folgt ab:

1. Erstellen Sie auf dem Host ein Paar virtueller Netzwerkkarten (Veth-Paargeräte). Veth-Geräte treten immer paarweise auf. Sie bilden einen Datenkanal. Daten kommen von einem Gerät herein und kommen von einem anderen Gerät heraus. Daher werden veth-Geräte häufig verwendet, um zwei Netzwerkgeräte zu verbinden.

2. Docker platziert ein Ende des Veth-Paargeräts im neu erstellten Container und nennt es eth0. Das andere Ende wird im Host platziert und beispielsweise veth65f9 genannt. Dieses Netzwerkgerät wird der Docker0-Brücke hinzugefügt, die über den Befehl brctl show angezeigt werden kann.

3. Weisen Sie dem Container eine IP aus dem Subnetz Docker0 zu und legen Sie die Docker0-IP-Adresse als Standard-Gateway für den Container fest.
Nachdem wir die Netzwerktopologie vorgestellt haben, sprechen wir darüber, wie Container im Bridge-Modus kommunizieren.

4.2 Kommunikation zwischen Containern im Bridge-Modus

Im Bridge-Modus können Container, die mit derselben Bridge verbunden sind, miteinander kommunizieren (aus Sicherheitsgründen können Sie die Kommunikation zwischen ihnen auch verbieten, indem Sie --icc=false in der Variable DOCKER_OPTS festlegen, sodass nur --link die Kommunikation zwischen zwei Containern ermöglichen kann).
Der Container kann auch mit der Außenwelt kommunizieren. Werfen wir einen Blick auf die Iptable-Regeln auf dem Host und sehen uns die folgende Zeile an:

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

Diese Regel konvertiert die Quelladresse von Paketen mit der Quelladresse 172.17.0.0/16 (dh vom Docker-Container generierte Pakete), die nicht von der Docker0-Netzwerkkarte gesendet werden, in die Adresse der Host-Netzwerkkarte. Das ist vielleicht nicht leicht zu verstehen, deshalb möchte ich Ihnen ein Beispiel geben. Angenommen, der Host hat eine Netzwerkkarte namens eth0, die IP-Adresse ist 10.10.101.105/24 und das Gateway ist 10.10.101.254. Pingen Sie Baidu (180.76.3.151) von einem Container auf dem Host mit der IP 172.17.0.1/16. Das IP-Paket wird zuerst vom Container an sein Standard-Gateway Docker0 gesendet. Nachdem das Paket Docker0 erreicht hat, erreicht es auch den Host. Anschließend wird die Routing-Tabelle des Hosts abgefragt und es wird festgestellt, dass das Paket vom eth0 des Hosts an das Gateway 10.10.105.254/24 des Hosts gesendet werden soll. Das Paket wird dann an eth0 weitergeleitet und von eth0 versendet (die ip_forward-Weiterleitung des Hosts sollte aktiviert sein). Zu diesem Zeitpunkt werden die oben genannten Iptable-Regeln wirksam, führen eine SNAT-Konvertierung für das Paket durch und ändern die Quelladresse in die Adresse von eth0. Auf diese Weise wird dieses Paket aus Sicht der Außenwelt von 10.10.101.105 gesendet und der Docker-Container ist für die Außenwelt unsichtbar.
Wie also greifen externe Maschinen auf die Dienste von Docker-Containern zu? Wir verwenden zunächst den folgenden Befehl, um einen Container mit einer Webanwendung zu erstellen und Port 80 des Containers dem Port 80 des Hosts zuzuordnen.

docker run -d --name web -p 80:80 fmzhen/simpleweb

Überprüfen Sie dann die Änderungen in den Iptable-Regeln und suchen Sie eine zusätzliche Regel:

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.5:80

Diese Regel führt eine DNAT-Konvertierung des vom Host eth0 empfangenen TCP-Datenverkehrs mit Zielport 80 durch und sendet den Datenverkehr an 172.17.0.5:80, den Docker-Container, den wir oben erstellt haben. Daher muss die Außenwelt nur auf 10.10.101.105:80 zugreifen, um auf die Dienste im Container zuzugreifen.
Darüber hinaus können wir auch die IP-Adresse, DNS und andere von Docker verwendete Informationen anpassen und sogar unsere eigene definierte Brücke verwenden, aber die Arbeitsweise bleibt dieselbe.

Benutzerdefinierter Modus

Benutzer können das Netzwerk über Docker-Netzwerktreiber oder andere Netzwerktreiber anpassen. Sie können mehrere Container mit demselben Netzwerk verbinden. Sobald die Container mit einem benutzerdefinierten Netzwerk verbunden sind, können sie über ihre jeweiligen IP-Adressen und Hostnamen miteinander kommunizieren.
Wenn der Container mit einem benutzerdefinierten Netzwerk verbunden ist, wird die Datei /etc/hosts des Containers mit den IP-Adressen aller anderen Container im selben Netzwerk hinzugefügt.
Da der Container die Datei /etc/hosts jederzeit ändern kann, liest das Programm im Container möglicherweise eine unvollständige oder sogar leere Datei /etc/hosts. Normalerweise kann dieses Problem durch erneutes Lesen gelöst werden.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Wenn Sie mehr darüber erfahren möchten, schauen Sie sich bitte die folgenden Links an

Das könnte Sie auch interessieren:
  • Vier Netzwerkmodi von Docker
  • Docker-Netzwerkmodus und Konfigurationsmethode
  • Detaillierte Einführung in den Docker-Netzwerkmodus (vier Modi)
  • Detaillierte Erläuterung der Konfiguration des VLAN-Netzwerkmodus in Docker
  • Demonstration und Konnektivitätstest des Docker-4-Netzwerkmodus

<<:  MySQL-Sequenz AUTO_INCREMENT ausführliche Erklärung und Beispielcode

>>:  js einfacher und grober Beispielcode zum Veröffentlichen und Abonnieren

Artikel empfehlen

Beispiel zum Erstellen eines Datenbanknamens mit Sonderzeichen in MySQL

Vorwort In diesem Artikel wird erklärt, wie Sie i...

Ergänzender Artikel zur Front-End-Performance-Optimierung

Vorwort Ich habe mir die zuvor veröffentlichten A...

Eine kurze Diskussion darüber, wie man Div und Tabelle auswählt und kombiniert

Das Seitenlayout war mir schon immer ein Anliegen...

MySQL 5.7.18 Installations-Tutorial und Problemübersicht

MySQL 5.7.18 Installation und Problemübersicht. I...

Detaillierte Erklärung der Linux-RPM- und Yum-Befehle und -Verwendung

RPM-Paketverwaltung Ein Verpackungs- und Installa...

Verwenden Sie semantische Tags, um Ihr HTML kompatibel mit IE6,7,8 zu schreiben

HTML5 fügt weitere semantische Tags hinzu, wie et...

So installieren Sie die PHP7 Redis-Erweiterung auf CentOS7

Einführung Im vorherigen Artikel haben wir Redis ...

Probleme bei der Verwendung der Rich-Text-Bearbeitung mit Wangeditor in Vue

wangEditor ist ein webbasierter Rich-Text-Editor,...

Sehr empfehlenswert! Syntax Sugar in Vue 3.2 einrichten

Inhaltsverzeichnis Vorherige 1. Was ist Setup-Syn...

Detaillierte Erklärung des Kopierobjekts von jQuery

<!DOCTYPE html> <html lang="de"...