Docker编写yml静态IP寻址



我有这样的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

将其用作默认值。

最新更新