我正在玩coreos和数字海洋,我想开始允许我的容器之间的内部通信。
我已经为所有主机设置了专用网络,现在我想确保一些容器只打开本地主机和内部接口的端口。
对此,我已经探索了许多选择,但似乎没有一个方案令人满意:
那么什么是最好的方法,我会花时间让它发挥作用。
总之,我想我需要找到我能找到的东西:
解决方案
我来谈谈我是怎么解决这个问题的。感谢larsks的帮助。最后,他们的做法是正确的。这在coreos上是很棘手的,因为没有像larsks所设想的那样真正稳定的地址。coreos的全部意义在于它能够忘记ip地址。
我找到了一种不错的方法将ip地址注入到服务文件中的命令中,从而解决了这个问题。这方面的棘手之处在于,它并不真正支持我所期望的很多shell特性。我想要做的是将机器的ip地址分配给一个变量,然后将它注入命令中:
ip=$(ifconfig eth1 | grep -o 'inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*');
/usr/bin/docker run -p $ip:7000:7000 ...但是,如前所述,这是行不通的。那该怎么办呢?去拿贝壳!
ExecStart=/usr/bin/sh -c "\
export ip=$(ifconfig eth1 | grep -o 'inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*');\
echo $ip;\
/usr/bin/docker run -p $ip:7000:7000"我在路上遇到了一些问题。
这种方法的缺点是它与ifconfig和ipv4的工作方式有关。实际上,这种方法不适用于我的linux膝上型计算机,在这里,ifconfig会产生不同格式的输出。这里的重要经验是在yaml或json中输出内容,这样shell json工具可以更容易地访问事物。
发布于 2015-03-21 12:48:00
我已经为所有主机设置了专用网络,现在我想确保一些容器只打开本地主机和内部接口的端口。
这正是您在指定ip地址时使用-p选项时所得到的行为。假设我有一个主机,它有两个外部接口:eth0 (地址10.0.10)和eth1 (地址192.168.0.10),docker0桥位于172.17.42.1/16。
如果我启动这样的容器:
docker run -p 192.168.0.10:80:80 -d larsks/mini-httpd这将启动一个可以通过eth1接口在192.168.0.10端口80访问的容器。此服务也可从容器所在的主机上访问--位于docker0网络上分配给容器的地址。这大概是172.17.0.39,端口80。
这似乎符合你的目标:
eth1接口公开。我不能轻易地用SSHing测试服务,因为流量来自本地主机。
如果您在容器中运行ssh,您将在Docker分配的“内部”地址上运行ssh。但是,如果在容器中运行ssh,则可能需要考虑不这样做,而是依赖像docker exec这样的工具。
我需要编写一些hacky shell脚本来启动我的服务,以便注入运行容器的机器的地址。
使用此解决方案,不需要将机器ip注入容器中。
发布于 2015-08-11 11:45:40
与grep-ping IP地址不同,您可以使用环境文件来获取服务计划所在主机的IP地址(包括公共地址和私有地址)。这允许您以简单的方式将容器端口绑定到公共或私有端口。
就像这样:
[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/docker run --name myservice -p \
${COREOS_PUBLIC_IPV4}:80:80 \
${COREOS_PRIVATE_IPV4}:3306:3306 \
ubuntu /bin/bashhttps://stackoverflow.com/questions/29182325
复制相似问题