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

7d7tgy0s  于 2023-01-04  发布在  Docker
关注(0)|答案(3)|浏览(161)

有没有办法给容器分配一个静态的公共IP呢?这样容器就有了公共IP,客户端就可以用这个公共的静态IP访问容器了。

noj0wjuj

noj0wjuj1#

现在,在docker 1.10和新的docker run --ip选项(您现在在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

8cdiaqws

8cdiaqws2#

在当前发布的Docker版本中,这是不可能的(没有大量的手工操作),尽管很少有必要。
Docker通过使用端口Map在container中公开网络服务,端口Map可以绑定到您主机上的特定ip地址。因此,如果您希望在192.168.10.10192.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选项用于将端口Map绑定到一个特定的ip地址,现在您有两个container在同一个端口(端口80)上提供服务,但是在不同的ip地址上。

vuktfyat

vuktfyat3#

由于这个问题在流行的搜索(docker assign ip container etc)中弹出,(目前)接受的答案已经过时,而正确的@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

(so主机假定10.30.0.1)。
注意:这就完成了“将给定IP分配给容器”的任务,但目前我还不清楚您是否可以在“Docker Swarm”上下文中这样做,并实现与我们在那里相同级别的冗余(将端口分配给服务)。

相关问题