背景
集团有N个基地,所有基地的网络使用的是172.x.x.x网段,这本身没有什么问题!但Docker默认的桥接网段也是172.17.x.x的,如果不修改docker的默认配置会导致个别基地无法访问!列举几个基地使用的网段
基地 | 网段 |
---|---|
A基地 | 172.30.x.x |
B基地 | 172.28.x.x |
C基地 | 172.18.x.x |
如果不修改docker默认配置,随着容器创建得越多,最终总会和某个基地冲突。
参考拓展知识:docker默认子网创建规则
一、检查服务器中的Docker网络情况
检查docker的子网配置
使用 ifconfig docker
查看docker默认分配的子网
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:f6ff:fee8:ad97 prefixlen 64 scopeid 0x20<link>
ether 02:42:f6:e8:ad:97 txqueuelen 0 (Ethernet)
RX packets 42355 bytes 67869451 (64.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 55344 bytes 9332802 (8.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
说明:如果此处显示的172.x.x.x则代表是隐患网段,需要更改。
检查docker容器已分配的子网
使用docker network inspect $(docker network ls -q) | grep Subnet
查看Docker是否已经创建网络
[root@yw_did_test ~]# docker network inspect $(docker network ls -q) | grep Subnet
"Subnet": "172.17.0.0/16",
"Subnet": "172.23.0.0/16",
"Subnet": "172.20.0.0/16",
如果命令执行后有数据返回并且是172.x.x.x的网段,则代表已经创建network,并分配了存在隐患的网段,需要更改。
参考拓展知识:docker默认子网创建规则
二、修改默认子网
场景1:新装Docker(无正在运行的容器
-
编辑配置文件
vi /etc/docker/daemon.json
,新增一条配置"bip":"192.22.0.1/24"
-
重启docker和加载文件
sudo systemctl daemon-reload && systemctl restart docker
-
然后使用
ifconfig docker
命令查看是否生效,效果如下:[root@op-manager-center-prod ~]# ifconfig docker
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.22.0.1 netmask 255.255.255.0 broadcast 192.22.0.255
ether 02:42:9d:8d:d8:92 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
场景2:修改原有Docker(有正在运行的容器)
注意:docker run 时如果没有手动指定子网,会自动按照默认规则创建子网,即使按照场景1进行更改也无法生效。 参考拓展知识:docker默认子网创建规则
解决思路和步骤:
- 停止容器
- 按照场景1修改默认子网
- 删除已有容器的network
- 手动关联容器的网络
- 再启动容器
<>Docker-Compose 自动创建的网桥与局域网冲突解决方案 - 知乎 (zhihu.com)
三、docker-compose修改方式
注意:docker-compose的运行方式与默认的docker网络模式不同,也就是说就算修改了默认子网,docker-compose up -d也是默认使用172.x.x.x,如果是docker-compose可以不修改上面的网络
解决方案:指定网络
#se版本,向下兼容,我选的最高版本
version: "3.3"
# 定义服务
services:
#省略
network:
- default-network
networks:
default-network:
driver: bridge
ipam:
config:
- subnet: 192.22.1.0/24
拓展知识
-
docker默认子网创建规则
当您使用默认的桥接网络模式(bridge)时,Docker 会为每个容器创建一个独立的子网,并为每个子网分配一个 CIDR 地址范围。在默认情况下,Docker 使用 172.17.0.0/16 CIDR 地址范围来创建这些子网。
每次创建容器时,Docker 会从该 CIDR 地址范围中选择一个未被使用的子网,并将容器分配到该子网中的一个 IP 地址。
假设您已经运行了 10 个容器,并且每个容器都位于独立的子网中。每个子网的 IP 范围都是 /16,这意味着每个子网有约 65534 个可用 IP 地址(除去网络地址和广播地址)。
Docker 在默认情况下会按顺序分配子网的 IP 地址,每个子网的 IP 范围如下所示:
子网1:172.17.0.1 - 172.17.255.254
子网2:172.18.0.1 - 172.18.255.254
子网3:172.19.0.1 - 172.19.255.254
子网4:172.20.0.1 - 172.20.255.254
子网5:172.21.0.1 - 172.21.255.254
子网6:172.22.0.1 - 172.22.255.254
子网7:172.23.0.1 - 172.23.255.254
子网8:172.24.0.1 - 172.24.255.254
子网9:172.25.0.1 - 172.25.255.254
子网10:172.26.0.1 - 172.26.255.254