红联Linux门户
Linux帮助

发现Docker的IP地址

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