Docker 编写 yml 静态 IP 寻址

问题描述 投票:0回答:5

我有这样的 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
5个回答
37
投票

找到解决方案。

当指向网络时,我们应该使用标志“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

13
投票

就我而言,我第一次运行

docker-compose up
失败,但网络已经创建,可以使用
docker network ls
看到。

在这种情况下,只需

docker-compose down
,修复yml,重新运行
docker-compose up
就可以了


7
投票

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

要修复它,请运行

docker network ls -a

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

docker network rm <network interface id> 

1
投票

添加到Qiushi's答案中,您可以使用

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


0
投票

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

docker网络创建--网关172.16.1.1--子网172.16.1.0/24 --scope swarm app_subnet

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

网络:默认: 外部的: 名称:etl_子网

将其用作默认值。

© www.soinside.com 2019 - 2024. All rights reserved.