我正在设置两个泊坞容器
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
我错过了一些配置吗?
重现的步骤:
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但不发生在互联网上。
答案 0 :(得分:0)
嗯,它应该像你描述的那样工作。可能未正确配置默认路由。 这就是我所做的:
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
答案 1 :(得分:0)
更改iptables的唯一方法是从使用
运行的容器上的Docker主机执行- 特权
这是一个脚本:
在图像构建期间安装了iptables以及一些工具(Dcokerfile) inetutils-traceroute iputils-tracepath iptables
我在这里使用&#34; phusion-dockerbase&#34;,你可以使用你想要的任何图像:
#!/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,相应的管道和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 box一样再次行动。
即使将正在运行的container1提交到新图像并从中运行新容器,也无济于事。