Docker编写yml静态IP寻址

时间:2016-10-17 09:01:15

标签: docker-compose docker-networking

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

5 个答案:

答案 0 :(得分:9)

[已解决] 找到解决方案。当指向网络时,我们应该使用标志“外部”告诉撰写网络已经创建并且应该被带到外面(否则它将在带有项目前缀的情况下创建):

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

答案 1 :(得分:2)

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

要修复它,请运行

docker network ls -a

并删除阻止该服务创建的网络

docker network rm <network interface id> 

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

  

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

在docker-compose.yml中

,您需要将外部网络指定为:

  

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

默认使用它。

答案 4 :(得分:0)

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