问题背景

有两台服务器,上游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将容器与目标网络连接。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