Docker-Netzwerk (persönliches Memorandum)

Was ist ein Brückentreiber?

Es ist ein Netzwerk, das in einem einzelnen Docker-Host konfiguriert ist und beim Erstellen einer relativ kleinen Netzwerkkonfiguration verwendet wird.

Starten Sie einen Docker-Host auf Docker Machine und überprüfen Sie den Netzwerkbetrieb.

-#Erstellen eines Docker-Hosts
% docker-machine create nw-vm1
-#Melden Sie sich mit ssh bei der virtuellen Maschine an
% docker-machine ssh nw-vm
-#Suchen Sie nach vorhandenen Netzwerken
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
94ade5c5f1ae        bridge              bridge              local
3723c4561df4        host                host                local
105e9024e5d5        none                null                local

Die Funktionsweise des Netzwerks hängt vom Typ des "TREIBERS" ab. Drei sind standardmäßig gemacht. Der Container gehört standardmäßig zum "Bridge" -Netzwerk.

Detaillierte Netzwerkprüfung

-#Docker-Netzwerk Überprüfen Sie den Namen des Treibers
$ docker network inspect bridge

[
    {
        "Name": "bridge",
        "Id": "94ade5c5f1aed16a3637a2c40bed82ac50d51b8814737c5e9942d0f8e0a1fd4c",
        "Created": "2020-09-04T11:31:43.470419246Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

Sie können das Netzwerk-Subnetz und die Standard-Gateway-ID in der Spalte Config überprüfen. Mit dem Brückennetzwerk verbundene Container erhalten in diesem Netzwerk IP-Adressen. Die IP des Gateways ist die IP, die der Schnittstelle "docker0" zugewiesen ist.

Schnittstelleninformationen überprüfen

##SSH-Verbindung zum Docker-Host
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:78:70:eb brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe78:70eb/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:ae:f1:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.99.101/24 brd 192.168.99.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:feae:f112/64 scope link 
       valid_lft forever preferred_lft forever
4: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:77:b5:fe:32 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

Sie können die IP der Schnittstelle von Docker0 überprüfen.

Starten Sie den alpinen Container

$ docker run -itd —name alpine1 alpine /bin/sh
$ docker inspect bridge

Sie können sehen, dass der Container von alpine1 in der Spalte "Container" vorhanden ist und die IP zugewiesen ist. Im Standardbrückennetzwerk ist es möglich, mit Containern zu kommunizieren, die im selben Netzwerk vorhanden sind, indem die IP-Adresse angegeben wird.

Starten Sie einen anderen Container.

-#Starten Sie einen Container für "alpine 2" basierend auf alpine
$ docker run -itd —name alpine2 alpine /bin/sh
-#Befestigen Sie es am Container und überprüfen Sie die IP.
$ docker attach alpine2
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

ip wird am 172.17.0.3 alpine2 zugewiesen.

Überspringen Sie den Ping und überprüfen Sie, ob die Container verbunden sind.

# ping -w 3 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.389 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.140 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.116 ms

--- 172.17.0.2 ping statistics ---
4 packets transmitted, 3 packets received, 25% packet loss
round-trip min/avg/max = 0.116/0.215/0.389 ms

Es kann bestätigt werden, dass eine Kommunikation mit alpine1 möglich ist.

Die Kommunikation über den Containernamen ist ebenfalls möglich

Im Standardnetzwerk kann der Docker-Daemon kein DNS bereitstellen, sodass keine Kommunikation über den Containernamen möglich ist. Dies kann mithilfe eines benutzerdefinierten Brückennetzwerks behoben werden.

Erstellen eines benutzerdefinierten Brückennetzwerks

-#Docker-Netzwerk Netzwerknamen erstellen
$ docker network create my_nw 

Jetzt können Sie ein Brückennetzwerk mit dem Namen "my_nw" erstellen.

Verbindung zwischen Containern

-#Docker-Netzwerkverbindung Netzwerkname Containername
$ docker network connect my_nw alpine1
$ docker network connect my_nw alpine2

Oben sind die Container "alpine1" und "alpine2" mit dem Netzwerk "my_nw" verbunden.

Stellen Sie beim Erstellen eines Containers eine Verbindung zu einem benutzerdefinierten Netzwerk her.

-# docker run -itd --name Neuer Containername--Netzwerk Netzwerkname Originalcontainer
$ docker run -itd --name alpine3 --network my_nw alpine

Wenn Sie im Argument --network das Netzwerk angeben, zu dem Sie eine Verbindung herstellen möchten, beginnt es von vorne, während es mit diesem Netzwerk verbunden ist. Wenn Sie ein Netzwerk angeben und starten, wird es übrigens gestartet, ohne mit dem Standard-Bridge-Netzwerk verbunden zu sein.

An alpine2 anhängen und alpine1 und alpine3 anpingen.

-#Mit alpine2 anbringen
$ docker attach alpine2
-#Ergebnisse weggelassen
# Ping -w 3 alpine1
# Ping -w 3 alpine3

Es kann bestätigt werden, dass eine Kommunikation mit dem Containernamen möglich ist. In einem benutzerdefinierten Brückennetzwerk wird das integrierte DNS des Docker-Dämons gestartet und der Name mit dem Containernamen aufgelöst. Der Container kann mit mehreren Netzwerken verbunden sein.

Trennen Sie den Container vom Netzwerk

-#Docker-Netz trennen Netzwerkname Containername
$ docker network disconnect bridge alpine2
-#Details und Bestätigung von alpine2
$ docker inspect alpine2

Das "Bridge" -Netzwerk ist nicht verbunden und nur das "my_nw" -Netzwerk ist verbunden. Das Brückennetzwerk kann ins Internet gehen, aber standardmäßig ist es ein Netzwerk, das nicht für die Außenwelt offen ist. Durch Freigeben des durch -p angegebenen Ports kann von außen auf den angegebenen Port des Containers zugegriffen werden.

Was ist kein Netzwerk?

Ein Netzwerk, in dem der Treiber "null" ist. Der mit dem "Null" -Treiber verbundene Container hat keine andere Netzwerkschnittstelle als die Loopback-Schnittstelle. Bei Containern, die keine Netzwerke verbinden, müssen andere Netzwerke getrennt sein.

Was ist ein Host-Netzwerk?

Netzwerk mit dem "Host" -Treiber. Mit dem Host-Netzwerk verbundene Container haben dasselbe Netzwerk wie der Docker-Host. Wenn Sie den Webserver in einem Container im Host-Netzwerk starten, verhält er sich genauso wie das Abhören auf IP 80 des Host-Computers. Sie können eine Verbindung zu Port 80 des Containers herstellen, indem Sie auf die IP 80 des Docker-Hosts zugreifen, indem Sie den Container ohne Verwendung von -p starten.

Starten Sie nginx

-#Überprüfen Sie die IP des Docker-Hosts
% docker-machine ip nw-vm1
-#SSH-Verbindung
% docker-machine ssh nw-vm1
-#Starten Sie nginx über das "Host" -Netzwerk
$ docker run -d —name web —network host nginx

Sie können mit der IP-Adresse darauf zugreifen und bestätigen, dass nginx ausgeführt wird.

Recommended Posts

Docker-Netzwerk (persönliches Memorandum)
Docker Memorandum
Technisches Memorandum (Docker)
Memorandum Docker-Befehl
Docker-Befehlsmemorandum
Starten Sie einen Docker-Container auf EC2 (persönliches Memorandum)
Erstellen einer CICD-Pipeline mit Docker (persönliches Memorandum)
Datenverwaltung mit Volume in Docker (persönliches Memorandum)
Docker Befehl persönliche Zusammenfassung
Was ist Docker-Compose (persönliches Memorandum)
Erstellen eines Docker-Hosts in AWS mit Docker Machine (persönliches Memorandum)
Verwendung des Arrays (persönliches Memorandum)
Memorandum
Memorandum
Docker
Schienenumgebungskonstruktion mit Docker (persönliche Apokalypse)
[Persönlich] JUnit5-Memorandum-Memo (in Arbeit)