![](/img/trans.png)
[英]In a Docker app, access to /proc/self/pagemap shows Operation not permitted
[英]Docker - Access host /proc
這是我在 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 ,它就像一個訪問一些內核數據和系統信息的接口。 這個接口提供了類似文件的結構,所以容易讓人誤認為它是一個普通的目錄。 /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
只是訪問主機名的接口。 根據您訪問該接口的位置,在主機上還是在容器上,您將獲得相應的主機名。 當您使用 bind mount -v /proc:/hosts/proc:ro
,這也適用,因為 bind mount 將提供/proc
的替代視圖。 如果您調用接口/hosts/proc/sys/kernel/hostname
,內核將返回您所在的盒子(容器)的主機名。
總之,把/proc/sys/kernel/hostname
當做一個鏡像,如果你的主機站在它前面,它就會反映主機。 如果是容器,它會反映容器。
我知道幾個月后沒有,但我今天遇到了同樣的問題。
就我而言,我在 Python 中使用psutil
容器內讀取主機的磁盤統計信息。
解決方案是使用-v /:/rootfs:ro
將整個主機文件系統以只讀方式掛載到 docker 容器中,並將 proc 的路徑指定為psutil.PROCFS_PATH = '/rootfs/proc'
。
現在psutil.disk_partitions()
列出主機文件系統中的所有分區。 由於主機名也包含在 proc 層次結構中,我想這也適用於其他主機系統信息,只要檢索命令指向/rootsfs/proc
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.