【问题标题】:Setting up docker containers with nat使用 nat 设置 docker 容器
【发布时间】:2014-05-23 00:22:02
【问题描述】:

我正在设置两个 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

我仍然无法从容器 2 ping 任何东西到互联网。我可以看到容器 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 接口。

现在从 $CLI 对 10.1.0.1 进行 ping,但对 Internet 没有。

【问题讨论】:

  • 你是如何在 container1 中设置 eth0 和 eth1 的?使用管道、主机网络或其他方式?
  • 我为此使用了管道系统。
  • 您能提供一个逐步重现的方法吗?
  • 添加了重现的步骤。

标签: containers iptables docker nat


【解决方案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

【讨论】:

  • 嗨,我使用了你放在这里的命令,我的容器中的所有东西都工作正常,我的容器可以 ping 我的主机,但是主机无法 ping 容器任何解决方案?
【解决方案2】:

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

--特权

这是一个脚本:

在镜像构建期间安装了 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,相应的pipework和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 提交到一个新映像并从中运行一个新容器,也无济于事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多