Docker修改默认分配网桥子网
docker修改默认分配网桥子网
在安装完docker,启动容器时,docker会为容器默认分配一个容器子网,一般为172.17.0.0/24,当该虚机运行其他容器需要创建额外的网桥,可能会造成与现有虚机或物理网络重复的情况,这样容器网络通信的时候就会出问题。
为了避免此问题,我们可在安装docker时,指定一个默认的网桥子网(综合公司现有的网络,挑选一个未使用到的),让后续启动的容器都在这个子网里创建网桥或者容器ip。
一、现有docker配置文件
[root@]# cat /etc/docker/daemon.json { "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com" ], "max-concurrent-downloads": 10, "log-driver": "json-file", "log-level": "warn", "log-opts": { "max-size": "10m", "max-file": "3" }, "data-root": "/data/docker" }
二、查询路由及网桥
路由:
[devops@ ~]$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.0.1 0.0.0.0 UG 100 0 0 eth0 10.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0 10.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br-42e15d40f8c0 172.16.0.0 0.0.0.0 255.255.0.0 U 100 0 0 eth0 172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-923ad69f1d3a 172.20.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-7bc6e6211d81 172.27.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-06cde0ff36a6 172.29.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-b756cddb71d9
网桥:
[root@03-centos7-redis devops]# docker network ls NETWORK ID NAME DRIVER SCOPE 50495afe3b3e bridge bridge local b756cddb71d9 dingtalk_default bridge local 923ad69f1d3a elastalert-docker-error_default bridge local 06cde0ff36a6 elastalert-docker_default bridge local 7bc6e6211d81 elastalert_default bridge local 0a2bdd5dca5f host host local 6a8d68b1a026 none null local 42e15d40f8c0 skywalking_default bridge local [root@03-centos7-redis devops]#
由上可发现,每个容器启动都会创建一个网桥,并分配一个子网,该容器在此子网内分配ip。若分配的子网与主机网络有冲突,势必会造成主机网络通信故障的问题。此时为避免,我们可以来修改docker默认分配的子网地址。
当然我们也可以在创建新的容器时,指定新运行容器使用已有的网桥,来分配ip,然后接入到这个虚拟网卡上。
二、指定docker默认分配的子网
可在docker配置文件中添加以下配置,重启docker即可。
{ "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com" ], "default-address-pools":[ { "base":"10.168.0.0/16", "size":24 } ], "max-concurrent-downloads": 10, "log-driver": "json-file", "log-level": "warn", "log-opts": { "max-size": "10m", "max-file": "3" }, "data-root": "/data/docker" }
三、重启docker
[root@]# systemctl restart docker
注:已创建的容器会继续使用已绑定的网桥进行通信,不清除的话,默认还会存在。所以需要将容器down掉,重新创建一个网桥并使用新的网桥来分配ip。
四、将现有容器停掉,重启启动
1、如果是docker-compose启动的容器,只需要docker-compose down -v即可,默认会remove掉当前使用的网桥,在docker-compose up -d时,会根据docker默认配置来新建一个网桥,而这个网桥便会使用我们前面指定的默认子网的ip。
2、如果是单纯的docker启动的容器,在我们修改完docker默认配置后,该默认网桥的子网就会更新为我们指定的子网,可通过查询来验证:
[root@]# docker network ls NETWORK ID NAME DRIVER SCOPE 0406a0ffc50e bridge bridge local eb3642010b55 host host local 07824f95dc1c none null local
而docker的四种网络模式里,默认使用bridge的方式来创建容器,及上面的ID为0406a0ffc50e的网桥,此时我们可以通过docker inspect来查看网桥子网是否更新:
[root@aicc-prod-0005 skywalking]# docker inspect 040 [ { "Name": "bridge", "Id": "0406a0ffc50ea4f6513610fd6b4422368e33f99b6266ca2a035ee8e37873d785", "Created": "2022-12-23T13:54:07.173725469+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "10.168.0.0/24" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ]
根据以上输出结果,我们可以得出结论,该默认网桥的子网与我们预期设置的一致,后续在启动容器会在10.168.0.0/24这个子网中分配容器ip,不会在出现容器网络与虚机网络重复的状况。
五、docker-compose运行的容器
若使用docker-compose来运行容器,则会在我们docker配置文件中指定的子网("base":"10.168.0.0/16",)中随机分配一个,
[root@]# docker network ls NETWORK ID NAME DRIVER SCOPE 0406a0ffc50e bridge bridge local eb3642010b55 host host local 07824f95dc1c none null local e898ed909bb2 skywalking_default bridge local
查看skywalking_default网桥的属性
[root@]# docker inspect e89 [ { "Name": "skywalking_default", "Id": "e898ed909bb2d86a72df9dc78ca2eb80262436ab8e2a55101550e7b4fd8b6c9f", "Created": "2022-12-23T14:44:35.387692498+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "10.168.9.0/24", "Gateway": "10.168.9.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "ab21f08a854f6694d89c8670715fe3fb0404cef85f668c36389dd55df18427c1": { "Name": "skywalking-oap", "EndpointID": "3f6c42cd02c6be20f7bc1fe6a571dc0296757d46602e4bb9363cd59eeb3e40e1", "MacAddress": "02:42:0a:a8:09:02", "IPv4Address": "10.168.9.2/24", "IPv6Address": "" }, "f1986ce4136a9b775ea909287cb88d3ac6d67a8b517a2d86b1007033ce989fa9": { "Name": "skywalking-ui", "EndpointID": "29f64dc883863ee3447dc01e7482550e1b0d19e77d0a0d2f84db1d0f52c4e83a", "MacAddress": "02:42:0a:a8:09:03", "IPv4Address": "10.168.9.3/24", "IPv6Address": "" } }, "Options": {}, "Labels": { "com.docker.compose.network": "default", "com.docker.compose.project": "skywalking", "com.docker.compose.version": "2.14.0" } } ]
以上可发现,skywalking_default网桥分配的子网为"Subnet": "10.168.9.0/24",符合我们的预期需求。