问题背景
有两台服务器,上游nginx主机(ip:172.19.x.x)、下游nginx主机(172.17.x.x),某天发现从上游nginx主机ping
不通下游nginx主机,回想最近在下游nginx主机上操作过docker compose up,细查发现,除了docker0网卡(ip:172.18.0.1),还有docker compose up
执行时创建的网卡br-4f284f2c67de(ip:172.19.0.1),与上游nginx主机是同一个网段,导致失败。
分析
查阅资料得知,每个docker-compose.yml
都会创建一个网络,相应创建的容器会连接这个网络,从而可以通信,因为宿主机是172.17.x.x
网络,所以docker第一次创建网络docker0时,创建了172.18.x.x
网络,docker compose up时,又创建一个新的网络172.19.x.x
,恰好与局域网内172.19.x.x
网段的服务器冲突,故此出现网络不通;解决思路是干掉这个网络。
解决
-
首先要,停掉容器并删除容器、删除网络
执行docker compose down
-
其次,从根上解决,
docker-compose.yml
中使用指定网络
version: '3'
services:
app1:
build: ./app1
networks:
- my_network
networks:
my_network:
driver: bridge
ipam:
driver: default
# 使用非局域网网段
subnet: 172.20.0.0/16
gateway: 172.20.0.1
docker创建容器情况下的解决办法
如果是使用docker创建的容器,可以使用docker network disconnect先将容器从网络中摘下来,然后使用docker network create创建指定网段网络,再使用docker network connect将容器与目标网络连接。