有没有办法将static public IP
分配给容器。所以容器有公共IP。客户可以使用IP访问容器。
答案 0 :(得分:25)
现在应该可以使用docker 1.10和new docker run --ip
option中显示的docker network connect
。
如果指定,则在重新启动已停止的容器时重新应用容器的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。
答案 1 :(得分:20)
对于目前发布的Docker版本,这是不可能的(没有很多手动工作在Docker后面),尽管很少需要。
Docker通过使用端口映射在容器中公开网络服务,端口映射可以绑定到主机上的特定IP地址。因此,如果您想在192.168.10.10
拥有一个网络服务器而在192.168.10.20
拥有另一个网络服务器,请首先确保您的主机上有此地址:
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地址。现在,您有两个容器在同一端口(端口80)上提供服务,但是在不同的IP地址上。
答案 2 :(得分:1)
由于该问题在流行的搜索中出现(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”上下文中做到这一点,并实现与我们相同的冗余度(将端口分配给服务)。