给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