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)来检索所有信息。
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/"
我发现在17.09年有一个最简单的方法在docker集装箱内做到这一点:
$ cat /proc/self/cgroup | head -n 1 | cut -d '/' -f3 4de1c09d3f1979147cd5672571b69abec03d606afcc7bdc54ddb2b69dec3861c
或者就像已经被告知的那样,一个更短的版本
$ cat /etc/hostname 4de1c09d3f19
或者干脆:
$ hostname 4de1c09d3f19
为了简单起见,
- 容器ID是您在docker中的主机名称
- 容器信息在/ proc / self / cgroup中可用
要获取主机名称,
hostname
要么
uname -n
要么
cat /etc/host
输出可以redirect到任何文件并从应用程序回读例如: # hostname > /usr/src//hostname.txt
使用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
- 我如何限制从docker容器中运行的python-script调用的ffmpeg的资源?
- Docker命令失败(在Windows中)
- Docker引擎安装失败
- 如何使用docker-compose创build一个mongo数据库?
- 在Docker下安装时回答对话问题是否可行?
- docker exec -it返回“无法在非ttyinput启用tty模式”
- 多个docker-compose项目之间的通信
- 我应该使用AWS Elastic Beanstalk还是Amazon EC2 Container Service(ECS)来扩展Docker容器?
- 是否有可能在正在运行的容器中启动一个shell会话(不使用ssh)