Docker: Networking
Bridge
Dies ist der Standard, wenn nicht explizit ein spezifisches Netzwerk angegeben wird. Container können mit anderen Containern, die sich im selben Bridge-Network befinden, kommunizieren.
Container haben eine von Docker verwaltete IP-Adresse.
Beim Start von Docker wird eine Standard-Bridge erstellt, die von Containern, wenn nicht anders angegeben, verwendet wird. Alternativ kann eine „user-defined bridge“ erstellt und verwendet werden.
Die Vorteile von „user-definied bridges“ gegenüber der Standard-Bridge:
- Diese haben DNS-Auflösung, wodurch mit dem Namen des Containers anstatt dessen IP kommuniziert werden kann.
- Container sind isoliert, wodurch nur Container miteinander kommunizieren können, die in derselben „user-defined bridge“ sind.
Die Erstellung einer „user-defined bridge“ wird wie folgt gemacht:
docker network create my-network
Beim Start des Containers muss zusätzlich „–network“ angegeben werden:
docker create --name my-nginx \
--network my-network \
--publish 8080:80 \
nginx:latest
Bei Docker Compose wird, wenn nicht explizit „networks“ definiert werden, automatisch eine „user-defined bridge“ erstellt. Diese erhält den Namen „$NAME_DES_ORDERS_default“ und wird automatisch allen Containern in docker-compose.yml zugeordnet.
Alternativ können die Netzwerke auch manuell definiert und zugeordnet werden:
version: "3.9"
services:
nginx1:
image: nginx
container_name: nginx1
ports:
- 8100:80
networks:
- network1
nginx2:
image: nginx
container_name: nginx2
ports:
- 8101:80
networks:
- network1
- network2
networks:
network1:
name: network1
network2:
name: network2
Host
Im Vergleich zu Bridge hat der Container keine eigene IP-Adresse, sondern verwendet die vom Host. Somit müssen auch keine Ports durchgeschleust werden.
Die Verwendung von „host“ ist dann sinnvoll, wenn sehr viele Ports verwaltet werden müssen, da hierbei NAT nicht benötigt wird.
Die Erstellung eines Containers im „host“-Netzwerk funktioniert wie folgt:
docker create --name my-nginx \
--network host \
nginx:latest
Bei Docker-Compose wird die Zuordnung mit „network_mode“ gemacht:
version: "3.9"
services:
nginx1:
image: nginx
container_name: nginx1
network_mode: host
Overlay Network
Mit einem „Overlay Network“ können mehrere Docker-Hosts miteinander verbunden werden. Da dies allerdings Docker Swarm voraussetzt und die Popularität von Swarm im Vergleich zu Kubernetes eher gering ist, gehe ich darauf nicht mehr im Detail ein.