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

  • node001(172.17.0.2)(sudo docker run --net=<<bridge or test>> --name=node001 -h node001 --privileged -t -i -v /sys/fs/cgroup:/sys/fs/cgroup <<image>>)
  • node002(172.17.0.3)(,,)

  • 当我使用--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/

    10-11 08:01