Docker,如何从容器中获取容器信息?

我想让我的docker containers知道它们的configuration,就像通过元数据获取有关EC2实例的信息一样。

我可以使用(提供的docker正在监听端口4243

 curl http://172.17.42.1:4243/containers/$HOSTNAME/json 

得到它的一些数据,但想知道是否有更好的方法,至less得到容器的完整ID,因为HOSTNAME实际上缩短为12个字符,并且docker似乎执行了“最佳匹配”。

另外,如何获取Docker主机的外部IP(除访问AWS特有的EC2元数据外)

我发现容器id可以在/ proc / self / cgroup中find

所以你可以得到的ID:

 cat /proc/self/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/" 

您可以通过Docker Remote API使用unix套接字从容器内部与docker进行通信:

https://docs.docker.com/engine/reference/api/docker_remote_api/

在一个容器中,你可以通过检查$HOSTNAME env var来find一个简短的docker id。 据医生说,碰撞的可能性很小,我认为对于less量的容器,你不必担心。 我不知道如何直接获得完整的ID。

您可以像榕树中所概述的类似方式检查容器的答案:

 GET /containers/4abbef615af7/json HTTP/1.1 

响应:

 HTTP/1.1 200 OK Content-Type: application/json { "Id": "4abbef615af7...... ", "Created": "2013.....", ... } 

或者,您可以将docker id传送到文件中的容器。 该文件位于“已安装的卷”,所以它被转移到容器:

 docker run -t -i -cidfile /mydir/host1.txt -v /mydir:/mydir ubuntu /bin/bash 

docker id(缩写)将在容器中的文件/mydir/host1.txt中。

除非重写,否则主机名似乎是Docker 1.12中的简短容器标识

 root@d2258e6dec11:/project# cat /etc/hostname d2258e6dec11 

外部

 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2258e6dec11 300518d26271 "bash" 5 minutes ago $ docker -v Docker version 1.12.0, build 8eab29e, experimental 

这将从容器中获取完整的容器ID:

 cat /proc/self/cgroup | grep "cpu:/" | sed 's/\([0-9]\):cpu:\/docker\///g' 

在容器内部,dockerId是你的主机名。 所以,你可以:

  • 将Docker-io软件包安装在与主机相同版本的容器中
  • --volume /var/run/docker.sock:/var/run/docker.sock --privileged启动它
  • 最后,运行: docker inspect $(hostname)在容器内docker inspect $(hostname)

您可以使用此命令行来标识当前容器标识(使用docker 1.9进行testing)。

 awk -F"-|/." '/1:/ {print $3}' /proc/self/cgroup 

然后,请求Docker API(可以共享/var/run/docker.sock)来检索所有信息。

我发现在17.09年有一个最简单的方法在docker集装箱内做到这一点:

 $ cat /proc/self/cgroup | head -n 1 | cut -d '/' -f3 4de1c09d3f1979147cd5672571b69abec03d606afcc7bdc54ddb2b69dec3861c 

或者就像已经被告知的那样,一个更短的版本

 $ cat /etc/hostname 4de1c09d3f19 

或者干脆:

 $ hostname 4de1c09d3f19 

为了简单起见,

  1. 容器ID是您在docker中的主机名称
  2. 容器信息在/ proc / self / cgroup中可用

要获取主机名称,

 hostname 

要么

 uname -n 

要么

 cat /etc/host 

输出可以redirect到任何文件并从应用程序回读例如: # hostname > /usr/src//hostname.txt

 awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup 

顺便说一下,如果你有容器的pid,并想获得该容器的docker id,一个好方法是将nsenter与上面的sed魔术结合使用:

nsenter -n -m -t pid -- cat /proc/1/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"

默认情况下,Docker将主机名设置为容器ID,但用户可以使用--hostname来覆盖它。 相反,检查/proc

 $ more /proc/self/cgroup 14:name=systemd:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 13:pids:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 12:hugetlb:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 11:net_prio:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 10:perf_event:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 9:net_cls:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 8:freezer:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 7:devices:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 6:memory:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 5:blkio:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 4:cpuacct:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 3:cpu:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 2:cpuset:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 1:name=openrc:/docker 

这是一个方便的单行提取容器ID:

 $ grep "memory:/" < /proc/self/cgroup | sed 's|.*/||' 7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605 

使用docker inspect

 $ docker ps # get conteiner id $ docker inspect 4abbef615af7 [{ "ID": "4abbef615af780f24991ccdca946cd50d2422e75f53fb15f578e14167c365989", "Created": "2014-01-08T07:13:32.765612597Z", "Path": "/bin/bash", "Args": [ "-c", "/start web" ], "Config": { "Hostname": "4abbef615af7", ... 

可以如下获取IP。

 $ docker inspect -format="{{ .NetworkSettings.IPAddress }}" 2a5624c52119 172.17.0.24