文章目录
- 一、问题分析
- 二、解决方案
- 1、网段分配
- 2、修改docker配置
- 3、docker-compose配置
- 4、工作机制
- 5、网段创建验证
- 6、容器IP验证
一、问题分析
docker0
网桥默认是172段的一个地址172.17.0.1,如果刚好自己的宿主机服务器也处于这个网段,那这很容易冲突,会抢占172.17.x.x的网关,数据包会默认优先发到docker0
的172.17.0.1地址上导致跨网段网络不通,从而导致和宿主机失联,下面分享下如何避免这个问题。
二、解决方案
1、网段分配
选择一个不常用的A、B、C段
私有网段,并和自己所处的网段划分确认,没有冲突即可,我这里选择10.255.1.0/16
2、修改docker配置
修改/etc/docekr/daemon.json
配置
{
"bip": "10.255.0.1/24", // 默认网桥占用10.255.0.0/24段,避免直接配置10.255.0.1/16,这样默认就占用整个网段,不利于后面自定义网络的使用,剩余网段10.255.1.0-10.255.255.0可用于自定义网络
"default-address-pools": [
{
"base": "10.255.1.0/16", //基础网段,可用范围 10.255.1.0 ~ 10.255.255.255
"size": 24 //每个子网的大小为 /24(即 256 个 IP 地址)
}
],
...
}
改完记得重启docker服务
:
$ systemctl restart docker
3、docker-compose配置
docker-compose
中的网络配置示例
docker-compose1:
...
networks:
project-a:
driver: bridge
ipam:
config:
- subnet: 10.255.1.0/24
docker-compose2:
...
networks:
project-b:
driver: bridge
ipam:
config:
- subnet: 10.255.2.0/24
4、工作机制
1)当你创建新网络时:
Docker
会从 10.255.1.0/16 中分配一个未使用的 /24 子网。
· 第一个网络可能获得 10.255.1.0/24
· 第二个网络可能获得 10.255.2.0/24
· 依此类推…
2) 每个子网的网关默认是子网的第一个 IP
(如 10.255.1.1)。
3)与 bip
的协同
- 默认网桥(
docker0
):占用 10.255.0.0/24,网关为 10.255.0.1。 - 自定义网络:从 10.255.1.0/16 分配子网(如 10.255.1.0/24),网关为 10.255.1.1。
两者不会冲突,因为网段不同。
5、网段创建验证
使用docker-compose
创建两个项目之后查看
会发现会有三个网段的创建,网关分别是10.255.0.1、10.255.1.1、10.255.2.1
6、容器IP验证
查看每个容器的IP
$ docker ps -q | xargs -I {} docker inspect -f '{{.Name}}: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' {} | sed 's/^\///'
可以看到两个项目的容器分别处于10.255.1.0/24和10.255.2.0/24两个子网
这样就可以避免这个问题了