近日创建新容器时总后,程序报告无法连接数据库,ping容器的ip后居然不通
网络环境(stf_default是我在用的):
删除stf_default,重新创建: docker network create stf_default --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1
系统提示有冲突,无法创建:
[root@invir63121 del]# docker network create stf_default --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1
Error response from daemon: cannot create network 56494b06d689c99f729de840c6def4cf3d99762130d208125228779d107fa01d (br-56494b06d689): conflicts with network 1247eaab9b14d056e07386b58cebc06b890ad05cb3761eb097694e19c13c3c27 (br-1247eaab9b14): networks have overlapping IPv4
[root@invir63121 del]# docker network create stf_default --driver bridge --subnet=172.18.0.0/16
Error response from daemon: cannot create network bc78b0fbe7ea8662287e4ffcefaeb4540d779872edc3be1a4e3d9dd72c0ab8bb (br-bc78b0fbe7ea): conflicts with network 241da41929109a1eafa7d5fad64360febe36771a9ddda8ebbe87ae1cb7535741 (br-241da4192910): networks have overlapping IPv4
[root@invir63121 del]# docker network create stf_default --driver bridge --subnet=172.18.0.0/24 --gateway=172.18.0.1
Error response from daemon: cannot create network 49d28eaa1138dc1194938bb8220d83ff350244969de11e1d21a6e45a48bb094f (br-49d28eaa1138): conflicts with network b7fffd94bd26590f68108adb9cf899ece0c1fcc4a3c2fcd3d18914dc945b773f (br-b7fffd94bd26): networks have overlapping IPv4
用docker network inspect 去检查 docker network ls输出的,没找到用172.18.0.0/16的网络。
在centos用 ifconfig 一看,发现创建了好几个网桥
用 sudo ip link delete <bridge_name> 把这几个使用172.18.0.0/16的网桥删除
再用 docker network create stf_default --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 创建网桥,成功!
用docker network connect brId contId 把网络和容器关联起来,重启容器,程序恢复正常
所以,网上说容器ping不通,要删除所有容器是错的,要用ifconfig看看是不是有多个网桥
附docker是如何与系统通讯的: 在Docker中,网络通信是通过Linux的网络命名空间和网络桥接实现的。以下是大致的流程:
- Docker创建了自己的网桥设备(默认为bridge)作为虚拟网桥,并将该网桥的一端连接到物理网卡上。这个网桥扮演着中转网络数据的角色。
- 当Docker守护进程启动时,它会在主机上创建一个默认的docker0网桥,并为容器提供网络连接。
- 每个Docker容器都有一个自己独立的网络命名空间,这些网络命名空间里面有着自己的网络接口和网络设备。
- 当你创建一个Docker容器时,Docker会为该容器创建一个veth pair,其中一个端口连接到容器的网络命名空间中,另一个端口连接到主机的网络命名空间中。
- Docker将这个veth pair的一端放入容器的网络命名空间中,该网络命名空间的网络设备与主机上的网络设备相连。
- Docker还为容器配置IP地址,以及通过NAT来实现内部和外部网络之间的通信。NAT会将宿主机上的网络流量转发到相应的容器网络中。
- 即使容器和宿主机在不同的网络命名空间中,它们之间的通信也是通过网桥完成的。宿主机上的网络流量会经过网桥,通过指定的端口连接到相应的容器网络。
总结起来,在Docker中,网络命名空间和网络桥接提供了一种将Docker容器与宿主机及其他容器进行通信的方式。通过在容器中创建网络接口、配置IP地址,并将容器的网络连接到网桥上,Docker实现了容器与宿主机以及其他容器之间的网络连接和通信。