给Docker容器分配一个可路由的IP地址

25

我正在Ubuntu 14.04上运行,并设置了docker0的静态IP地址,然后通过防火墙从公共IP路由到该IP。我尝试设置我的后端API在Docker容器中运行,但有一些疑惑。

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

2.) 如果还没有这样做,我该如何使得每次启动Docker容器时都不必重新设置此项内容?

提前感谢!


1
你考虑过使用 --net=host 选项吗?请参阅:https://docs.docker.com/articles/networking/#container-networking - Mark O'Connor
发送动态传入数据包是什么意思?假设后端API响应HTTP,那么设置一个可以处理其他内容(如SSL卸载等)的HTTP代理怎么样? - andi5
2个回答

40
我假设您想要为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规则,该规则将nat所有目标为10.0.0.99:80的流量到端口8080上的docker容器中。
如果需要自动化该过程并将其扩展,请参考此资源:https://github.com/jpetazzo/pipework docker文档是一个很好的起点:https://docker.github.io/engine/userguide/networking/

2
是的,但是如何将容器的出站端口映射到主机IP呢? - Duncan Calvert
1
我认为你不需要这样做。在大多数情况下,当容器中的应用程序发起通信时,源端口是动态的,因此您不需要进行映射。在哪种应用程序需要映射源端口? 此外,为客户端应用程序设置固定端口会带来安全风险,因此必须随机化源端口。更多详细信息请参见[RFC6056](https://tools.ietf.org/html/rfc6056) - nucatus
1
你需要映射源端口的应用程序是什么?例如MRCP(RFC 6787)服务器。有没有办法将公共IP地址真正分配给容器? - Alexey Naidyonov
我不确定 MRCP 的要求,但我怀疑它不需要固定源端口。您能否在文档中链接该段落以进行说明? - nucatus
是的,您可以为容器分配公共IP。您可以在NIC上创建IP别名以获取公共IP,并将该IP链接到容器中,就像我在上面的答案中所述。 - nucatus

9

最近我遇到了同样的问题,并使用 网络容器 解决了它:

  • 启动我想要在公共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

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