这是一个重复的 岗位 我已经在docker论坛上创建了。因此,一旦这个问题得到解决,我将关闭这个另一个论坛。但由于在docker论坛上没有人回答,而我的问题依然存在,所以我再发一次,期待得到答案。
我想把一个服务器监控应用作为docker容器暴露出来。我所写的应用依靠proc来读取系统信息,比如CPU利用率或磁盘统计。因此,我必须将hosts proc虚拟文件系统中提供的信息转发给我的docker容器。
所以我做了一个简单的镜像(使用docker网站上的第一个或第二个介绍。链接)并启动了它。
docker run -v=/proc:/host/proc:ro -d hostfiletest
假设运行中的容器可以从hostproc中读取主机系统的相关信息。
我在容器内部启动了一个控制台来检查。
docker exec -it {one of the funny names the container get} bash
并检查了hostproc的内容
最简单的检查方法是获取hostprocsyskernelhostname的内容--那应该产生我正在工作的vm的主机名.但我得到的是容器的主机名,而hostprocuptime得到的是vm正确的正常运行时间。
我在这里错过了什么吗?也许是概念性的东西?
Docker版本17.05.0-ce,构建89658be,运行在Linux 4.4.0-97-generic上(VM)。
更新。
我找到了几篇文章,介绍了如何使用我在上文提到的同样方法在一个包含内运行一个特定的监测应用程序。
更新:我找到了几篇文章,介绍了如何使用我上面提到的相同方法在一个包含中运行一个特定的监控程序。
刚刚尝试使用现有的Ubuntu镜像--同样的行为。用pid=host的特权运行镜像也没有用。
问候Peepe
我知道它的几个月后没有,但我今天遇到了同样的问题。
在我的情况下,我使用的是 psutil
来读取docker容器内主机的磁盘统计信息。
解决方法是将docker容器中的 整 主机文件系统作为只读到docker容器中,用 -v /:/rootfs:ro
并指定proc的路径为 psutil.PROCFS_PATH = '/rootfs/proc'
.
现在 psutil.disk_partitions()
列出了主机文件系统的所有分区。由于主机名也包含在proc层次结构中,我想这也适用于其他主机系统信息,只要检索命令指向的是 /rootsfs/proc
.
这个问题的原因是 /proc
不是一个正常的文件系统。根据 procfs它就像一个访问一些内核数据和系统信息的接口。这个接口提供了一个类似文件的结构,所以会让人误以为是一个普通的目录。文件在 /proc
也不是正常的文件,它们是空的(大小=0)。它们是空的(大小=0)。你可以自己检查一下。
$ stat /proc/sys/kernel/hostname
File: /proc/sys/kernel/hostname
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
所以这个文件并不存放任何数据,但是当你读取这个文件的时候,内核会动态地返回给你一个相应的系统信息。
回答你的问题。/proc/sys/kernel/hostname
只是一个访问主机名的接口。而根据你访问该接口的位置,在主机上还是在容器上,你将得到相应的主机名。这也适用于当你使用 bind mount -v /proc:/hosts/proc:ro
因为绑定挂载将提供另一种视角的 /proc
. 如果你调用接口 /hosts/proc/sys/kernel/hostname
内核将返回你所在的盒子(容器)的主机名。
简而言之,想想看/proc/sys/kernel/hostname
如同一面镜子,如果你的主机站在它面前,它就会反射出主机。如果它是容器,就会反射出容器。