如何给docker集装箱自己的可路由的IP(不同于主机的)?

我正在尝试给容器一个可路由的IP。 我的本地networking是192.168.1.0/24,我想用192.168.1.17/29给容器。

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

类似于具有自己的网卡的物理机器如何在networking上具有不同的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本地networking上的其他设备(192.168。 1.2存在但无法达到)

主机(我的笔记本电脑)也无法达到互联网上或我的本地networking上的任何东西,直到我与docker network rm删除此networking。

我明显错过了一些东西,但我不明白是什么。 有什么办法来实现我想要做的?

这样,如果两个容器在端口80上运行一个web服务器,我可以直接从本地networking上的任何其他主机通过端口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 

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

 docker run -p 192.168.1.200:80:80 mywebserver1 

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

 docker run -p 192.168.1.201:80:80 mywebserver2 

这似乎符合你的目标。