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.
-
Editieren der Datei
/etc/docker/daemon.json
-
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 } ] }
-
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 |
No Comments