剑客
关注科技互联网

发现 Docker 的 IP 地址

使用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
$ docker images
REPOSITORY          TAG    IMAGE ID     CREATED     SIZE
codenvy/che-ip      latest a6bbac2f56dc 5 weeks ago 4

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
,Florent Benoit开发的这个实用程序。 Dockerfile的相关脚本和源代码在Che的GitHub库上 Che’s GitHub repository

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址