我有这样的docker-compose.yml(这里不是完整的列表(:
version: '2'
services:
nginx:
build: ./nginx/
ports:
- 8080:80
links:
- php
volumes_from:
- app
networks:
app_subnet:
ipv4_address: 172.16.1.3
php:
build: ./php/
expose:
- 9000
volumes_from:
- app
networks:
app_subnet:
ipv4_address: 172.16.1.4
networks:
app_subnet:
driver: bridge
ipam:
config:
- subnet: 172.16.1.0/24
gateway: 172.16.1.1
在docker-compose up
之后,我得到了这样一个错误:
只有在连接到时才支持用户指定的IP地址具有用户配置的子网的网络
所以我用docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_subnet
创建子网
但这并不能解决问题,因为docker compose会动态创建名为dev_app_subnet的子网。我的子网没有被使用——我也收到了同样的错误。这样做的主要目的是为nginx服务分配静态IP——从etc/hosts文件打开我的项目web url。
[SOLVED]找到解决方案。当指向网络时,我们应该使用"外部"标志来告诉compose网络已经创建,应该带到外部(否则它将使用项目前缀动态创建(:
networks:
app_subnet:
external: true
因此,在该docker compose之后,将容器附加到现有的app_subnet
在此之前,必须创建子网:
docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_subnet
在我的情况下,是我第一次运行docker-compose up
失败,但网络已经创建,可以看到使用docker network ls
。
在这种情况下,只需docker-compose down
,修复yml,重新运行docker-compose up
即可。
很可能在上次运行脚本时已经创建了网络接口,但没有子网参数。
为了修复它,运行
docker network ls -a
并删除阻止创建服务的网络
docker network rm <network interface id>
添加到Qiushi的答案中,您可以使用docker-compose 3.9
版本来指定外部网络,如下所示。
version: "3.9"
networks:
network1:
external: true
name: etl_subnet
参考编号:https://docs.docker.com/compose/compose-file/compose-file-v3/#network-配置参考
具体来说,如果您使用docker堆栈部署来部署集群。您需要将子网的范围指定为"群":
docker网络创建--网关172.16.1.1--子网172.16.1.0/24--scope swarm app_subnet
在docker-compose.yml中,您需要将外部网络指定为:
网络:默认值:外部:名称:etl_subnet
将其用作默认值。