按照 Docker 关于链接容器的文档,我尝试创建两个容器:salt-master 和 salt-minion,salt-minion 链接到 salt-master。此外,我使用 Dockerfile EXPOSE 指令公开 salt master 上的端口。据我所知,我应该从 salt-minion 容器访问 salt-master 的公开端口。
我的 salt-master 的 Dockerfile 是:
FROM fedora
EXPOSE 4505 4506
ADD master /etc/salt/master
CMD /usr/bin/salt-master -l debug
我使用以下命令运行 salt-master 容器:
docker run -it --name salt-master myuser/fedora-salt-master /bin/bash
我使用以下命令运行 salt-minion 容器:
docker run -it --name salt-minion --link salt-master:salt-master myuser/fedora-salt-minion /bin/bash
然后从 salt-minion 容器内部运行并得到:
telnet salt-master 4506
Trying 172.17.0.105...
telnet: connect to address 172.17.0.105: No route to host
如果我查看 salt-master 内部,端口似乎打开了。但是 salt-minion 无法访问它们。
如果我使用 tcpdump 查看,我会得到:
11:26:12.188884 IP 172.17.42.1 > 172.17.0.112: ICMP host 172.17.0.111
unreachable - admin prohibited, length 68
在哪里:
172.17.0.111 是 salt-minion,这是我尝试端口的主机
172.17.0.112 是 salt-master,即公开端口的主机
172.17.42.1是docker0虚拟接口
有人有线索吗?
答案1
主机是 Fedora 22,似乎主机上的防火墙阻止了容器之间的通信。我运行了 Fedora 的防火墙,这让容器可以互相 ping 通,但无法访问它们的端口。我禁用了防火墙,只使用了 iptables,使用 iptables 后,容器甚至无法互相 ping 通。这是否是 Docker 添加规则或现有防火墙规则的错误,我还没有调查。但停止主机上的防火墙和 iptables 后,问题就解决了。