Docker: Networking

17. Feber 2021

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.