用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,相应的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到一个新的映像并运行一个新的容器,也没有帮助。
- Docker Host和Container有什么不同?
- 在容器中运行nginx作为具有dynamicconfiguration的反向代理
- apacheds和tomcat docker容器之间的连接问题
- Docker容器是否共享一个Python GIL?
- 在基于Docker容器的架构中使用数据库服务器
- Docker for Mac。 docker运行-d -p 80:80 – 名称webserver nginx显示带有这个名字的另一个容器。 但dockerps显示空的列表
- 从Docker中删除Docker?
- 将主机nginx和msql与一个php5-fpm的docker容器连接起来
- Kubernetes反复拉图像,并坚持创build容器