这是我在docker论坛中发表的post的副本。因此,一旦这个问题得到解决,我就会关闭这个/另一个。但是,由于没有人在码头论坛上回答并且我的问题仍然存在,所以再次发帖,期待得到答案。
我想将服务器监控应用程序公开为docker容器。我编写的应用程序依赖于/ proc来读取系统信息,如CPU利用率或磁盘统计信息。因此,我必须将hosts / proc虚拟文件系统中提供的信息转发到我的docker容器。
所以我制作了一个简单的图像(使用docker网站上的第一个或第二个介绍:Link)并启动它:
docker run -v=/proc:/host/proc:ro -d hostfiletest
docker run -v = / proc:/ host / proc:ro -d hostfiletest 假设正在运行的容器可以从/ host / proc读取以获取有关主机系统的信息。
我在容器内启动了一个控制台来检查:
docker exec -it {one of the funny names the container get} bash
并检查/ host / proc。
的内容检查它的最简单方法是获取/ host / proc / sys / kernel / hostname的内容 - 这应该产生vm iam工作的主机名。 但是我得到了容器的主机名,而/ host / proc / uptime让我获得了vm的正确运行时间。
我在这里想念一下吗?也许是概念性的东西?
Docker版本17.05.0-ce,在Linux 4.4.0-97-generic(VM)上运行构建89658be
更新
我发现了一些文章描述了如何使用上面提到的相同方法在包含内运行特定的监控应用程序。
更新
尝试使用现有的Ubuntu映像 - 相同的行为。使用pid = host运行图像特权并没有帮助。
问候 Peepe
答案 0 :(得分:2)
此问题的原因是/proc
不是普通的文件系统。根据{{3}},它就像一个访问某些内核数据和系统信息的接口。该接口提供了类似文件的结构,因此可能使人们误解它是普通目录。
/proc
中的文件也不是普通文件。它们为空(大小= 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
只是访问主机名的界面。根据访问该接口的位置,主机还是容器,您将获得相应的主机名。当您使用绑定安装-v /proc:/hosts/proc:ro
时,也会应用此方法,因为绑定安装将提供/proc
的备用视图。如果调用接口/hosts/proc/sys/kernel/hostname
,则内核将返回您所在的盒子(容器)的主机名。
简而言之,请考虑/proc/sys/kernel/hostname
作为一面镜子,如果您的主机站在它的前面,它将反映出该主机。如果是容器,它将反映容器。
答案 1 :(得分:0)
我知道几个月后没有,但我今天遇到了同样的问题。
就我而言,我在Python中使用psutil
来从docker容器中读取主机的磁盘统计信息。
解决方案是将整个主机文件系统作为只读装载到具有-v /:/rootfs:ro
的docker容器中,并将proc的路径指定为psutil.PROCFS_PATH = '/rootfs/proc'
。
现在psutil.disk_partitions()
列出了主机文件系统中的所有分区。由于主机名也包含在proc层次结构中,我想这也适用于其他主机系统信息,只要检索命令指向/rootsfs/proc
。