docker 网络与宿主机网络冲突的解决

发布于:8/30/2022, 1:55:25 PM @孙博
技术分享 | Docker,docker_gwbridge
许可协议:署名-非商业性使用(by-nc)

如果使用默认安装方式,Docker 会创建一个网络名称为 docker_gwbridge,网段为 172.18.0.0/16 的子网。由于该网段往往也会使用在正式环境中,当网络发生冲突时,Docker 所在的机器通常将无法正常与外部通信,包括使用 curl 命令等都将无法正常发送请求。

为了解决这个问题,需要将默认的 docker_gwbridge 移除,并重新生成一个其他网段的子网代替。步骤如下:


  1. 移除 docker_gwbridge
[root@tv8-ebk-spider-01 ~]# docker network rm docker_gwbridge 

但往往无法一次成功,大概率会遇到如下错误:

[root@tv8-ebk-spider-01 ~]# docker network rm docker_gwbridge 
Error response from daemon: error while removing network: network docker_gwbridge id xxxxxxxxxxxx has active endpoints

通过 docker network inspect docker_gwbridge 查看详情,在 Container 节点中往往可以看到一个 ingress-sbox 容器,名称为 gateway_ingress-sbox 正在使用该网络。那么按照如下操作断开连接再重新删除即可:

[root@tv8-ebk-spider-01 ~]# docker network disconnect -f docker_gwbridge gateway_ingress-sbox
[root@tv8-ebk-spider-01 ~]# 
[root@tv8-ebk-spider-01 ~]# docker network rm docker_gwbridge
docker_gwbridge
  1. 重新设置新的 docker_gwbridge 网络
    假设我们将子网设置为 192.168.16.0/24,只要与生产环境其他机器没有冲突即可。
[root@tv8-ebk-spider-01 ~]# docker network create --subnet 192.168.16.0/24 --opt com.docker.network.bridge.name=docker_gwbridge --opt com.docker.network.bridge.enable_icc=false --opt com.docker.network.bridge.enable_ip_masquerade=true docker_gwbridge
xxxxxxxxxxxxxxxxxxxxxxx

此时网络应该就已经恢复了,可以使用 curl 命令试一下。

[root@tv8-ebk-spider-01 ~]# curl baidu.com
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
[root@tv8-ebk-spider-01 ~]#