【问题标题】:Giving a docker container a routable ip address给 docker 容器一个可路由的 ip 地址
【发布时间】:2014-12-19 19:23:36
【问题描述】:

我在 ubuntu 14.04 上运行它,并将 docker0 设置为静态 ip,然后通过防火墙从公共 ip 路由到该静态 ip。我正在尝试将我的后端 API 设置为在 docker 容器中运行,并且对一些事情感到困惑。

1.) 我如何将docker0 的 ip 映射到容器的 ip,以便docker0 知道将传入的数据包发送到容器(如果可能,动态发送)。

2.) 如果还没有以这种方式完成,我怎么能做到这样我就不必在每次重新运行该 docker 容器时都进行设置?

提前致谢!

【问题讨论】:

标签: ip docker iptables boot2docker


【解决方案1】:

我假设您希望在 docker 之外为您的 docker 容器分配一个 IP。

首先,创建一个新 IP 并将其分配给您主机的接口(我们假设您的接口称为 eth0。

$> ip addr add 10.0.0.99/8 dev eth0

现在,当您启动容器时,指定该地址并将其链接到您的 docker 容器:

$> docker run -i -t --rm -p 10.0.0.99:80:8080 base

-p 参数将使 docker 创建一个 iptables NAT 规则,该规则会将与目标 10.0.0.99:80 匹配的所有流量 nat 到端口 8080 上的 docker 容器。

如果您需要自动化流程并进行扩展,请查阅此资源:https://github.com/jpetazzo/pipework

docker 文档是一个好的开始:https://docker.github.io/engine/userguide/networking/

【讨论】:

  • 是的,但是如何将容器的传出端口映射到主机 IP?
  • 我认为您不需要这样做。在大多数情况下,当通信由驻留在容器中的应用程序发起时,源端口是动态的,因此您不需要映射。您需要映射源端口的应用程序是什么?此外,为客户端应用程序设置固定端口会带来安全风险,因此,源端口必须随机化。更多细节在这里RFC6056
  • > 您需要映射源端口的应用程序是什么? -- 例如,一个 MRCP (RFC 6787) 服务器。有没有办法真正为容器分配公共 IP 地址?
  • 我不确定 MRCP 的要求,但我怀疑它是否需要修复源端口。您能否在此处链接文档中指定的段落?
  • 是的,您可以为容器分配公共 IP。您在 NIC 上为公共 IP 创建 IP 别名,并将该 IP 链接到容器,如我在上面的答案中所述。
【解决方案2】:

最近我遇到了同样的问题,并使用 Network Containers 解决了它:

  • 启动我希望在公共 IP 上可用的“服务”容器
  • 创建一个新的“网络”容器,它与服务容器链接并路由到服务容器公开的端口。该容器将有一个与主机桥接的额外网络接口,因此它可以从 DHCP 获取 IP。
  • 使用 jpetazzo 的 Pipework (https://github.com/jpetazzo/pipework) 创建从 Docker 主机到容器的网桥
  • 网络容器从 DHCP 获取地址。

从此时起,网络容器在网络上可用,并将端口路由到服务容器。 主要优点是“服务”容器不必知道公共 IP、DHCP 等。这样每个正在运行的容器都可以在网络上公开。

为方便起见,我创建了一个脚本,可以一次性完成所有这些工作。让一个正在运行的容器在公共 IP 上可用很简单:

create-network-container.sh webserver ens32

在这种情况下,您需要有一个名为“webserver”的运行容器,以及主机“ens32”上的网络接口。需要该接口才能在网络容器中创建网桥。

脚本、更详细的信息和示例可在以下位置获得: https://github.com/jeroenpeeters/docker-network-containers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2016-04-15
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多