Networks: Warum bekommen Container IP-Adressen aus verschiedenen Bereichen?

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Kachelkaiser

Benutzer
Contributor
Sehr erfahren
Registriert
22. Feb. 2018
Beiträge
3.451
Reaktionspunkte
1.781
Punkte
244
Ich verzeifel etwas mit der Netzwerkverteilung unter Docker.

Bisher war es immer so, dass, wenn ich Container über Stacks (docker-compose) erstellte, diese eine IP-Adresse aus dem Bridge Netzwerk bekommen haben z.B. 172.21.0.0/16

Jetzt ist es aber so, dass ich vereinzelt Container habe, die plötzlich IP-Adressen wie z.B. 192.168.132.0/20 bekommen. Ich habe festgestellt, dass Container mit diesen Adressen nicht auf andere Anwendungen in meinem Netz oder Internet zugreifen können.

Nach Lektüre verschiedener Seiten habe ich herausgefunden, dass die Adressen 192.168.x.x erst verwendet werden wenn der Bereich 172.x.x.x belegt ist. Ich denke, das ist bei mir aber nicht der Fall.

Hier ein Beispiel meiner Netzwerke und Container

1770048711099.png

1770048871303.png

Wie ihr seht, bekommen die Container von joplin, jdownloader und homarr Adresse aus der 192.168.x.x Range. Unter homarr komme ich damit z.B. nicht auf Adguard Home.

Joplin lässt sich gar nicht aufrufen

1770048994567.png

Lange Rede kurzer Sinn, wie bekomme ich es wieder hin dass bei der Erstellung der Container die Range 172.x.x.x benutzt wird?
 
Ich hatte mich auch darüber gewundert. Abgeholfen habe ich mir mit einem eingenen Netzwerk für die meisten Container, welches ich explizit angebe.

Einmalig erstellen:
Bash:
docker network create \
   --driver bridge \
   --subnet 172.18.0.0/16 \
   default_bridge

docker-compose.yaml:
YAML:
…

networks:
  default:
    name: default_bridge
    external: true
 
Vielen Dank

und den networks part schreibst du dann in jede compose oder?
 
Perfekt hat funktioniert+

Joplin bringt zwar immer noch den Fehler, aber das ist bestimmt ein anderes Problem. Lief eh nicht so der Server, dann wird er jetzt einfach neu aufgesetzt ;-)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: ctrlaltdelete
Guck Mal hier https://blog.joelbuckley.com.au/2022/12/til-docker-default-address-pools. Man kann das eigentlich konfigurieren. Auch wie viele Container pro Netz es sein könnten. Wenn man das kleiner einstellt, dann passen auch mehr Services in die Range. Nur der Synology Pfad stimmt da nicht mehr. Da musst du Docker durch ContainerManager ersetzen.

Edit: auf meinem Docker Host wo viele Container laufen sieht das so aus:
Code:
{
  "default-address-pools":[
    {"base":"172.30.0.0/16","size":28},
    {"base":"172.31.0.0/16","size":28},
    {"base":"10.10.0.0/16","size":28}
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "1"
  }
}
 
Höchstwahrscheinlich liegt hier die Default-Konfiguration vor:
Code:
{
  "default-address-pools": [
    {"base":"172.17.0.0/16","size":16},
    {"base":"172.18.0.0/16","size":16},
    {"base":"172.19.0.0/16","size":16},
    {"base":"172.20.0.0/14","size":16},
    {"base":"172.24.0.0/14","size":16},
    {"base":"172.28.0.0/14","size":16},
    {"base":"192.168.0.0/16","size":20}
  ]
}
Quelle: https://docs.docker.com/engine/network/#automatic-subnet-allocation

Base: CIDR der Range, Size: Bits eines Subnets innerhalb der CIDR Range.
Sowohl 16 Bit, als auch 20 Bit Subnetze sind unnötig Größ (65536 ips vs 4096 ips).

Die Werte von @johndoe sehen für ein Homelab deutlich(!) sinnvoller aus :)
 
  • Like
Reaktionen: Kachelkaiser
Das könnte natürlich sein, das sieht so aus wie bei mir. Ich glaube ich muss mir das mal in Ruhe zu Gemüte führen. Vorerst nehme ich mal den Workaround von @geimist
 
Wenn ich die Standard-Adresspools ändere wird das vermutlich beim nächsten Update vom Docker Manager wieder überbügelt, oder?
Ich denke die Lösung von gemist scheint sinnvoll zu sein. Wenn ich das richtig verstanden hab, sind die Container an der Stelle dann aber nicht mehr "containered". Sollte aber im Home-Lab OK sein?!
 
Wenn ich die Standard-Adresspools ändere wird das vermutlich beim nächsten Update vom Docker Manager wieder überbügelt, oder?
Kann ich nicht genau sagen, aber ansonsten einfach bei jedem Boot die Datei neu erstellen....

Wenn ich das richtig verstanden hab, sind die Container an der Stelle dann aber nicht mehr "containered".
Wieso sollte das so sein odr was meinst du damit genau?
 
Im Standardfall hat jeder Container ein eigenes Subnet und ist damit von den anderen Containern isoliert.
Jetzt wäre das nicht mehr der Fall, da sich alle in einem Subnet befinden.
 
Du kannst doch für jeden Container auch ein eigenes Subnet erstellen? Das ist doch dir überlassen.
Und es kann auch Absicht sein, dass sich Container sehen. Das spricht nicht gegen "containered". Man muss nur abwägen wer was erreichen können muss.
 
  • Like
Reaktionen: haydibe
Im Standardfall hat jeder Container ein eigenes Subnet und ist damit von den anderen Containern isoliert.
Ich fürchte hier werden Dinge vermischt.

Der Satz oben ergibt fast Sinn, wenn jeder Container in einem separaten (Compose) Projekt deployt werden würde...

Ein Container besitzt kein Netzwerk und erzeugt auch kein Netzwerk. Für jedes Compose Projekt wird ein eigenes Default-Netzwerk erzeugt; jeder Service im Compose Projekt wird an dieses Default-Netzwerk angehangen (außer man definiert seine eigenen Netzwerke und weist diese zu).

Wenn ich das richtig verstanden hab, sind die Container an der Stelle dann aber nicht mehr "containered"
@Duffman wie Du an andere Stelle selbst schon geschrieben hast: es geht hier um Netzwerk-Isolation. Das Wort "containered" gibt es in dem Zusammenhang nicht.

Es ist eine Designentscheidung, ob man alles in ein flaches Netzwerk packen möchte, und so jeder Container uneingeschränkt mit jedem anderen Container im selben Netzwerk kommunizieren kann (ist bei Kubernetes übriges auch so). Streng genommen gehören Container, die nicht über das Netzwerk miteinander interagieren müssen, in separate Netzwerke. Die Frage ist halt, worauf man Wert legt: ordentlich/sicher oder Hauptsache es läuft irgendwie.

Hinweis: Der docker run Befehl, ohne Angabe des --network <netzwerkname> Arguments, packt auch alle Container in ein flaches Netzwerk, und zwar in die Default-Bridge. Die wollte Docker eigentlich schon vor Jahren in den Ruhestand geschickt haben... aber wie so oft: totgesagte leben länger :)
 

Additional post fields

 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat