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",符合我们的预期需求。