用nat设置docker容器

ram*_*amz 5 containers iptables nat docker

我正在设置两个泊坞容器

     container1                 container2
     |        |                     |
    eth0     eth1                   |
     |        |                    eth1
   docker0   docker1<----------------
     |            
     |
   internet
Run Code Online (Sandbox Code Playgroud)

docker0和docker1是桥梁.

我在主机和容器中都有ip转发为1.我有设置

iptables -I POSTROUTING -t nat -o eth0 -j MASQUERADE in container 1
Run Code Online (Sandbox Code Playgroud)

仍然我无法ping从容器2到互联网的任何东西.我可以看到正在容器1的eth1接收数据包.

OS: ubuntu 13.10
docker version: 0.11.1, build fb99f99
Run Code Online (Sandbox Code Playgroud)

我错过了一些配置吗?

重现步骤:

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 
Run Code Online (Sandbox Code Playgroud)

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

在$ CLI中禁用接口eth0.设置eth1接口的缺省路由.

现在ping从$ CLI发生到10.1.0.1但不发生在互联网上.

小智 1

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

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
Run Code Online (Sandbox Code Playgroud)