首先我要说的是,我对 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
我安装网络的原因是,当我尝试访问数据库服务器时,出现与网络相关的错误。
经过长时间的研究,我发现当我volumes
在database
服务中使用时会返回错误。如果你尝试一下,你会发现当你尝试访问时phpmyadmin
你会得到同样的错误。
再次,经过长时间的研究,我发现如果我建立了一个网络,我可以volumes
使用database
。
现在,当我第一次运行时,它运行得很好。在测试文件夹中,我将数据库文件放在路径下的主机文件夹中/data/db
然后我使用命令停止了 docker compose docker-compose stop
,然后我移动到另一个文件夹,在其中我复制了docker-compose.yml
,然后运行了docker-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 范围/子网,但我认为这在一段时间内可能会变得一团糟。
有什么想法可以修复这个问题吗?
答案1
从您在此处显示的错误来看,在我看来,docker 正在尝试创建一个带有名为 br-791b388ece09 的桥接驱动程序的网络,然后该网络抱怨与桥接 br-a675c47764eb 有一个重叠的 IP 子网。
因此,首先使用以下命令检查可用网络:
$ docker network ls
如果您看到 ID 为 a675c47764eb 的网桥,请确保先删除该网桥,然后在同一子网上创建新的网桥,其用途如下:
$ docker network rm a675c47764eb
然后重新运行docker设置一群,它应该可以正确创建网络。
或者,您可以使用不同的 IP 子网。将 192.168.50.x 替换为 192.168.51.x 之类的地址。这应该也能解决您的问题。
答案2
列出所有网络
$ip a
如果你看到带有 br-a675c47764eb 的桥,并且它的状态为关闭,请将其删除
$brctl delbr br-a675c47764eb
然后重启docker
$service docker restart
再次运行 docker-compose
答案3
如果你在 Linux 系统上运行它,只需确认你iptables
已经打开了 docker-compose 所需的端口。像这样:
iptables -I INPUT -p tcp --dport 80 -s 0.0.0.0 -j ACCEPT
# or
vim /etc/sysconfig/iptables
# then
systemctl restart iptables
network
然后删除同一子网上的冲突:
docker network ls
docker network rm <id>
如果以上方法不起作用,只需重新启动docker,就应该没问题。