Nach der Docker-Installation haben Sie standardmäßig 3 Netzwerke:
docker network ls
NETWORK ID NAME DRIVER SCOPE
f3be8b1ef7ce bridge bridge local
fbff927877c1 host host local
023bb5940080 none null local
Ich versuche das einfach zu halten. Wenn Sie einen Container standardmäßig starten, wird er im Bridge-Netzwerk (Docker0) erstellt.
$ docker run -d jenkins
1498e581cdba jenkins "/bin/tini -- /usr..." 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp friendly_bell
In der Docker-Datei von Jenkins werden die Ports 8080
und 50000
freigelegt. Diese Ports werden für den Container in seinem Brückennetzwerk geöffnet. So kann alles in diesem Brückennetzwerk auf den Container am Port 8080
und zugreifen 50000
. Alles im Brückennetzwerk befindet sich im privaten Bereich von "Subnet": "172.17.0.0/16",
Wenn Sie von außen darauf zugreifen möchten, müssen Sie die Ports zuordnen -p 8080:8080
. Dadurch wird der Port Ihres Containers dem Port Ihres realen Servers (dem Host-Netzwerk) zugeordnet. 8080
Wenn Sie also auf Ihren Server zugreifen, wird der Zugriff auf Ihr Bridgenetwork am Port erfolgen 8080
.
Jetzt haben Sie auch Ihr Host-Netzwerk. Was die Containernetzwerke nicht containerisiert. Wenn Sie also einen Container im Host-Netzwerk starten, sieht er folgendermaßen aus (es ist der erste):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1efd834949b2 jenkins "/bin/tini -- /usr..." 6 minutes ago Up 6 minutes eloquent_panini
1498e581cdba jenkins "/bin/tini -- /usr..." 10 minutes ago Up 10 minutes 8080/tcp, 50000/tcp friendly_bell
Der Unterschied liegt bei den Ports. Ihr Container befindet sich jetzt in Ihrem Host-Netzwerk. Wenn Sie also den Port 8080
auf Ihrem Host öffnen, greifen Sie sofort auf den Container zu.
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
Ich habe den Port 8080
in meiner Firewall geöffnet und wenn ich jetzt auf meinen Server am Port 8080
zugreife, greife ich auf meine Jenkins zu. Ich denke, dieser Blog ist auch nützlich, um es besser zu verstehen.
--net=host
in eine Docker-Datei einzufügen?docker build --network=host
. Das angegebene Host-Netzwerk für die Docker-Erstellung dient nur zum Herunterladen von Paketen, die zum Erstellen des Images erforderlich sind. Wenn Sie Ihren Container im Host-Netzwerk ausführen möchten, müssen Sie noch die Option --network = host definieren.network_mode: "host"
(ref - docs.docker.com/compose/compose-file/#network_mode )Die
--net=host
Option wird verwendet, um die Programme im Docker-Container aus Sicht des Netzwerks so aussehen zu lassen, als würden sie auf dem Host selbst ausgeführt. Dies ermöglicht dem Container einen größeren Netzwerkzugriff als normalerweise möglich.Normalerweise müssen Sie Ports vom Host-Computer in einen Container weiterleiten. Wenn sich die Container jedoch das Netzwerk des Hosts teilen, erfolgt jede Netzwerkaktivität direkt auf dem Host-Computer - genau wie wenn das Programm lokal auf dem Host statt in einem ausgeführt würde Container.
Dies bedeutet zwar, dass Sie keine Ports mehr verfügbar machen und sie Container-Ports zuordnen müssen, aber Sie müssen Ihre Docker-Dateien bearbeiten, um die Ports anzupassen, die jeder Container abhört, um Konflikte zu vermeiden, da nicht zwei Container gleichzeitig ausgeführt werden können Host-Port. Der eigentliche Grund für diese Option ist jedoch die Ausführung von Apps, die einen Netzwerkzugriff benötigen, der nur schwer an einen Container auf Portebene weitergeleitet werden kann.
Wenn Sie beispielsweise einen DHCP-Server ausführen möchten, müssen Sie in der Lage sein, den Broadcast-Verkehr im Netzwerk abzuhören und die MAC-Adresse aus dem Paket zu extrahieren. Diese Informationen gehen während des Portweiterleitungsprozesses verloren. Die einzige Möglichkeit, einen DHCP-Server in Docker auszuführen, besteht darin, den Container als auszuführen
--net=host
.Im Allgemeinen wird
--net=host
es nur benötigt, wenn Sie Programme mit sehr spezifischen, ungewöhnlichen Netzwerkanforderungen ausführen.Aus Sicherheitsgründen können Docker-Container viele Ports überwachen, obwohl sie nur einen einzelnen Port ankündigen (verfügbar machen). Normalerweise ist dies in Ordnung, da Sie nur den einzelnen erwarteten Port weiterleiten. Wenn Sie jedoch diesen verwenden
--net=host
, werden alle Ports des Containers auf dem Host überwacht, auch diejenigen, die nicht in der Docker-Datei aufgeführt sind. Dies bedeutet, dass Sie den Container genau prüfen müssen (insbesondere, wenn er nicht Ihnen gehört, z. B. einem offiziellen, der von einem Softwareprojekt bereitgestellt wird), um sicherzustellen, dass Sie nicht versehentlich zusätzliche Dienste auf dem Computer verfügbar machen.quelle
--net=host
Container den Datenverkehr, aber natürlich kann jeweils nur ein Programm einen bestimmten Port überwachen, unabhängig davon, in welchem Container Sie ihn ausführen ).quelle
host
), wenn die Möglichkeit besteht, mehrere Container auf demselben Host auszuführen . In anderen Fällen (in denen keine Netzwerkisolation erforderlich ist) würde ich es vorziehen--net=host
.