Docker 1.9.0" bridge"与自定义网桥相比,导致hosts文件和SSH_CLIENT env变量不同

时间:2015-12-03 12:35:06

标签: docker

首先让我解释一下我尝试做什么,因为可能有多种方法可以解决这个问题。我在docker 1.9.0中有两个容器:

  • node001(172.17.0.2)(function primeChars (string) { if (string.length <= 1) { return "empty string"; } var primeIdx = []; var res = []; for (var val = 0; val <= 100; val++) { var notPrime = false; for (var i = 2; i <= val; i++) { if (val%i===0 && i!==val) { notPrime = true; } } if (notPrime === false) { primeIdx.push(val); } } for (var i = 0; i < primeIdx.length; i++) { for (var j = 0; j <string.length; j++) { if (i === j) { return res.push(string[j]); } } } }
  • node002(172.17.0.3)(sudo docker run --net=<<bridge or test>> --name=node001 -h node001 --privileged -t -i -v /sys/fs/cgroup:/sys/fs/cgroup <<image>>

当我使用,,启动它时,当我从一个ssh到另一个时,我得到--net=bridge的正确值:

SSH_CLIENT

在docker 1.8.3中我也可以使用我在启动时提供的主机名,在1.8.3中最后一个ping语句可以正常工作!

在docker 1.9.0中,我没有看到[root@node001 ~]# ssh root@172.17.0.3 root@172.17.0.3's password: [root@node002 ~]# env | grep SSH_CLIENT SSH_CLIENT=172.17.0.3 56194 22 [root@node001 ~]# ping -c 1 node002 ping: unknown host node002 中添加的任何内容,ping语句失败。这对我来说是个问题。所以我尝试创建一个自定义网络......

/etc/hosts

当我使用docker network create --driver bridge test启动两个容器时,--net=test得到不同的值

SSH_CLIENT

请注意,ip地址不是node001,它似乎代表了docker主机本身。但是hosts文件是正确的,包含:

[root@node001 ~]# ssh root@172.18.0.3 root@172.18.0.3's password: [root@node002 ~]# env | grep SSH_CLIENT SSH_CLIENT=172.18.0.1 57388 22 [root@node001 ~]# ping -c 1 node002 PING node002 (172.18.0.3) 56(84) bytes of data. 64 bytes from node002 (172.18.0.3): icmp_seq=1 ttl=64 time=0.041 ms

我目前的解决方法是使用docker 1.8.3和默认的172.18.0.2 node001 172.18.0.2 node001.test 172.18.0.3 node002 172.18.0.3 node002.test 网络,但我希望这可以用于未来的docker版本。

  • 有什么方法可以自定义bridge网络,使其行为与默认的test网络类似?

可替换地:

  • 也许让默认的bridge网络在docker 1.9.0中写出bridge文件?

非常感谢任何有关不同解决方案的帮助或指示。

编辑:2016年1月21日

显然问题在1.9.1中得到修复,在docker 1.8中使用 bridge ,在1.9.1中使用自定义( - net = test),现在行为是正确的:

/etc/hosts

[root@node001 tmp]# ip route default via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.5

在1.9.0中重试,看看我是不是很疯狂,是的,那里出现了问题:

[root@node002 ~]# env | grep SSH_CLIENT SSH_CLIENT=172.18.0.3 52162 22

[root@node001 tmp]# ip route default via 172.18.0.1 dev eth0 172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.3

因此,在删除/停止/启动实例后,IP地址并不完全相同,但可以很容易地看出ssh_client源ip在最后一个代码块中不正确。谢谢@sourcejedi让我重新检查。

1 个答案:

答案 0 :(得分:1)

首先,我认为不可能更改默认网络上的任何设置,即写/etc/hosts。您显然无法删除默认网络,因此无法使用不同的选项重新创建它们。

其次

  

Docker小心其主机范围的iptables规则将容器完全暴露给彼此的原始IP地址,因此从一个容器到另一个容器的连接应始终看起来始于第一个容器自己的IP地址。 docs.docker.com

我尝试用我一直在玩的随机容器重现你的问题。在网络的桥接接口上运行wireshark,我没有看到我的ping数据包。由此我得出结论,我的容器确实是直接相互交谈;主机没有进行路由和NAT。

您需要检查客户端容器ip route上的路由。你有172.18.0.2/16的路线吗?如果您只有默认路由,它可能会尝试通过docker主机发送所有内容。它可能会混淆并伪装成好像在与外界交谈。

如果您在特权容器中运行某些网络配置,则可能会发生这种情况。如果您只是使用bash启动它,我不知道发生了什么。