如何为 Docker 容器分配静态公共 IP

47

有没有办法为容器分配一个静态公共IP地址?这样容器就有了公共IP。客户端可以使用该公共静态IP访问容器。

3个回答

30

现在,使用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


1
我知道你已经为容器提供了一些IP地址172.20.128.2。但是我该如何访问在此IP地址上运行的容器中的网站呢?我不想使用端口转发和主机IP。 - thinkingmonster
@thinkingmonster 很好的问题:请将其作为自己的问题提出,以便我或其他人提出替代方案。 - VonC
我只是提出了这个问题。请给我一些提示。https://dev59.com/z5vga4cB1Zd3GeqP5KdU - thinkingmonster
@VonC 我有一个VPS并购买了额外的IP地址进行附加。因此,我尝试为每个IP生成一个新的网络(它们不来自同一子网),并使用了您的命令,但没有成功。我们需要将IP设置为别名还是桥接? - NaN
@NaN 不确定:最好将其作为独立问题提出,供所有人查看。 - VonC
@VonC 我已经在Serverfault上创建了一个问题 (http://serverfault.com/questions/832935/attach-additional-ips-to-vps-debian-and-use-these-static-ips-for-docker) .. 我希望你知道答案 :/ - NaN

25

目前发布的 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)的服务。

据说我需要先将静态公共IP分配给主机。然后使用“-p”将IP绑定到容器。 - firelyu
在larsks提出的解决方案中,我们是否也可以将相同的Docker容器连接到由@VonC创建的Docker网络中? - Amitabh
1
当Docker主机也绑定了0.0.0.0:80的服务器时会发生什么? - Daniel F
那么你可能需要修改服务器配置,将其绑定到特定的地址。 - larsks

6

由于这个问题在热门搜索中频繁出现(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”上下文中执行此操作,并实现我们在那里具有的相同级别的冗余性(通过为服务分配端口)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接