为docker容器提供可路由的ip地址

时间:2014-10-24 00:32:36

标签: ip docker iptables boot2docker

我在ubuntu 14.04上运行它并将docker0设置为静态IP,然后通过防火墙从公共IP路由到。我正在尝试将我的后端API设置为在docker容器中运行,并且被一些事情搞糊涂了。

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

2。)如果还没有以这种方式完成,我怎么能这样做,以便每当我重新运行该docker容器时我都不必设置它?

提前致谢!

2 个答案:

答案 0 :(得分:39)

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

首先,创建一个新的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匹配的流量与端口8080上的docker容器相对应。

如果您需要自动化流程并将其扩展,请参阅以下资源:https://github.com/jpetazzo/pipework

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

答案 1 :(得分:9)

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

  • 开始我的服务'我希望在公共IP上可用的容器
  • 创建一个新的网络'与服务容器链接并路由到服务容器公开的端口的容器。该容器将具有与主机桥接的额外网络接口,因此它可以从DHCP获取IP。
  • 使用jpetazzo' s 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