Skip to main content

Netzwerk

Zu viele Netzwerke / Erweitern der Netzwerk-Obergrenze

Docker hat ein internes Limit für die Anzahl der möglichen Netzwerke. Diese beläuft sich auf 32. Auf einem normalen Server würde man diese Menge an Netzwerken vermutlich niemals erreichen. Ein High-End Server und vielen Containern kann das durchaus passieren. Besonders, wenn man die Container abschotten möchte und dafür werden Netzwerke benötigt.

Die Seite https://straz.to/2021-09-08-docker-address-pools/ erklärt sehr gut, weshalb die Anzahl begrenzt ist und auch wie die Obergrenze durch ein paar Zeilen um ein Vielfaches, mit dieser Konfiguration auf 512, erhöht werden kann. Im Folgenden steht die Kurzfassung, für mehr Informationen lest bitte auf der Seite weiter.

Anpassung der daemon.json

Die Erweiterung der Obergrenze für Netzwerke wird in der daemon.json im Verzeichnis /etc/docker vorgenommen.

  1. Editieren der Datei

    /etc/docker/daemon.json
  2. Nun den Inhalt in die Datei einfügen.
    Achtung: Sollte bereits Inhalt vorhanden sein, muss dieser um das folgende Json erweitert werden. Ein einfaches Anfügen führt zu einer fehlerhaften Konfiguration!

    {
      "default-address-pools" : [
        {
          "base" : "172.17.0.0/12",
          "size" : 20
        },
        {
          "base" : "192.168.0.0/16",
          "size" : 24
        }
      ]
    }
  3. Nun die Datei speichern und den Docker Service neu starten.

    service docker restart

Privates Netzwerk erstellen

Bei einem Docker Compose Container Konzert ist die beste Möglichkeit eine Kommunikation zwischen den Container über ein internes Netzwerk aufzubauen.

Dabei werden in der docker-compose.yml Datei zwei Netzwerke definiiert. Das frontend-Netzwerk dient zur Kommunikation des öffentlichen App-Containers mit dem LAN und das backend-Netzwerk für die Container untereinander.
Das frontend-Netzwerk muss über folgenden Befehl vor dem ersten Start der Container manuell angelegt werden.
Das backend-Netzwerk wird beim Start der Container temporär erzeugt.

Anlegen eines Netzwerkes

docker network create frontend

Beispiel docker-compose.yml

version: '3.4'
 
services:
  app:
    container_name: app
    ports:
      - PUBLIC_PORT:80
    networks:
      - frontend
      - backend
 
  # z. B. eine Mysql DB mit dem EXPOSED-Port 3306
  db:
    container_name: db
    networks:
      - backend
 
networks:
  frontend:
    external:
      name: frontend
  backend:
    internal: true

Zugriff der Container untereinander

Wenn nun der App-Container auf den DB-Container zugreifen muss, so erfolgt dies unter Angabe des "container_name". Die zu verwendenden Ports sind die EXPOSED-Ports des Docker Images!

Natürlich kann der Port des DB-Containers für einen öffentlichen Zugriff (z. B. auf 20000) freigegeben werden. Der interne Zugriff bleibt weiterhin auf z. B. bei Mysql 3306!

ports:
  - 20000:3306

In der Anwendung (App-Container) wäre ein DB-Zugriff mit folgenden Daten anzugeben:


Datenbankname db
Port 3306