Docker 编写 yml 静态 IP 地址
Docker compose yml static IP addressing
我有这样的 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
之后出现这样的错误:
User specified IP address is supported only when connecting to
networks with user configured subnets
所以我正在使用 docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_subnet
创建子网
但这并不能解决问题,因为 docker-compose 会即时创建名称为 dev_app_subnet 的子网。而且我的子网未被使用 - 我遇到了同样的错误。
这样做的主要目的是为 nginx 服务分配静态 IP - 打开我的项目 web url from etc/hosts file.
[已解决] 已找到解决方案。当指向网络时,我们应该使用标志 "external" 告诉 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 堆栈部署来部署 swarm 集群。并且您需要将子网的范围指定为'swarm':
docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24
--scope swarm app_subnet
在docker-compose.yml中需要指定外网为:
networks: default:
external:
name: etl_subnet
默认使用它。
在我的例子中是我第一次运行 docker-compose up
失败,但是网络已经创建,可以看到使用docker network ls
。
这种情况,只要docker-compose down
,修改yml,重新运行docker-compose up
即可
很可能在脚本的前一个 运行 中,网络接口已经创建但没有子网参数。
修复它 运行
docker network ls -a
并删除阻止创建服务的网络
docker network rm <network interface id>
加入秋实的回答,可以使用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-configuration-reference
我有这样的 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
之后出现这样的错误:
User specified IP address is supported only when connecting to networks with user configured subnets
所以我正在使用 docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_subnet
但这并不能解决问题,因为 docker-compose 会即时创建名称为 dev_app_subnet 的子网。而且我的子网未被使用 - 我遇到了同样的错误。 这样做的主要目的是为 nginx 服务分配静态 IP - 打开我的项目 web url from etc/hosts file.
[已解决] 已找到解决方案。当指向网络时,我们应该使用标志 "external" 告诉 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 堆栈部署来部署 swarm 集群。并且您需要将子网的范围指定为'swarm':
docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 --scope swarm app_subnet
在docker-compose.yml中需要指定外网为:
networks: default: external: name: etl_subnet
默认使用它。
在我的例子中是我第一次运行 docker-compose up
失败,但是网络已经创建,可以看到使用docker network ls
。
这种情况,只要docker-compose down
,修改yml,重新运行docker-compose up
即可
很可能在脚本的前一个 运行 中,网络接口已经创建但没有子网参数。
修复它 运行
docker network ls -a
并删除阻止创建服务的网络
docker network rm <network interface id>
加入秋实的回答,可以使用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-configuration-reference