1

seo 优化:

  • 为什么docker-compose 网段冲突会和宿主机冲突?但是直接使用 docker 不会冲突?
  • docker网段冲突了怎么办?
  • docker默认网段和主机网段冲突解决
  • 本来好好的,新开了一个容器之后,突然无法登录虚拟机(宿主机),好像是 docker 网段冲突怎么办?

回答这个问题前,建议先看下面两篇文章:
docker0 和 br-xxxxxx 有什么区别?
为什么 docker-compose 创建的网络模式为什么不在 docker 四大类型中?

私网地址是: A类地址:10.0.0.0~10.255.255.255. B类地址:172.16.0.0 ~172.31.255.255. C类地址:192.168.0.0~192.168.255.255

原因分析:

docker 的虚拟网卡网段使用的是『B类地址』

如果是个人电脑,我们宿主机一般都是 192.168.xxx.xxx

所以,默认情况下,一切相安无事。

所以,如果你遇到冲突,一般是这样:一切都好好的,但是突然,无法登录主机了,连 ping 都 ping 不通

为什么呢?很简单,172 开头的网段被用完了,docker 就去侵犯 192.168 了

但是我们的宿主机用的网段就是 192.168,所以网段冲突,我们无法登录宿主机

你可能有疑问,172 可以分配超级多的 ip,怎么就用完了?因为每跑一个 docker-compose.yaml 都是要创建一个 br 开头的虚拟网卡的,分走一个 172.xxx。因为 B类地址范围是 172.16.0.0 ~172.31.255.255, 所以 172 开头的最多只能跑 15 个 docker-compose.yaml
当你需求太旺盛,一下子跑了 n 个 docker-compose.yaml,就可能导致 B 类地址被用完
最恶心的是,你执行 docker-compose down 之后,有些虚拟网卡不会被卸载,导致一直占用,所以并不是『同时15个把 B 类地址榨干』,而是『日积月累,把 B 类地址榨干』

图片.png

从此处可以看到,docker0 用的是 172.17.0.1

其他的 br 开头的都是 docker-compose 创建的虚拟网卡,也是 172.xxx.0.1

图片.png

但是因为我的这个机器是开发测试机器,所以我们会在上面运行 n 个 docker-compose.yaml

这久导致 172 的网段用完了,172 用完了,docker-compose 就去使用 192.168 开头的了,使用 192.168.16.1 的时候,就和我宿主机的 192.168.38.1 冲突了。

为什么这两个 192.168 开头的会冲突,和子网掩码长度有关系,一个是 192.168.16.1/20,另一个是 192.168.38.191/24

解决方案:

修改 /etc/docker/daemon.json 中的 default-address-pools

贴一下我的 /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://hz4anb2p.mirror.aliyuncs.com",
    "https://mirror.ccs.tencentyun.com"
  ],
  "default-address-pools": [
    {
      "base": "172.17.0.0/16",
      "size": 16
    },
    {
      "base": "172.21.0.0/16",
      "size": 24
    },
    {
      "base": "172.22.0.0/16",
      "size": 24
    }
  ]
}

这个时候需要重启 docker 服务

sudo service docker restart  

然后使用 docker-compose up -d 创建的新的服务组,就会在 172.21 下面了

已有的要使用 docker-compose down 先把原来的网络移除掉,不然会复用老的网络

然后我 docker-compose up -d 了两个容器组,然后使用 ip --color a 命令查看,可以看到,新的容器组的 ip 是 172.21 下面了

图片.png

参考:

设置bip无效
在daemon配置文件中单纯配置bip只对docker启动的容器有效,但是对docker-compose启动的容器无效。

Docker engine is started with --bip argument, but it is ignored by docker-compose, which set up an additional bridge interface in addition to the docker0 interface. It is named br-f4a912f7750b and has the typical Docker 172.17.x.x format, which happens to conflict with the network I’m currently using.

关于 bip ,我没有设置,我只修改了 default-address-pools


ponponon
3.2k 声望668 粉丝

Python 后端工程师可加:企鹅群:537131912