Docker Compose 返回错误“网络具有重叠的 IPv4”

Kod*_*.Me 4 docker docker-compose

首先说我对 Docker 完全陌生,我还不熟悉 Docker 生态系统。

我尝试执行的是创建一个docker-composer.yml在我的项目的本地开发环境中使用的。

我已经将wp-local-docker用于我的 WordPress 项目,但我也有一些旧项目具有不同的要求,因此,我做了自己的docker-compose.yml. 我自己的代码docker-compose.yml如下:

version: "3.4"
services:
   database:
      image: mysql:latest
      ports:
         - "3306:3306"
      environment:
         MYSQL_ROOT_PASSWORD: password
         MYSQL_DATABASE: appdb
         MYSQL_USER: appuser
         MYSQL_PASSWORD: password
      volumes:
         - $PWD/data/db:/var/lib/mysql
      networks:
          app_net:
              ipv4_address: 192.168.50.10
   phpmyadmin:
      image: phpmyadmin/phpmyadmin:latest
      links:
         - database:mysql
      ports:
         - "8181:80"
      environment:
         MYSQL_ROOT_PASSWORD: password
         MYSQL_USER: appuser
         MYSQL_PASSWORD: password
         PMA_HOST: mysql
         PMA_PORT: 3306
         PMA_USER: appuser
         PMA_PASSWORD: password
      networks:
         app_net:
            ipv4_address: 192.168.50.11
   web:
      build: $PWD/ApachePHP
      depends_on:
         - database
      links:
         - database:mysql
         - mailcatcher
      ports:
         - "8080:80"
         - "443:443"
      volumes:
         - $PWD/www:/var/www/html
         - $PWD/ApachePHP/000-default.conf:/etc/apache2/sites-available/000-default.conf
      environment:
         - MYSQL_ROOT_PASSWORD=appuser
         - MYSQL_ROOT_USER=password
      networks:
         app_net:
            ipv4_address: 192.168.50.12
   mailcatcher:
      image: schickling/mailcatcher
      ports:
         - "1025:1025"
         - "1080:1080"
      environment:
         MAILCATCHER_PORT: 1025
      networks:
         app_net:
            ipv4_address: 192.168.50.13
networks:
   app_net:
      driver: bridge
      ipam:
         driver: default
         config:
            - subnet: 192.168.50.0/24
Run Code Online (Sandbox Code Playgroud)

我安装网络的原因是,当我尝试访问数据库服务器时,出现与网络相关的错误。

经过长时间的研究,我发现当我使用volumesin databaseservice 时,我会返回错误。如果你尝试一下,你会发现当你尝试访问时,phpmyadmin你会得到同样的错误。

再次,经过长时间的研究,我发现如果我设置了网络,我可以使用volumesfor database

现在,当我第一次运行时,这就像一个魅力。在 test 文件夹中,我的主机文件夹中的数据库文件位于路径下/data/db

然后我使用命令停止了 docker compose docker-compose stop,然后我移动到另一个文件夹,在其中复制docker-compose.ymldocker-compose up.

不幸的是,这次我收到以下错误:

Creating network "corfurealestatedch_app_net" with driver "bridge" ERROR: cannot create network 791b388ece09120f1138d48427969c23ded22c6fc73699b7f8c2c8e195b59586 (br-791b388ece09): conflicts with network a675c47764eba17e3338860f56512067df580cef31415906ec57fa3b64f3cdab (br-a675c47764eb): networks have overlapping IPv4

所以问题是我是否可以docker-compose.yml以一种可以在我的本地项目中使用它而不与其他容器 IP 冲突的方式来设置它。

我知道,当然我可以为每个项目使用不同的 IP 范围/子网,但我认为这可能会在一段时间内变得一团糟。

关于如何解决这个问题的任何想法?

小智 7

从您在此处显示的错误来看,在我看来,docker 正在尝试使用名为 br-791b388ece09 的网桥驱动程序创建网络,然后该网桥驱动程序抱怨 IP 子网与网桥 br-a675c47764eb 重叠。

因此,首先使用以下方法检查您的可用网络:

$ docker network ls
Run Code Online (Sandbox Code Playgroud)

如果您看到 ID 为 a675c47764eb 的网桥,请确保在同一子网上创建新网桥之前先将其删除,用于此用途:

$ docker network rm a675c47764eb
Run Code Online (Sandbox Code Playgroud)

然后重新运行swarm的 docker 设置,它应该正确地创建网络。

或者,您可以使用不同的 IP 子网。将 192.168.50.x 替换为 192.168.51.x 之类的内容。这也应该可以解决您的问题。


小智 5

列出所有网络

$ip a
Run Code Online (Sandbox Code Playgroud)

如果您看到带有 br-a675c47764eb 的桥并且其状态为关闭,请将其删除

$brctl delbr br-a675c47764eb
Run Code Online (Sandbox Code Playgroud)

然后重启docker

$service docker restart
Run Code Online (Sandbox Code Playgroud)

再次运行 docker-compose