Docker-Subnetze ändern

Docker-Subnetze ändern

Docker geht von Natur aus sehr verschwenderisch mit IP-Subnetzen um! Auf Hosts mit vielen Netzwerken führt das früher oder später zu folgender Fehlermeldung:

Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

Schaut man sich die erstellten Netzwerke dann genauer an, fällt folgendes Schema auf:

Die bridge docker0 erhält standardmäßig das Subnetz 172.17.0.0/16. Anschließend werden die Netze 172.18.0.0/16 bis 172.31.0.0/16 vergeben. Danach folgen die Netze 192.168.0.0/20 bis 192.168.240.0/20. Danach erscheint die oben beschriebene Fehlermeldung beim Versuch ein Netzwerk anzulegen.

Das Problem nachstellen

Wer das selbst auf einem frischen System mit Docker testen möchte, kann mit folgendem Bash-Einzeiler einfach und schnell die maximale Anzahl an Netzen erstellen:

$ for i in {1..256};do docker network create test$i; done

Mit dem folgenden Bash-Befehl lässt sich dann eine Liste aller Netze ausgeben:

$ docker network inspect $(docker network ls | awk '$3 == "bridge" { print $1}') | jq -r '.[] | .Name + " " + .IPAM.Config[0].Subnet' -
bridge 172.17.0.0/16
test1 172.18.0.0/16
test2 172.19.0.0/16
test3 172.20.0.0/16
test4 172.21.0.0/16
test5 172.22.0.0/16
test6 172.23.0.0/16
test7 172.24.0.0/16
test8 172.25.0.0/16
test9 172.26.0.0/16
test10 172.27.0.0/16
test11 172.28.0.0/16
test12 172.29.0.0/16
test13 172.30.0.0/16
test14 172.31.0.0/16
test15 192.168.0.0/20
test16 192.168.16.0/20
test17 192.168.32.0/20
test18 192.168.48.0/20
test19 192.168.64.0/20
test20 192.168.80.0/20
test21 192.168.96.0/20
test22 192.168.112.0/20
test23 192.168.128.0/20
test24 192.168.144.0/20
test25 192.168.160.0/20
test26 192.168.176.0/20
test27 192.168.192.0/20
test28 192.168.208.0/20
test29 192.168.224.0/20
test30 192.168.240.0/20

Die Netze lassen sich mit docker network prune übrigens wieder entfernen.

Wie verschwenderisch von Docker für jedes Netzwerk direkt ein /16 zu nutzen - wer braucht schon  über 65.000 IP-Adressen für ein Docker-Netzwerk. Anschließend werden immerhin /20-Subnetze vergeben, welche mit über 4.000 möglichen IP-Adressen aber immer noch vollkommen überdimensioniert sind! Für viele Home-Nutzer beginnen hier dann auch noch weitere Probleme - schließlich wird das Netz 192.168.178.0/24 üblicherweise von Fritzboxen und anderen Home-Routern verwendet.

Die Lösung

In der Datei /etc/docker/daemon.json müssen folgende Zeilen hinterlegt werden:

{
  "bip": "10.200.0.1/16",
  "default-address-pools": [{"base":"10.201.0.0/16", "size":24}]
}

Ich habe mich hier für die Netze 10.200.0.0/16 und 10.201.0.0/16 entschieden, das ganze funktioniert aber auch mit beliebigen anderen Netzen, welche für private Netze vorgesehen sind (beliebige Netze aus 10.0.0.0/8, 172.16.0.0/12 und 192.168.0.0/16). Es sollte allerdings darauf geachtet werden, dass es keine Konflikte mit bestehenden internen Netzen oder VPN-Netzen gibt.

Anschließend starten wir dockerd mit sudo systemctl restart docker neu. Die konfigurierten Netze werden nun für neue (!) Netzwerke verwendet. Bestehende Netzwerke müssen gelöscht und anschließend neu angelegt werden.

Validierung der Lösung

Mit den Zeilen von oben können wir die Konfigurationsänderung validieren. Zunächst löschen wir auf dem Testserver mit docker network prune die vorhandenen Netze. Anschließend erstellen wir mit for i in {1..256};do docker network create test$i; done 256 neue Netzwerke.

Mit folgendem Befehl können wir validieren, dass die Netze unserer Konfiguration entsprechend angelegt wurden:

