【问题标题】:How to assign static public IP to docker container如何将静态公共 IP 分配给 docker 容器
【发布时间】:2020-09-27 17:54:33
【问题描述】:

有没有办法将static public IP 分配给容器。所以容器有公网IP。客户端可以通过IP访问容器。

【问题讨论】:

    标签: docker


    【解决方案1】:

    现在应该可以使用 docker 1.10 和您现在在 docker network connect 中看到的 new docker run --ip option

    如果指定,则在重新启动停止的容器时重新应用容器的 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

    【讨论】:

    • 我知道您为容器提供了一些 ip 172.20.128.2。但是我如何才能访问在 ip 172.20.128.2 的容器中运行的网站。我不想进行端口转发和使用主机ip。
    • @thinkingmonster 好问题:将其作为自己的问题,让我或其他人提出替代方案。
    • 我刚刚问了这个问题。请赐教。 stackoverflow.com/questions/40060764/…
    • @VonC 我有一个 VPS 并购买了额外的 IP 来附加。因此,我尝试为每个 ip 生成一个新网络(它们不是来自同一个子网)并使用您的命令,但没有成功。我们必须将 IP 设置为别名或网桥吗?
    • @NaN 不确定:最好将其作为一个独立的问题提出,让所有人都能看到。
    【解决方案2】:

    对于当前发布的 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 地址上。

    【讨论】:

    • 据说需要先给主机分配静态公网IP。然后使用-p将ip绑定到容器。
    • 在 larsks 建议的解决方案中,我们是否也可以将相同的 docker 容器连接到 @VonC 在解决方案中创建的 docker 网络?
    • 当 docker 主机也有绑定到 0.0.0.0:80 的服务器时会发生什么?
    • 那么您可能需要修改服务器配置以绑定到特定地址。
    【解决方案3】:

    由于这个问题在热门搜索中弹出(docker assign ip container 等),(当前)接受的答案已经过时,@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”上下文中执行此操作,并实现与我们在那里相同级别的冗余(将端口分配给服务)。

    【讨论】:

      猜你喜欢
      • 2015-02-15
      • 2021-05-02
      • 2015-03-12
      • 2021-10-26
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多