Docker 1.9.0“;桥“;与自定义网桥网络相比,hosts文件和SSH_客户机env变量存在差异
首先让我解释一下我想做什么,因为可能有多种方法可以解决这个问题。docker 1.9.0中有两个容器:Docker 1.9.0“;桥“;与自定义网桥网络相比,hosts文件和SSH_客户机env变量存在差异,docker,Docker,首先让我解释一下我想做什么,因为可能有多种方法可以解决这个问题。docker 1.9.0中有两个容器: node001(172.17.0.2)(sudo docker run--net=--name=node001-h node001--privileged-t-i-v/sys/fs/cgroup:/sys/fs/cgroup) 节点002(172.17.0.3)(,) 当我用--net=bridge启动它们时,当我从一个SSH到另一个SSH时,我会得到SSH\u CLIENT的正确值: [
- node001(172.17.0.2)(
)sudo docker run--net=--name=node001-h node001--privileged-t-i-v/sys/fs/cgroup:/sys/fs/cgroup
- 节点002(172.17.0.3)(
),
--net=bridge
启动它们时,当我从一个SSH到另一个SSH时,我会得到SSH\u CLIENT
的正确值:
[root@node001~]#嘘root@172.17.0.3
root@172.17.0.3的密码:
[root@node002~]#环境| grep SSH_客户端
SSH_CLIENT=172.17.0.3 56194 22
[root@node001~]#ping-c1节点002
ping:未知主机node002
在docker 1.8.3中,我还可以使用启动时提供的主机名,在1.8.3中,最后一个ping语句有效
在docker 1.9.0中,我没有看到在/etc/hosts
中添加任何内容,ping语句失败。这对我来说是个问题。所以我试着创建一个自定义网络
docker网络创建——驱动桥测试
当我用--net=test
启动两个容器时,我得到了SSH\u客户端的一个不同值:
[root@node001~]#嘘root@172.18.0.3
root@172.18.0.3的密码:
[root@node002~]#环境| grep SSH_客户端
SSH_CLIENT=172.18.0.1 57388 22
[root@node001~]#ping-c1节点002
PING节点002(172.18.0.3)56(84)字节的数据。
来自节点002的64字节(172.18.0.3):icmp_seq=1 ttl=64时间=0.041毫秒
请注意,ip地址不是node001,它似乎代表docker主机本身。但主机文件是正确的,包含:
172.18.0.2节点001
172.18.0.2节点001.1试验
172.18.0.3节点002
172.18.0.3节点002.1测试
我目前的解决方法是使用docker 1.8.3和默认的网桥
网络,但我希望这能在未来的docker版本中使用
- 是否有任何方法可以自定义
测试
网络,使其行为类似于默认的网桥
网络
或者:
- 是否可以将默认的
网桥
网络写入docker 1.9.0中的/etc/hosts
文件
我们将非常感谢您对不同解决方案的任何帮助或指点
编辑:21-01-2016
显然,问题已在1.9.1中解决,docker 1.8中有bridge,1.9.1中有自定义(--net=test),现在行为正确:
[root@node001tmp]#ip路由
默认通过172.17.0.1 dev eth0
172.17.0.0/16 dev eth0原型内核作用域链接src 172.17.0.5
[root@node002~]#环境| grep SSH_客户端
SSH_CLIENT=172.18.0.3 52162 22
在1.9.0中重试,看看我是否疯了,是的,问题出现了:
[root@node001tmp]#ip路由
默认通过172.18.0.1 dev eth0
172.18.0.0/16 dev eth0原型内核作用域链接src 172.18.0.3
[root@node002~]#环境| grep SSH|u CLI
SSH_CLIENT=172.18.0.1 53734 22
因此,在删除/停止/启动实例之后,IP地址并不完全相同,但可以很容易地看出,在最后一个代码块中,ssh_客户端源IP不正确。感谢@sourcejedi让我重新检查。首先,我认为无法更改默认网络上的任何设置,即写入/etc/hosts
。显然,您无法删除默认网络,因此无法使用不同的选项重新创建它们
其次
Docker很小心,它的主机范围的iptables规则将容器完全暴露给彼此的原始IP地址,因此从一个容器到另一个容器的连接应该总是从第一个容器自己的IP地址开始
我试着用我玩过的随机容器复制你的问题。在网络的网桥接口上运行wireshark时,我没有看到我的ping数据包。从这一点上,我得出结论,我的容器确实是在相互直接对话;主机未执行路由和NAT
您需要检查客户端容器上的路由ip路由
。您有去172.18.0.2/16
的路线吗?如果只有默认路由,它可以尝试通过docker主机发送所有内容。它可能会感到困惑,伪装成与外界对话的样子
如果您正在特权容器中运行某些网络配置,则可能会发生这种情况。我不知道如果你只是用bash
启动它会发生什么。你的回答让我重新检查,我发现这是1.9.0的一个问题,我编辑了我的回答,供有同样问题的人使用。哇。你说得对,我的系统上有docker 1.9.1,所以这就是我必须测试的。