【问题标题】:customizing docker bridge network自定义 docker 桥接网络
【发布时间】:2018-04-04 22:01:15
【问题描述】:

我希望我的 docker0 和所有容器与我的本地计算机具有相同的网关地址或在相同的 IPrange 中。我首先在 daemon.json 文件 /etc/docker/daemon.json 中定义一个固定的 cidr

{
  "bip": "10.80.44.248/24",
  "fixed-cidr": "10.80.44.250/25",
  "mtu": 1500,
  "default-gateway": "10.80.44.254",
  "dns": ["10.80.41.14"]
}

它似乎正在查看ip -a 的输出 从那以后,docker0 似乎从未收到任何数据。

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet *10.80.44.248*  netmask 255.255.255.0  broadcast *10.80.44.255*
        ether 02:42:9c:b9:e1:63  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet *10.80.44.39*  netmask 255.255.255.0  broadcast *10.80.44.255*
        inet6 fe80::250:56ff:feb1:79e4  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:b1:79:e4  txqueuelen 1000  (Ethernet)
        RX packets 211061  bytes 30426474 (29.0 MiB)
        RX errors 0  dropped 33861  overruns 0  frame 0
        TX packets 3032  bytes 260143 (254.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

本地机器和docker0在同一个IP范围内,同一个网关。好的。 但是当我启动 docker 容器并检查网桥设置时,一切都不同了。这是

的输出
docker network inspect bridge


[
    {
        "Name": "bridge",
        "Id": "b326a37a589245449e1268bbb9ee65262eb7986574c0e972c56d350aa82d7238",
        "Created": "2018-04-04T03:25:52.00544539+02:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.80.44.248/24",
                    "IPRange": "10.80.44.128/25",
                    "Gateway": "10.80.44.248",
                    "AuxiliaryAddresses": {
                        "DefaultGatewayIPv4": "10.80.44.254"
                    }
                }
            ]
        },
        "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": {}
    }
]

我不明白为什么现在 IPAM 配置有一个 IPv4 als 辅助

“辅助地址”:{ “默认网关 IPv4”:“10.80.44.254” }

我意识到现在网桥不是从daemon 配置的同一子网创建的,而是创建了 2 个具有不同 IP 范围的不同网桥。这仍然是 docker 的默认设置。

docker 网络 ls

NETWORK ID          NAME                   DRIVER              SCOPE
b326a37a5892        bridge                 bridge              local
6ce11066cdea        dockergitlab_default   bridge              local
d5a36c04b809        host                   host                local
15f66b88ee67        none                   null                local

docker 网络检查 dockergitlab_default

[
    {
        "Name": "dockergitlab_default",
        "Id": "6ce11066cdeabf3cfe65b2dff22046bd1e9c18d2588f47b9cd3c52ea24f7a636",
        "Created": "2018-03-14T08:56:23.351051727+01:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "60f769c91cff1de47794a7c8b587b778488883da094ae32cfde5196ee0f528f1": {
                "Name": "gitlab-runner",
                "EndpointID": "5122fe862537fb8434a484b4797153274b945e20bc3c7223efc6fd0bd55eae14",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "9c46e1fde6390142bddf67270cfeda7b3e68b1a6e68cabc334046db687240a8d": {
                "Name": "dockergitlab_postgresql_1",
                "EndpointID": "8488b32cc34a2c92308528de74b5eddcecac12a402ee6e67c1ef0f2750b72721",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "eaf29f5f405cbf9bdd918efad26ceae1a8c3f58f4bef0aa8fd86b4631bcfdf43": {
                "Name": "dockergitlab_gitlab_1",
                "EndpointID": "d7f78ee9bd51dd13826d7834470d03a9084fc7ab8c6567c0181acecc221628c6",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "f460687ec00eff214fa08adfe9a0af5b85c392ceb470c4ed630ef7ecb0bfcba1": {
                "Name": "dockergitlab_redis_1",
                "EndpointID": "8b18906f1c79a5faaadd32afdef20473f9b635e9a1cd2c7108dd98df48eaed86",
                "MacAddress": "02:42:ac:11:00:05",
                "IPv4Address": "172.17.0.5/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "dockergitlab"
        }
    }
]

我不知道为什么现在使用旧的默认 IP 地址创建 docker 网桥。

本地系统详情

我可以在本地机器上执行apt update,但是当我登录到 gitlab-runner 时,我无法执行apt update

Linux  4.9.0-6-amd64 #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02) x86_64

Docker version 17.12.0-ce, build c97c6d6

docker-compose version 1.18.0, build 8dd22a9

有没有办法可以覆盖网桥设置。根据我的阅读,当我在 daemon.json 文件中定义/配置 cdir 和网关时,所有内容都将从那里获取,以创建桥接网络和所有其他容器。

提前感谢您的帮助。

【问题讨论】:

    标签: docker gitlab docker-container docker-networking docker-network


    【解决方案1】:

    首先,您已经正确配置了docker0 网桥并使用普通的docker run 命令启动容器应该将它们连接到网桥并在10.80.44.250/25 中为它们提供IP。

    根据您粘贴的内容,我猜您正在使用 docker-compose 来启动您的容器。

    如果您不指定任何内容,docker-compose 将根据 docker-compose.yml 创建一个 myproject_default 网络。

    今天您无法选择 IP 范围将在哪个池中选择,默认情况下是 172.[17-31].0.0/16。当前有一个活动的拉取请求允许覆盖此行为:https://github.com/moby/moby/pull/36396

    如果您想在docker-compose.yml 中手动指定 IP 范围,您可以这样写:

    networks:
      default:
        ipam:
          config:
            - subnet: 10.80.44.250/25
    

    编辑:这仅与 docker-compose 语法 >=3.0 兼容。

    【讨论】:

    • 哇,谢谢。你说的对。这就是为什么事情不起作用的原因。我将尝试在我的撰写配置文件中手动执行此操作。我还需要保留 docker0 配置吗?
    • 当我将此网络选项添加到我的 docker-compose.yml 时,我得到了不受支持的配置选项。有小费吗。我正在为 docker-compose 使用文件格式“2.2”。谢谢
    • 我现在修好了。我仍然得到与 docker0 重叠的 IPv4 地址。有什么想法吗?
    • 是的,子网不应重叠,因此您必须为 docker0 和您的 docker-compose 网络选择两个不同的范围。所以在这里你可能想要使用两个连续的 /26 而不是你的 /25 :一个用于 docker0,一个用于 dockergitlab_default。
    • 我建议在 docker-compose 网络中启动容器并将普通的 docker run 容器连接到该网络。如果您在默认桥 (docker0) 中运行 docker-compose 容器,您将失去容器之间的自动 DNS 解析(当您在 docker-compose.yml 中使用 links 时得到的)。你可以在这里查看文档:docs.docker.com/network/bridge
    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2020-08-22
    • 2018-10-14
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多