Docker编写yml静态IP寻址

alv*_*ery 5 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
Run Code Online (Sandbox Code Playgroud)

之后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.

alv*_*ery 12

[求助]找到解决方案.当指向网络时,我们应该使用标志"外部"告诉撰写网络已经创建并且应该被带到外面(否则将使用项目前缀动态创建):

networks:
  app_subnet:
    external: true
Run Code Online (Sandbox Code Playgroud)

因此,在docker-compose将容器附加到现有app_subnet 之前必须创建子网:

docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_subnet
Run Code Online (Sandbox Code Playgroud)


小智 7

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

在这种情况下,只是docker-compose down,修复YML,重新运行docker-compose up是好的


小智 7

上次运行脚本时,网络接口可能已创建,但没有子网参数。

为了修复它运行

docker network ls -a
Run Code Online (Sandbox Code Playgroud)

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

docker network rm <network interface id> 
Run Code Online (Sandbox Code Playgroud)