前言

docker 一键部署爽,内网冲突火葬场。最近实施去客户那边调试,某个屋的设备可以连上网关,而某个屋的设备都不行,找了半天没有找到原因,于是晚上直接一个电话敲到了我这里,让我帮忙康康

寻找原因

之前也遇到过了这种情况,简单排除掉了物联网设备那边的网关设置问题,马上想到了 docker 的问题,docker network ls 一看,发现 docker 和 docker-compose 占用的客户的地址,客户使用了 172.0.0.0/8 做为内网地址(不是很标准的做法,但是很常见),docker 占用了 172.17.0.0/16 作为桥接地址,docker-compose 跑了个 Harbor ,把 172.18.0.0/16 也给占了,物联网设备那边的网关下一跳是 172.18.12.1 ,于是华丽丽的冲突了,物联网路由访问咱们网关机器不通,于是连接不上

修改 Docker 桥接网段

非常简单,有个 bip 的设置

vim /etc/docker/daemon.json

"bip":"10.255.0.1/16"

注意 json 文件的格式不要整错,尤其要注意花括号和逗号,不要打多或者打少(所以我并不喜欢用 json 做配置文件,ini 要好很多,哪怕是吃缩进的 yaml 也好啊),然后 systemctl restart docker 搞定

修改 docker-compose 桥接网段

这个稍微复杂一些,这台机器 docker-compose 的是 Harbor ,我们就用它做例子

首先需要手动创建一个 docker 桥接网段

docker network create harbor2 --subnet=10.254.0.0/16

然后修改 Harbor 的 docker-compose.yml 文件,让它使用咱们创建的这个网络

# 这个是之前的
networks:
harbor:
external: false

# 修改成这样
networks:
default:
external:
name: harbor

这样就解决了 docker 和 docker-compose 的网段冲突问题~