让我先解释一下我要做什么,因为可能有多种方法可以解决此问题。我在Docker 1.9.0中有两个容器:
sudo docker run --net=<<bridge or test>> --name=node001 -h node001 --privileged -t -i -v /sys/fs/cgroup:/sys/fs/cgroup <<image>>
),,
)当我使用
--net=bridge
启动它们时,当我从一个切换到另一个时,我会获得SSH_CLIENT
的正确值:[root@node001 ~]# ssh [email protected]@172.17.0.3's password:[root@node002 ~]# env | grep SSH_CLIENTSSH_CLIENT=172.17.0.3 56194 22[root@node001 ~]# ping -c 1 node002ping: unknown host node002
在docker 1.8.3中,我还可以使用启动时提供的主机名,在1.8.3中,最后的ping语句有效!
在docker 1.9.0中,我看不到
/etc/hosts
中添加了任何内容,并且ping语句失败。这对我来说是个问题。所以我尝试创建一个自定义网络...docker network create --driver bridge test
当我使用
--net=test
启动两个容器时,我得到了SSH_CLIENT
不同的值:[root@node001 ~]# ssh [email protected]@172.18.0.3's password:[root@node002 ~]# env | grep SSH_CLIENTSSH_CLIENT=172.18.0.1 57388 22[root@node001 ~]# ping -c 1 node002PING 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
请注意,该IP地址不是node001的IP地址,它似乎代表了docker主机本身。但是hosts文件是正确的,其中包含:
172.18.0.2 node001172.18.0.2 node001.test172.18.0.3 node002172.18.0.3 node002.test
我当前的解决方法是将docker 1.8.3与默认
bridge
网络一起使用,但是我希望它可以与将来的docker版本一起使用。test
网络,使其行为类似于默认的bridge
网络? 或者:
bridge
网络写出docker 1.9.0中的/etc/hosts
文件? 任何帮助或指向不同解决方案的指示将不胜感激。
编辑:21-01-2016
显然,此问题已在1.9.1中修复,在docker 1.8中已桥接,在1.9.1中已使用自定义(--net = test),现在该行为是正确的:
[root@node001 tmp]# ip routedefault via 172.17.0.1 dev eth0172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.5
[root@node002 ~]# env | grep SSH_CLIENTSSH_CLIENT=172.18.0.3 52162 22
在1.9.0中重试,以查看我是否不发疯,是的,出现了问题:
[root@node001 tmp]# ip routedefault via 172.18.0.1 dev eth0172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.3
[root@node002 ~]# env|grep SSH_CLISSH_CLIENT=172.18.0.1 53734 22
因此,在删除/停止/启动实例之后,IP地址并不完全相同,但是可以很容易地看出ssh_client源ip在最后一个代码块中是不正确的。感谢@sourcejedi使我重新检查。
最佳答案
首先,我认为无法更改默认网络上的任何设置,即编写/etc/hosts
。您显然无法删除默认网络,因此无法使用其他选项重新创建它们。
其次
我尝试使用我一直在使用的随机容器重现您的问题。在网络的网桥接口(interface)上运行Wireshark,我没有看到ping数据包。据此我得出结论,我的容器确实是在彼此直接对话。主机未进行路由和NAT。
您需要检查客户端容器ip route
上的路由。您有路线172.18.0.2/16
吗?如果只有默认路由,它可能会尝试通过Docker主机发送所有内容。而且,它可能会变得困惑,并像在与外界对话一样伪装。
如果您在特权容器中运行某些网络配置,则可能会发生这种情况。我不知道如果您只是使用bash
引导它发生了什么。
关于docker - Docker 1.9.0 “bridge”与自定义网桥网络导致主机文件和SSH_CLIENT env变量不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34066259/