有没有办法为容器分配一个静态公共IP地址?这样容器就有了公共IP。客户端可以使用该公共静态IP访问容器。
现在,使用Docker 1.10和新的docker run --ip
选项,可以实现此操作。该选项现在在docker network connect
中可见。
如果指定了IP地址,则在重新启动停止的容器时将重新应用容器的IP地址。如果IP地址不再可用,则容器无法启动。
确保IP地址可用的一种方法是在创建网络时指定
--ip-range
,然后从该范围之外选择静态IP地址。这可确保在容器未连接到网络时,IP地址不会被分配给另一个容器。
$ docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 multi-host-network
$ docker network connect --ip 172.20.128.2 multi-host-network container2
参见Jessie Frazelle的博客文章“IPs for all the Things”,以及拉取请求docker/docker#19001。
目前发布的 Docker 版本还不能直接实现这个功能(除非你在 Docker 的后台进行大量手动操作),不过一般情况下是没有必要这样做的。
Docker 通过端口映射将容器中的网络服务公开,而端口映射可以绑定到主机上的特定 IP 地址。因此,如果您想在192.168.10.10
处运行一个 Web 服务器,在192.168.10.20
处运行另一个 Web 服务器,首先确保这些地址在您的主机上可用:
ip addr add 192.168.10.10/24 dev eth0
ip addr add 192.168.10.20/24 dev eth0
然后启动第一个容器:
docker run -p 192.168.10.10:80:80 mywebserver
最后启动第二个容器:
docker run -p 192.168.10.20:80:80 mywebserver
在上面的命令中,-p
选项用于将端口映射绑定到特定的IP地址。现在你有两个容器在不同的IP地址上提供相同端口(端口80)的服务。由于这个问题在热门搜索中频繁出现(Docker分配容器IP等),目前被接受的答案已经过时,而@VonC的正确答案有些不确定(包括讨论),让我们用一个示例总结一下如何实现以及结果是什么:
docker run -d nginx:latest #--> container with id be46...
docker network create --subnet 10.30.0.0/24 --ip-range 10.30.0.0/24 multi-host-network
docker network connect --ip 10.30.0.4 multi-host-network be46
现在容器已经附加了10.30.0.4/24
;您可以从运行命令的主机上ping 10.30.0.4
。在运行docker stop be46
后,ping将不再起作用,而在运行docker start be46
之后,ping将再次成功。在主机上,将创建以下路由:
10.30.0.0/24 dev br-b74e7b452f23 proto kernel scope link src 10.30.0.1
(因此主机假定 10.30.0.1
)。
注意:这完成了“将指定的IP分配给容器”的任务,但目前还不清楚您是否可以在“docker swarm”上下文中执行此操作,并实现我们在那里具有的相同级别的冗余性(通过为服务分配端口)。