linux - Docker - 访问主机/进程

标签 linux docker virtualization

这是 post 的副本我已经在 docker 论坛中创建了。因此,一旦这个问题得到解决,我将关闭这个/另一个。但是docker论坛没人回答,我的问题依旧,我再发一次,期待得到答案。

我想将服务器监控应用程序公开为 docker 容器。我编写的应用程序依赖于/proc 来读取系统信息,例如 CPU 利用率或磁盘统计信息。因此,我必须将 hosts/proc 虚拟文件系统中提供的信息转发到我的 docker 容器中。

所以我制作了一个简单的图像(使用 docker 网站上的第一个或第二个介绍:Link)并启动它:

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 的内容——这应该会产生我正在使用的虚拟机的主机名。 但是我得到了容器的主机名,而/host/proc/uptime 得到了虚拟机的正确运行时间。

我在这里错过了什么吗?也许是概念上的东西?

Docker 版本 17.05.0-ce,构建 89658be,在 Linux 4.4.0-97-generic (VM) 上运行

更新:

我找到了几篇描述如何使用我上面提到的相同方法在容器内运行特定监控应用程序的文章。

更新:

刚刚尝试使用现有的 Ubuntu 镜像 - 相同的行为。以 pid=host 特权运行图像无济于事。

问候语 窥视

最佳答案

这个问题的原因是/proc 不是一个普通的文件系统。根据procfs ,它就像是访问一些内核数据和系统信息的接口(interface)。这个接口(interface)提供了一个类似文件的结构,所以它会让人误以为它是一个普通的目录。 /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 只是一个访问主机名的接口(interface)。并且根据您在主机或容器上访问该接口(interface)的位置,您将获得相应的主机名。当您使用 bind mount -v/proc:/hosts/proc:ro 时也适用,因为 bind mount 将提供 /proc 的替代 View 。如果你调用接口(interface)/hosts/proc/sys/kernel/hostname,内核将返回你所在的盒子(容器)的主机名。

简而言之,把/proc/sys/kernel/hostname想象成一面镜子,如果你的主机站在它前面,它就会反射出主机。如果它是容器,它将反射(reflect)容器。


关于linux - Docker - 访问主机/进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47072586/

相关文章:

php - Magento 不显示错误

linux - server.sh : 2: . : properties. conf: 未找到

Docker:proxy_pass 到另一个容器 - nginx:在上游找不到主机

vmware - 虚拟机

security - 模糊测试/逆向工程虚拟机

php - Linux : Pack PHP - MySQL app in RPM

linux - 将多行日志文件转换为 CSV

azure - Docker 无法从 Azure 应用服务中提取镜像

使用 whois 命令的 Bash 脚本在 docker 上出现 "Servname not supported..."错误

linux - 网络数据在同一物理主机上的两个 LXC 容器之间走什么路径?