我想让我docker containers
了解他们的配置,就像通过元数据获取有关EC2实例的信息一样.
我可以使用(提供的docker
是监听端口4243
)
curl http://172.17.42.1:4243/containers/$HOSTNAME/json
得到它的一些数据,但想知道是否有更好的方法至少获得容器的完整ID,因为HOSTNAME
实际上缩短为12个字符,并且docker似乎在它上执行"最佳匹配".
另外,如何获取docker主机的外部IP(除了访问特定于AWS的EC2元数据)
除非被覆盖,否则主机名似乎是Docker 1.12中的短容器ID
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可以在/ proc/self/cgroup中找到
所以你可以获得id:
cat /proc/self/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
警告:在考虑此方法之前,您应该了解此方法的安全风险.约翰对风险的总结:
通过让容器访问
/var/run/docker.sock
,可以轻松地打开docker提供的包含并获得对主机的访问权限.显然这有潜在危险.
在容器内,dockerId是您的主机名.所以,你可以:
使用与主机相同的版本在您的容器中安装docker-io软件包
开始吧 --volume
/var/run/docker.sock:/var/run/docker.sock --privileged
最后,运行:docker inspect $(hostname)
容器内部
避免这样做.只有了解风险并明确减轻风险,才能做到这一点.
这将从容器中获取完整的容器ID:
cat /proc/self/cgroup | grep "cpu:/" | sed 's/\([0-9]\):cpu:\/docker\///g'
Madeddie的评论对我来说似乎最优雅:
CID=$(basename $(cat /proc/1/cpuset))
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
为了简单起见,
Container ID是docker中的主机名
容器信息在/ proc/self/cgroup中可用
要获得主机名,
hostname
要么
uname -n
要么
cat /etc/host
输出可以重定向到任何文件并从应用程序读回例如: # hostname > /usr/src//hostname.txt
我发现在17.09中有一种最简单的方法可以在docker容器中执行它:
$ cat /proc/self/cgroup | head -n 1 | cut -d '/' -f3 4de1c09d3f1979147cd5672571b69abec03d606afcc7bdc54ddb2b69dec3861c
或者就像它已被告知,更短的版本
$ cat /etc/hostname 4de1c09d3f19
或者干脆:
$ hostname 4de1c09d3f19
您可以使用unix socket通过Docker Remote API从容器内部与docker通信:
https://docs.docker.com/engine/reference/api/docker_remote_api/
在容器中,您可以通过检查$HOSTNAME
env var 找到缩短的docker id .根据doc,碰撞的可能性很小,我认为对于少量的容器,你不必担心它.我不知道如何直接获得完整的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中.