$ docker network inspect $(docker network ls | awk '$3 == "bridge" { print $1}') | jq -r '.[] | .Name + " " + .IPAM.Config[0].Subnet' -
bridge 10.200.0.0/16
test1 10.201.64.0/24
test2 10.201.65.0/24
test3 10.201.66.0/24
test4 10.201.67.0/24
test5 10.201.68.0/24
test6 10.201.69.0/24
test7 10.201.70.0/24
test8 10.201.71.0/24
test9 10.201.72.0/24
test10 10.201.73.0/24
test11 10.201.74.0/24
test12 10.201.75.0/24
test13 10.201.76.0/24
test14 10.201.77.0/24
test15 10.201.78.0/24
test16 10.201.79.0/24
test17 10.201.80.0/24
test18 10.201.81.0/24
test19 10.201.82.0/24
test20 10.201.83.0/24
test21 10.201.84.0/24
test22 10.201.85.0/24
test23 10.201.86.0/24
test24 10.201.87.0/24
test25 10.201.88.0/24
test26 10.201.89.0/24
test27 10.201.90.0/24
test28 10.201.91.0/24
test29 10.201.92.0/24
test30 10.201.93.0/24
test31 10.201.94.0/24
test32 10.201.95.0/24
test33 10.201.96.0/24
test34 10.201.97.0/24
test35 10.201.98.0/24
test36 10.201.99.0/24
test37 10.201.100.0/24
test38 10.201.101.0/24
test39 10.201.102.0/24
test40 10.201.103.0/24
test41 10.201.104.0/24
test42 10.201.105.0/24
test43 10.201.106.0/24
test44 10.201.107.0/24
test45 10.201.108.0/24
test46 10.201.109.0/24
test47 10.201.110.0/24
test48 10.201.111.0/24
test49 10.201.112.0/24
test50 10.201.113.0/24
test51 10.201.114.0/24
test52 10.201.115.0/24
test53 10.201.116.0/24
test54 10.201.117.0/24
test55 10.201.118.0/24
test56 10.201.119.0/24
test57 10.201.120.0/24
test58 10.201.121.0/24
test59 10.201.122.0/24
test60 10.201.123.0/24
test61 10.201.124.0/24
test62 10.201.125.0/24
test63 10.201.126.0/24
test64 10.201.127.0/24
test65 10.201.128.0/24
test66 10.201.129.0/24
test67 10.201.130.0/24
test68 10.201.131.0/24
test69 10.201.132.0/24
test70 10.201.133.0/24
test71 10.201.134.0/24
test72 10.201.135.0/24
test73 10.201.136.0/24
test74 10.201.137.0/24
test75 10.201.138.0/24
test76 10.201.139.0/24
test77 10.201.140.0/24
test78 10.201.141.0/24
test79 10.201.142.0/24
test80 10.201.143.0/24
test81 10.201.144.0/24
test82 10.201.145.0/24
test83 10.201.146.0/24
test84 10.201.147.0/24
test85 10.201.148.0/24
test86 10.201.149.0/24
test87 10.201.150.0/24
test88 10.201.151.0/24
test89 10.201.152.0/24
test90 10.201.153.0/24
test91 10.201.154.0/24
test92 10.201.155.0/24
test93 10.201.156.0/24
test94 10.201.157.0/24
test95 10.201.158.0/24
test96 10.201.159.0/24
test97 10.201.160.0/24
test98 10.201.161.0/24
test99 10.201.162.0/24
test100 10.201.163.0/24
test101 10.201.164.0/24
test102 10.201.165.0/24
test103 10.201.166.0/24
test104 10.201.167.0/24
test105 10.201.168.0/24
test106 10.201.169.0/24
test107 10.201.170.0/24
test108 10.201.171.0/24
test109 10.201.172.0/24
test110 10.201.173.0/24
test111 10.201.174.0/24
test112 10.201.175.0/24
test113 10.201.176.0/24
test114 10.201.177.0/24
test115 10.201.178.0/24
test116 10.201.179.0/24
test117 10.201.180.0/24
test118 10.201.181.0/24
test119 10.201.182.0/24
test120 10.201.183.0/24
test121 10.201.184.0/24
test122 10.201.185.0/24
test123 10.201.186.0/24
test124 10.201.187.0/24
test125 10.201.188.0/24
test126 10.201.189.0/24
test127 10.201.190.0/24
test128 10.201.191.0/24
test129 10.201.192.0/24
test130 10.201.193.0/24
test131 10.201.194.0/24
test132 10.201.195.0/24
test133 10.201.196.0/24
test134 10.201.197.0/24
test135 10.201.198.0/24
test136 10.201.199.0/24
test137 10.201.200.0/24
test138 10.201.201.0/24
test139 10.201.202.0/24
test140 10.201.203.0/24
test141 10.201.204.0/24
test142 10.201.205.0/24
test143 10.201.206.0/24
test144 10.201.207.0/24
test145 10.201.208.0/24
test146 10.201.209.0/24
test147 10.201.210.0/24
test148 10.201.211.0/24
test149 10.201.212.0/24
test150 10.201.213.0/24
test151 10.201.214.0/24
test152 10.201.215.0/24
test153 10.201.216.0/24
test154 10.201.217.0/24
test155 10.201.218.0/24
test156 10.201.219.0/24
test157 10.201.220.0/24
test158 10.201.221.0/24
test159 10.201.222.0/24
test160 10.201.223.0/24
test161 10.201.224.0/24
test162 10.201.225.0/24
test163 10.201.226.0/24
test164 10.201.227.0/24
test165 10.201.228.0/24
test166 10.201.229.0/24
test167 10.201.230.0/24
test168 10.201.231.0/24
test169 10.201.232.0/24
test170 10.201.233.0/24
test171 10.201.234.0/24
test172 10.201.235.0/24
test173 10.201.236.0/24
test174 10.201.237.0/24
test175 10.201.238.0/24
test176 10.201.239.0/24
test177 10.201.240.0/24
test178 10.201.241.0/24
test179 10.201.242.0/24
test180 10.201.243.0/24
test181 10.201.244.0/24
test182 10.201.245.0/24
test183 10.201.246.0/24
test184 10.201.247.0/24
test185 10.201.248.0/24
test186 10.201.249.0/24
test187 10.201.250.0/24
test188 10.201.251.0/24
test189 10.201.252.0/24
test190 10.201.253.0/24
test191 10.201.254.0/24
test192 10.201.255.0/24
test193 10.201.0.0/24
test194 10.201.1.0/24
test195 10.201.2.0/24
test196 10.201.3.0/24
test197 10.201.4.0/24
test198 10.201.5.0/24
test199 10.201.6.0/24
test200 10.201.7.0/24
test201 10.201.8.0/24
test202 10.201.9.0/24
test203 10.201.10.0/24
test204 10.201.11.0/24
test205 10.201.12.0/24
test206 10.201.13.0/24
test207 10.201.14.0/24
test208 10.201.15.0/24
test209 10.201.16.0/24
test210 10.201.17.0/24
test211 10.201.18.0/24
test212 10.201.19.0/24
test213 10.201.20.0/24
test214 10.201.21.0/24
test215 10.201.22.0/24
test216 10.201.23.0/24
test217 10.201.24.0/24
test218 10.201.25.0/24
test219 10.201.26.0/24
test220 10.201.27.0/24
test221 10.201.28.0/24
test222 10.201.29.0/24
test223 10.201.30.0/24
test224 10.201.31.0/24
test225 10.201.32.0/24
test226 10.201.33.0/24
test227 10.201.34.0/24
test228 10.201.35.0/24
test229 10.201.36.0/24
test230 10.201.37.0/24
test231 10.201.38.0/24
test232 10.201.39.0/24
test233 10.201.40.0/24
test234 10.201.41.0/24
test235 10.201.42.0/24
test236 10.201.43.0/24
test237 10.201.44.0/24
test238 10.201.45.0/24
test239 10.201.46.0/24
test240 10.201.47.0/24
test241 10.201.48.0/24
test242 10.201.49.0/24
test243 10.201.50.0/24
test244 10.201.51.0/24
test245 10.201.52.0/24
test246 10.201.53.0/24
test247 10.201.54.0/24
test248 10.201.55.0/24
test249 10.201.56.0/24
test250 10.201.57.0/24
test251 10.201.58.0/24
test252 10.201.59.0/24
test253 10.201.60.0/24
test254 10.201.61.0/24
test255 10.201.62.0/24
test256 10.201.63.0/24

Weshalb Docker hier nun mit dem Subnetz 10.201.64.0/24 begonnen hat ist mir ehrlich gesagt ein Rätsel - die davor liegenden Netze wurden dann ab dem Netz test193 noch vergeben.