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

我在ubuntu 14.04上运行这个,并将docker0设置为静态IP,然后通过防火墙从公共IP路由。 我试图设置我的后端API在Docker容器中运行,并由一些事情困惑。

1.)如何将docker0的ip映射到容器的ip,使得docker0知道将传入的数据包发送到容器(如果可能,dynamic地)。

2.)如果还没有这样做,我怎么能这样做,以便我不必每次重新运行docker集装箱时都要设置它?

提前致谢!

我假设你想有一个IP分配到泊坞外的docker容器。

首先,创build一个新的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创build一个iptables的NAT规则,将所有匹配目的地10.0.0.99:80的stream量匹配到端口8080上的docker容器。

如果您需要自动执行此过程并将其扩展出来,请参阅以下资源: https : //github.com/jpetazzo/pipework

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

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

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

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

为了方便起见,我创build了一个脚本,一次完成所有这一切。 在公共IP上创build正在运行的容器就像下面这样简单:

 create-network-container.sh webserver ens32 

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

该脚本,更详细的信息和例子可在以下url获得: https : //github.com/jeroenpeeters/docker-network-containers