Docker 2024 04/Networking: Unterschied zwischen den Versionen

Aus CCWiki
Zur Navigation springen Zur Suche springen
Zeile 126: Zeile 126:
docker run --name networkingB --network network_example2 --hostname B --rm -d dockerschulung/networking_example2:1.0
docker run --name networkingB --network network_example2 --hostname B --rm -d dockerschulung/networking_example2:1.0
#Container mit Hostname C, als Veranschaulichung der Container Isolierung, verwendet default Bridge
#Container mit Hostname C, als Veranschaulichung der Container Isolierung, verwendet default Bridge
docker run --name networkingB --hostname C --rm -d dockerschulung/networking_example2:1.0
docker run --name networkingC --hostname C --rm -d dockerschulung/networking_example2:1.0
}}
}}

Version vom 12. April 2024, 11:53 Uhr

Folgendes soll einen Grundlegenden Überblick über das Container Networking bieten.

Netzwerk Treiber

Docker verwendet für die Netzwerkkommunikation Treiber. Folgende Treiber sind standardmäßig Verfügbar. Im folgenden werden wir uns auf die Netzwerktypen Host und Bridge beschränken.

bridge: The default network driver. If you don't specify a driver, this is the type of network you are creating. Bridge networks are commonly used when your application runs in a container that needs to communicate with other containers on the same host.
host: Remove network isolation between the container and the Docker host, and use the host's networking directly.
overlay: Overlay networks connect multiple Docker daemons together and enable Swarm services and containers to communicate across nodes. This strategy removes the need to do OS-level routing.
ipvlan: IPvlan networks give users total control over both IPv4 and IPv6 addressing. The VLAN driver builds on top of that in giving operators complete control of layer 2 VLAN tagging and even IPvlan L3 routing for users interested in underlay network integration.
macvlan: Macvlan networks allow you to assign a MAC address to a container, making it appear as a physical device on your network. The Docker daemon routes traffic to containers by their MAC addresses. Using the macvlan driver is sometimes the best choice when dealing with legacy applications that expect to be directly connected to the physical network, rather than routed through the Docker host's network stack.
none: Completely isolate a container from the host and other containers. none is not available for Swarm services.

[1]

Beispiel 1): Default Bridge

Wird ein Container über docker run ohne weitere Netzwerkkonfiguration gestartet, so verwendet dieser den bridge Netzwerktreiber.

Dies kann anhand von folgendem Beispiel nachvollzogen werden:

#Starten eines Containers
docker run --name ubuntu -it --rm -d ubuntu:22.04 bash
#Inspizieren des Containers
docker inspect ubuntu
...
                    "NetworkID": "026a89529e7e830967b50e7b79099229815bb1e0de6363d47f0e779873e27c70",
...
#Auflisten der Docker Netzwerke
docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
...
026a89529e7e   bridge            bridge    local
...

Anhand der NetworkID kann nachvollzogen werden, dass der neu gestartete Container das Netzwerk mit dem Namen bridge verwendet. Hierbei handelt es sich um das default Bridge Netzwerk.

Daraus resultiert, dass alle Container die mit docker run ohne expliziten Netzwerk Parameter Teil dieses Netzwerks sind. Diese können auch untereinander miteinander kommunizieren.

Beispiel 2): Container Communication

Im folgenden wird das vorhergehende Beispiel um diverse Netzwerktools erweitert.

Dockerfile

Inhalt in Datei Dockerfile

#Baseimage
FROM dockerschulung/example5:1.0
RUN apt-get update
RUN apt-get install -y curl inetutils-ping iproute2
#Standard Webseite erstellen
RUN mkdir -p /var/www
RUN echo "<html><h1>Welcome</h1></html>" > /var/www/index.html
#Der Entrypoint aus dem Baseimage wird verwendet

Image erstellen

docker build . -t dockerschulung/networking_example2:1.0

Container starten

#Container mit Hostname A
docker run --name networkingA --hostname A --rm -d dockerschulung/networking_example2:1.0
#Container mit Hostname B
docker run --name networkingB --hostname B --rm -d dockerschulung/networking_example2:1.0

Container Bash starten

Terminal 1

#Bash starten
docker exec -it networkingA bash
#IP Adresse des Containers ermitteln
ip addr
...
77: eth0@if78: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
...
#Container B ist erreichbar
ping 172.17.0.5
#Webseite von Container B abrufen
curl 172.17.0.5
<html><h1>Welcome</h1></html>
#Namensauflösung
ping B
ping: unknown host

Terminal 2

#Bash starten
docker exec -it networkingB bash
#IP Adresse des Containers ermitteln
ip addr
...
79: eth0@if80: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0
...
#Container A ist erreichbar
ping 172.17.0.4
#Webseite von Container A abrufen
curl 172.17.0.4
<html><h1>Welcome</h1></html>
#Namensauflösung
ping A
ping: unknown host

Die DNS Auflösung über Docker DNS funktioniert NICHT im default Bridge Netzwerk.

Beispiel 3): Explizites Netzwerk

Im folgenden wird ein Docker Bridge Netzwerk erstellt.

docker network create network_example2

Verwenden des Netzwerks:

#Container mit Hostname A
docker run --name networkingA --network network_example2 --hostname A --rm -d dockerschulung/networking_example2:1.0
#Container mit Hostname B
docker run --name networkingB --network network_example2 --hostname B --rm -d dockerschulung/networking_example2:1.0
#Container mit Hostname C, als Veranschaulichung der Container Isolierung, verwendet default Bridge
docker run --name networkingC --hostname C --rm -d dockerschulung/networking_example2:1.0