首先让我解释一下我尝试做什么,因为可能有多种方法可以解决这个问题。我在docker 1.9.0中有两个容器:
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]);
}
}
}
}
)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
文件?非常感谢任何有关不同解决方案的帮助或指示。
显然问题在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让我重新检查。
答案 0 :(得分:1)
首先,我认为不可能更改默认网络上的任何设置,即写/etc/hosts
。您显然无法删除默认网络,因此无法使用不同的选项重新创建它们。
其次
Docker小心其主机范围的iptables规则将容器完全暴露给彼此的原始IP地址,因此从一个容器到另一个容器的连接应始终看起来始于第一个容器自己的IP地址。 docs.docker.com
我尝试用我一直在玩的随机容器重现你的问题。在网络的桥接接口上运行wireshark,我没有看到我的ping数据包。由此我得出结论,我的容器确实是直接相互交谈;主机没有进行路由和NAT。
您需要检查客户端容器ip route
上的路由。你有172.18.0.2/16
的路线吗?如果您只有默认路由,它可能会尝试通过docker主机发送所有内容。它可能会混淆并伪装成好像在与外界交谈。
如果您在特权容器中运行某些网络配置,则可能会发生这种情况。如果您只是使用bash
启动它,我不知道发生了什么。