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

 哆啦356 发布于 2023-02-05 11:06

我想让我docker containers了解他们的配置,就像通过元数据获取有关EC2实例的信息一样.

我可以使用(提供的docker是监听端口4243)

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

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

另外,如何获取docker主机的外部IP(除了访问特定于AWS的EC2元数据)

9 个回答
  • 除非被覆盖,否则主机名似乎是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
    

    2023-02-05 11:07 回答
  • 我发现容器ID可以在/ proc/self/cgroup中找到

    所以你可以获得id:

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

    2023-02-05 11:07 回答
  • 警告:在考虑此方法之前,您应该了解此方法的安全风险.约翰对风险的总结:

    通过让容器访问/var/run/docker.sock,可以轻松地打开docker提供的包含并获得对主机的访问权限.显然这有潜在危险.


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

    使用与主机相同的版本在您的容器中安装docker-io软件包

    开始吧 --volume /var/run/docker.sock:/var/run/docker.sock --privileged

    最后,运行:docker inspect $(hostname)容器内部

    避免这样做.只有了解风险并明确减轻风险,才能做到这一点.

    2023-02-05 11:09 回答
  • 这将从容器中获取完整的容器ID:

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

    2023-02-05 11:09 回答
  • Madeddie的评论对我来说似乎最优雅:

    CID=$(basename $(cat /proc/1/cpuset))
    

    2023-02-05 11:09 回答
  • 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
    

    2023-02-05 11:09 回答
  • 为了简单起见,

      Container ID是docker中的主机名

      容器信息在/ proc/self/cgroup中可用

    要获得主机名,

    hostname
    

    要么

    uname -n
    

    要么

    cat /etc/host
    

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

    2023-02-05 11:09 回答
  • 我发现在17.09中有一种最简单的方法可以在docker容器中执行它:

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

    或者就像它已被告知,更短的版本

    $ cat /etc/hostname
    4de1c09d3f19
    

    或者干脆:

    $ hostname
    4de1c09d3f19
    

    2023-02-05 11:09 回答
  • 您可以使用unix socket通过Docker Remote API从容器内部与docker通信:

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

    在容器中,您可以通过检查$HOSTNAMEenv 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中.

    2023-02-05 11:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有