【问题标题】:How to give a docker container its own routable IP (different from the host's)?如何为 docker 容器提供自己的可路由 IP(与主机不同)?
【发布时间】:2017-12-07 03:05:09
【问题描述】:

我正在尝试为容器提供可路由的 IP。我的本地网络是 192.168.1.0/24,我想用 192.168.1.17/29 给容器。

目标是让每个容器都有自己的 IP。这样,如果两个容器在端口 80 上运行网络服务器,我可以通过它们在端口 80 上的唯一 IP 从本地网络上的任何其他主机直接访问它们,而不是将它们映射到共享主机 IP 上的不同端口。

类似于拥有自己网卡的物理机在网络上各自拥有不同的 192.168.1.xxx IP。

我试过了:

docker network create --subnet 192.168.1.0/24 --ip-range 192.168.1.17/29 --gateway 192.168.1.1 test_nw

产生以下结果:

$ docker network inspect test_nw 
[
    {
        "Name": "test_nw",
        "Id": "96bd574300059ef3710527a9bd0b3010d3b3c22d8de321ff459697eda96ab5e6",
        "Created": "2017-12-06T21:50:08.591070587-05:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24",
                    "IPRange": "192.168.1.17/29",
                    "Gateway": "192.168.1.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

在这种情况下,在容器内,我可以 ping 192.168.1.1,但无法 ping 互联网上的任何内容(通过 IP 或主机名),我什至无法 ping 本地网络上的其他设备(192.168.1.2存在但不可达)

在我使用docker network rm 删除此网络之前,主机(我的笔记本电脑)也无法访问 Internet 或本地网络上的任何内容。

我显然遗漏了一些东西,但我不明白是什么。有什么方法可以实现我想要做的吗?

【问题讨论】:

    标签: docker networking


    【解决方案1】:

    这样,如果两个容器在端口 80 上运行网络服务器,我可以通过它们在端口 80 上的唯一 IP 从本地网络上的任何其他主机直接访问它们,而不是将它们映射到共享主机 IP 上的不同端口。

    我想也许你对这个问题的思考是错误的。您不必将它们映射到共享主机 IP 上的不同端口。解决这个问题最常见的方法是给主机分配多个ip地址。例如,如果我的主机是192.168.1.100,我可能会添加一些额外的地址:

    ip addr add 192.168.1.200/24 dev eth0
    ip addr add 192.168.1.201/24 dev eth0
    

    现在我可以启动一个网络服务器并将其绑定到第一个 IP 地址:

    docker run -p 192.168.1.200:80:80 mywebserver1
    

    我可以启动另一个网络服务器并将其映射到另一个地址的端口 80:

    docker run -p 192.168.1.201:80:80 mywebserver2
    

    这似乎达到了您的目标。

    【讨论】:

    猜你喜欢
    • 2022-07-19
    • 2023-03-03
    • 2017-04-26
    • 2021-04-15
    • 2016-04-15
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多