
原文在这https://www.chengpei.top/archives/openwrt-docker-network最近升级了软路由的OpenWRT系统后规划docker网络是个麻烦的事情原来一直是创建一个自定义的docker network启动容器时指定IP即可这样容器到软路由或者内网其他设备之间都是互通的也不需要映射端口。但是升级了OpenWRT系统后就不行了自定义的docker network不管是跟宿主机还是内网其他设备都是不能互通的很奇怪。问题现象通过docker network create创建的自定义网络172.20.0.0/24跟宿主机都不能互通但是测试不指定自定义的网络用默认的网络又可以互通但是问题在于默认网络无法指定IP地址这样每次重启软路由容器IP可能都会发生变化不方便我进行端口映射。原因好像是因为新版本的OpenWRT使用的 fw4/nftables 与 Docker 默认使用的 iptables 规则存在兼容性问题但严格来说不是简单的“iptables 冲突”而是两套防火墙管理体系并存导致规则无法按预期生效。所以我想到能不能直接把自定义网络生成的网桥设备br-xxxxxx直接挂接到接口docker0上去但是操作后发现接口里修改docker0设备选br-xxxxxx一保存这个网桥设备就没了后来了解到Docker 创建的网桥设备属于 Docker 管理对象不属于 OpenWrt 网络配置管理对象OpenWrt 保存配置后netifd 会尝试接管这个设备。但是 Docker 的 bridge network 设备生命周期由 Docker daemon 管理当OpenWrt 网络服务重载时netifd 重载网络、删除未知/非配置管理的 bridge、Docker bridge 被删除反正无法在openwrt的接口编辑里选择Docker创建的网桥设备。解决方案既然不能选择Docker创建的网桥设备那我可不可以先在OpenWRT里创建网桥设备然后docker network create时指定网桥设备呢经过尝试确实可以我现在接口-设备-添加设备配置里添加设备类型网桥指定一个名称docker1其实就是增加以下配置到/etc/config/networkconfig device option type bridge option name docker1然后创建接口dockervlan指定这个网桥设备同时防火墙配置指定到区域docker网桥设备、接口准备好后再使用以下命令创建docker网络docker network create \ --driver bridge \ --subnet 172.20.0.0/24 \ --gateway 172.20.0.1 \ --opt com.docker.network.bridge.namedocker1 \ docker_vlan这时创建的网络就是直接使用OpenWRT中创建的网桥了同时记得防火墙配置里把docker到lan区域的转发打开最终效果网络准备好后再通过以下命令创建容器docker run --restartalways --network docker_vlan --ip 172.20.0.2 --name registry -d registry:2这时创建的容器即有固定IP也可以和内网互通了外网要访问指定容器的服务就可以在端口映射里直接指定172.20.0.0/24这个网段的IP端口了