【问题标题】:Docker compose yml static IP addressingDocker 撰写 yml 静态 IP 寻址
【发布时间】:2021-05-30 21:34:29
【问题描述】:

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

【问题讨论】:

    标签: docker-compose docker-networking


    【解决方案1】:

    [已解决] 找到了解决方案。当指向网络时,我们应该使用标志“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
    

    【讨论】:

      【解决方案2】:

      在我的情况下,我第一次运行 docker-compose up 失败,但网络已经创建,可以看到使用 docker network ls

      在这种情况下,只需docker-compose down,修复yml,重新运行docker-compose up就可以了

      【讨论】:

      • 第一次运行 docker-compose up 时使用错误的配置创建了网络,因此也为我工作。所以不需要配置外网。
      【解决方案3】:

      很可能从之前的脚本运行中已经创建了网络接口,但没有子网参数。

      为了修复它运行

      docker network ls -a
      

      并移除阻止创建服务的网络

      docker network rm <network interface id> 
      

      【讨论】:

      • 截至编写命令docker network ls 不支持选项-a。除此之外,这个答案就像一个魅力。谢谢!
      【解决方案4】:

      具体来说,如果您使用 docker stack deploy 来部署 swarm 集群。并且您需要将子网的范围指定为“swarm”:

      docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 --scope swarm app_subnet

      在docker-compose.yml中,需要指定外网为:

      网络:默认值: 外部的: 名称:etl_subnet

      默认使用。

      【讨论】:

        【解决方案5】:

        求是的回答中添加,可以使用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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-26
          • 2019-02-28
          • 1970-01-01
          • 1970-01-01
          • 2018-11-04
          • 2021-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多