如何为docker容器提供自己的可路由IP(与主机不同)?

时间:2017-12-07 03:05:10

标签: docker networking

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

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

类似于具有自己的网卡的物理机器在网络上各自具有不同的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删除此网络。

我显然遗漏了一些东西,但我无法理解。有没有办法实现我想要做的事情?

1 个答案:

答案 0 :(得分:0)

  

这样,如果两个容器在端口80上运行Web服务器,我可以通过端口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

这似乎符合你的目标。