linux - 如何使用 cgroup v2 从容器内获取 docker 容器 ID

标签 linux docker cgroups

由于 Docker 自引擎版本 20.10 起支持 cgroup v2,它将自动在启用了 cgroups v2 的发行版上使用它。从容器内获取唯一容器 ID 的已知解决方案不再有效。

/ # cat /proc/self/cgroup
0::/

/ # cat /proc/1/cpuset
/
使用 alpine:latest 在 Debian 11 上尝试使用 docker v20.10.8。
cgroup v1 的工作解决方案:
How can I get Docker Linux container information from within the container itself?
正如 docker 引用中所述,使用 cgroup v2,容器 id 在文件系统中的以下位置仍然可见,但无法从容器本身访问这些位置。
/sys/fs/cgroup/memory/docker/<longid>/ on cgroup v1, cgroupfs driver
/sys/fs/cgroup/memory/system.slice/docker-<longid>.scope/ on cgroup v1, systemd driver
/sys/fs/cgroup/docker/<longid/> on cgroup v2, cgroupfs driver
/sys/fs/cgroup/system.slice/docker-<longid>.scope/ on cgroup v2, systemd driver
https://docs.docker.com/config/containers/runmetrics/#find-the-cgroup-for-a-given-container
编辑 1/2021-09-01:
一种解决方法是使用选项 --cgroupns host 运行容器.但这需要控制容器的创建。
$ docker run -it --cgroupns host alpine cat /proc/self/cgroup
0::/system.slice/docker-09ec67119d38768dbf7994d81c325e2267214428a3c2e581c81557e3650863d8.scope

$ docker run -it alpine cat /proc/self/cgroup
0::/

问题:
有什么办法可以从内部获取唯一的容器 ID? (不依赖容器主机名或必须使用 docker api 来获取 id)

最佳答案

我在尝试从 cgroup 获取容器标识时遇到了同样的问题。
但是还有另一种方法可以实现相同的目标。 Docker 容器依赖于 OverlayFS 存储驱动程序,每个容器都会分配一个 unqiue 目录,该目录映射到写入容器文件的虚拟文件系统。

root@container:~# cat /proc/self/mountinfo | grep -i overlay

767 553 0:187 / / rw,relatime master:167 - overlay overlay rw,lowerdir=/var/lib/docker/overlay2/l/ZTHS22AHCPD2HJEY6UIKIO3BHY:/var/lib/docker/overlay2/l/4P6QELQ6532G5362S5VVTA7Y7K,upperdir=/var/lib/docker/overlay2/76c8877e95fa589df1fb97bf831ec221df130fdfb8f1f1cb8166bd99bebf51de/diff,workdir=/var/lib/docker/overlay2/76c8877e95fa589df1fb97bf831ec221df130fdfb8f1f1cb8166bd99bebf51de/work
如上图所示,upperdir=/var/lib/docker/overlay2/76c8877e95fa589df1fb97bf831ec221df130fdfb8f1f1cb8166bd99bebf51de/diff位于主机中,它只为分配给它的一个容器提供服务。
请注意,OverlayFS 可以替换为任何实现存储驱动程序规范的驱动程序,但 upperdir信息保持相同的结构。
确保必须在容器内做出决定,因为如果 LXC 在主机上部署,主机将显示 OverlayFS 挂载信息。

关于linux - 如何使用 cgroup v2 从容器内获取 docker 容器 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68816329/

相关文章:

c++ - Eclipse 3.8 看不到 gtkmm.h

docker - flutter 网络 : Some png assets not loaded (404) status

linux - 有没有办法读取 cgroups 用来终止进程的内存计数器?

kubernetes - 共享容器中容器的CPU限制

linux - 任务退出后从cgroup中移除

Javascript 如何将纯文本中的日期接收到公式中

Linux 64 位 BAR 编程

linux - Sed/Awk 对文本的操作

Docker 基础知识,如何保存已安装的包和编辑过的文件?

amazon-web-services - 在单个 docker 容器环境中配置 nginx (AWS ElasticBeanstalk)