【问题标题】:docker doesn't use IP from defined pool when creating new networksdocker 在创建新网络时不使用已定义池中的 IP
【发布时间】:2018-08-27 19:53:48
【问题描述】:

为避免冲突,我想为 docker0 网桥和所有由 docker 守护进程在启动新容器时动态创建的接口使用定义的子网范围。

在快速浏览 docker 文档后,我发现了有希望的 fixed-cidr 选项。我将此选项添加到我的 daemon.json 中。我的配置如下:

/etc/docker/daemon.json

{
  "bip": "192.168.89.1/22",
  "fixed-cidr": "192.168.89.2/24"
}

重启 docker 守护进程后,配置看起来很有希望:

docker inspect bridge

[
    {
        "Name": "bridge",
        "Id": "365e0d373bcfc82bc73c623d680dcaee773e247f631e5b2324e3b63401bcf6fd",
        "Created": "2018-03-19T09:59:22.20439309+01:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "192.168.89.1/22",
                    "IPRange": "192.168.89.0/24",
                    "Gateway": "192.168.89.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

但由于某种原因,当我创建一个新网络时:

docker network create test-network

它从默认 IP 范围获取一个新地址:

docker inspect test-network
[
    {
        "Name": "test-network",
        "Id": "bf0f6baa8239c73a9524f8a77035bc2be18a67ad4d0d2ba4f73b3d175f5315b3",
        "Created": "2018-03-19T10:31:24.450183553+01:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

目前,我有一个临时解决方案。我将在 docker-compose.yml 中简单地定义一个自定义子网

yaml
networks:
  default:
    ipam:
      config:
      - subnet: 192.168.89.2/24

但这会导致更多问题,因为由于网络冲突,无法在同一主机上多次启动项目。

有谁知道问题出在哪里?

编辑: 这似乎是 docker 中缺少的功能。 Github Issue

好在前几天这个功能已经提交到master分支了:Committed feature

【问题讨论】:

    标签: docker networking ip


    【解决方案1】:

    /etc/docker/daemon.json 中的网络选项仅适用于默认的 docker0 网桥。

    您可以在创建新网络时指定网络选项,请参阅:https://docs.docker.com/engine/reference/commandline/network_create/

    【讨论】:

    • 嗯,好的,但是网络配置也不适用于docker-compose up 创建的新网络。
    • 是的,您应该手动指定选项,以保持它们的一致性。
    • 使用 docker-compose.yml 中的网络部分手动定义它们?
    • 要么在 docker-compose.yml 中定义它们,要么在 cli 命令中定义它们: docker network create --driver=bridge --subnet=192.168.89.1/22 --ip-range=192.168.89.0/ 24 --gateway=192.168.89.1 测试网络
    • 当我手动定义它们时(例如 docker-compose.yml),由于静态 IP(这是我目前的情况),我无法在同一主机上多次运行相同的容器。我们的构建服务器应该能够多次启动容器并且不应该关心 IP。这是恕我直言的默认行为。我只想定义 docker 守护进程选择新 IP 的 IP 范围。使用默认 IP 与我们的生产网络存在一些冲突。
    【解决方案2】:

    在新的 docker 版本中,有 default-address-pools 选项。

    【讨论】:

    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多