发现 Docker 的 IP 地址
51test2015
8年前
<p>使用Eclipse Che,我们用Docker容器编写了很多实用程序。 它们占用空间且轻便,可以在许多不同的操作系统上运行,而无需用户安装附加软件。</p> <p>我们的许多实用程序还需要创建和管理Docker容器,所以当我们的代码在Docker容器中运行时,我们需要与管理我们的Docker守护进程进行交互。 这意味着我们需要得到它的IP地址。</p> <p>Docker有许多不同的风格——boot2docker,Docker for Windows / Mac和native for Linux。</p> <p>你可以使用docker run -net = host codenvy / che-ip来测试实用程序。 这将下载Eclipse Che IP实用程序。 它的大小约为4.8 MB。</p> <pre> $ docker run — net=host codenvy/che-ip 192.168.65.2</pre> <pre> $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE codenvy/che-ip latest a6bbac2f56dc 5 weeks ago 4</pre> <p>Dockerfile很简单——它添加了一个shell脚本并将其作为命令的一部分运行。</p> <pre> FROM alpine:3.4 COPY getip.sh /bin/getip.sh CMD [“/bin/getip.s</pre> <p>执行的脚本是一个简单的脚本。 它首先确定docker绑定的网络接口,然后使用该网络接口获取IP地址。 给定一个特定的网络接口,docker容器使用ip实用程序获取主机的IP地址(注意—net = host是 允许我们使用主机的网络配置,而不是容器的网络地址):</p> <p>ip a show “${NETWORK_IF}” | grep ‘inet' | cut -d/ -f1 | awk ‘{print $2}'</p> <p>Docker的不同实现将自己绑定到不同的网络接口。 一些是可预测的,而另一些不是。 因此,我们需要根据底层的主机配置来确定使用的适当的网络接口。</p> <p>如果安装的是Windows的 Docker 或Mac的 Docker ,那么我们要保证Docker在eth0上运行。</p> <pre> if uname -r | grep -q ‘moby’; then if [ -d “/sys/class/net/eth0” ]; then NETWORK_IF=eth0 fi fi</pre> <p>否则,检查会有点棘手。在这种情况下,Docker可以绑定到不同的 Ethernet 接口。我们知道Docker在非系统管理的VM中运行,因此我们在/ sys / class / net目录下查询,然后遍历所有返回的值,找到绑定在eth的第一个接口,然后这是Docker的网络接口。我们将要使用到的。</p> <pre> # If the NETWORK_IF has not been set, then search for it if test -z ${NETWORK_IF}; then for i in $(ls /sys/class/net); do if [ ${i:0:3} = eth ]; then NETWORK_IF=${i} fi done fi</pre> <p>然而,如果这两个函数都不返回有效的网络接口,那么这是因为一些Linux发行版为其接口提供了专门的名称,如CentOS的ensp0s3。在这种情况下,Docker通常绑定到docker0接口</p> <pre> # If the NETWORK_IF still not set, then search for docker0 if test -z ${NETWORK_IF} then if [ -d “/sys/class/net/docker0” ]; then NETWORK_IF=”docker0" fi fi</pre> <p>然而,如果该测试还是失败,那么就无法确定当前的接口。我们实例程序搜索Docker的ip时,我们将获取到位1的退出值,这个时候我们需要跟管理员交流,了解更多的信息。</p> <p>Great work by Florent Benoit ,Florent Benoit开发的这个实用程序。 Dockerfile的相关脚本和源代码在Che的GitHub库上 Che’s GitHub repository 。</p> <p> </p> <p>来自:https://www.oschina.net/translate/discovering-dockers-ip-address</p> <p> </p>