用nat设置docker容器

我正在设置两个docker集装箱

container1 container2 | | | eth0 eth1 | | | eth1 docker0 docker1<---------------- | | internet 

docker0和docker1是桥梁。

我有ip转发到1在主机和容器。 我已经设置

 iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE in container 1 

不过,我不能ping任何从容器2到互联网。 我可以看到数据包在容器1的eth1上被接收。

 OS: ubuntu 13.10 docker version: 0.11.1, build fb99f99 

我缺less一些configuration?

重现步骤:

 SERV=$(docker run --privileged=true -i -d -t -v ~/Projects/code/myproject/build:/build:ro debian:7.4 /bin/bash) CLI=$(docker run --privileged=true -i -d -t -v ~/Projects/code/myproject/build:/build:ro debian:7.4 /bin/bash) sudo pipework br1 $SERV 10.1.0.1/8 sudo pipework br1 $CLI 10.1.0.3/8 

在$ SERV:iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE

在$ CLI中禁用接口eth0。 设置默认路由到eth1接口。

现在ping从$ CLI发生到10.1.0.1,但不到互联网。

嗯,它应该像你所描述的那样工作。 也许默认路由configuration不正确。 这就是我所做的:

 SERV=$(docker run -i --privileged -d -t debian:7.4 /bin/bash) CLI=$(docker run --privileged -i -d -t debian:7.4 /bin/bash) docker exec -ti $CLI ping google.de # Internet up docker exec -ti $CLI ip link set eth0 down docker exec -ti $CLI ping google.de # Internet down pipework br1 $SERV 10.1.0.1/8 pipework br1 $CLI 10.1.0.2/8 docker exec -ti $SERV apt-get install -y iptables docker exec -ti $SERV iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE docker exec -ti $CLI ip route add default via 10.1.0.1 dev eth1 docker exec -ti $CLI ping google.de # Internet up docker exec -ti $CLI apt-get install -y traceroute docker exec -ti $CLI traceroute google.de 

iptables被更改的唯一方法是在运行容器的Docker主机上执行

– 特权

这是一个脚本:

在映像构build期间安装iptables以及一些工具(Dcokerfile) inetutils-traceroute iputils-tracepath iptables

在这里我使用“ phusion-dockerbase ”,你可以使用任何你想要的图像:

 #!/bin/bash ### ==> Install & configure iptable during build #RUN sudo apt-get install -y inetutils-traceroute iputils-tracepath iptables # Build the image #sudo docker build -t mybimage -f phusion-dockerbase . ### container1 C1=$(docker run --privileged -i -d -t mybimage /bin/bash) sudo docker exec -ti $C1 iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE sleep 2 sudo pipework br6 -i eth1 $C1 192.168.66.1/24 ### container2 lxterminal -e "sudo docker run -ti --name c2name mybimage /bin/bash" sleep 2 C2="$(sudo docker ps | grep c2name | awk '{ print $1; }')" sudo pipework br6 -i eth1 $C2 192.168.66.2/24@192.168.66.1 

结果:

 ./lab.sh 

从Container1(我使用lxterminal在新窗口中打开它):

从container1

请注意,只要您停止container1,相应的pipe道和iptable修改就会丢失,即使重新启动已停止的容器,也需要重新发出以下命令:

 pipework br6 -i eth1 52b95d6052f7 192.168.66.1/24 docker exec 52b95d6052f7 iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE 

container1像nat盒一样再次行动。

即使提交正在运行的container1到一个新的映像并运行一个新的容器,也没有帮助。