
通过以上的比较可以发现,证实了之前所说的:守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名。 同时,守护进程还会从网桥 docker0 的私有地址空间中分配一个 IP 地址和子网给该容器,并设置 docker0 的 IP 地址为容器的默认网关。也可以安装 yum install -y bridge-utils 以后,通过 brctl show 命令查看网桥信息。 对于每个容器的 IP 地址和 Gateway 信息,我们可以通过 docker inspect 容器名称|ID 进行查看,在 NetworkSettings 节点中可以看到详细信息。
我们可以通过 docker network inspect bridge 查看所有 bridge 网络模式下的容器,在 Containers 节点中可以看到容器名称。
1.服务器位于172.16.251.23,我的主机位于192.168.2.163,均属于内网环境且我的主机和其他的172.16.251.X的服务器主机均可以相互访问 2.我的主机和服务器不能通信,通过排查,发现是23服务器上的一个docker服务使用bridge 网络模式所自动生成的网络配置以及路由信息有冲突,本应有一条172.16.251.1跳转到192.168.2.1的路由信息即可正常访问,但与前面提到的docker服务发生冲突,导致双方不能通信
由于路由冲突,所以要么修改docker服务的网络配置,要么停止docker服务并删除对应的路由信息。这里以停止docker服务,删除docker服务,删除对应的路由信息为例解决。
Ubuntu 18.04,docker 24.0.5
举例:
容器ID为 77cdd9f2bfb0,容器name为dtm_dtm_1, 路由表名称为 br-227c0ea4a1cf,docker bridge 网络模式配置名为227c0ea4a1cf 的自动生成的路由信息,和192.168.2.1冲突,导致192.168.2.1网络访问不到172.16.251.23
i. 我们先通过ip route查看路由表,找到冲突的那一条路由信息,并查看路由名称。

其中br后面的字符串就是接下去要用到的docker网络ID。
ii. 使用docker network ls查看docker 容器的网络配置列表信息。
补充: 默认情况下,创建的容器在没有使用 --network 参数指定要加入的 docker 网络时,默认都是加入 Docker 默认的单机桥接网络,也就是下面的 name 为 bridge 的网络。
其中第一列即为网络ID,和前面查看的网络ID进行对应。(我这里由于已经删除所以没有显示)
iii. 接着使用docker network inspect <前面的网络ID>查看bridge模式自动生成的网络配置详细信息。

知道了对应的容器ID,通过docker stop <容器ID>停止对应容器服务。
2 删除docker 的对应容器服务
使用 docker rm <容器ID> 删除容器服务

3 删除docker对应容器的网络配置信息
使用docker network rm <容器对应网络ID>删除对应网络配置信息

此时系统路由表中的docker自动生成的路由信息被自动删除了。
4.手动添加路由信息




5.测试互通性
服务器:

本地主机:

至此,由于路由冲突的问题得到解决。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。