2017-08-03 114 views
0

如何通過從碼頭集裝箱運行命令來訪問主機?我需要訪問主機,以便我可以檢查泊塢窗容器和圖像的空間使用情況。通過碼頭集裝箱訪問主機

+1

你的問題是類似於這一個:https://stackoverflow.com/questions/32163955/how-to-run-shell-script-on-host-from-docker-container但接受的答案似乎是有缺陷的。 – Paul

+0

感謝您的回答。我會檢查線程中提供的可能解決方案是否也適用於我的情況。 – Vaanz

回答

1

這個問題基本上是「我怎樣才能從碼頭集裝箱的主機抓取數據」。

就像保羅所說,搬運工集裝箱意思是用於運行應用程序的獨立環境,從主機環境隔離。

與虛擬機類似,但更輕量。因此,容器並不意味着有能力直接向主機執行shell命令。

我想這是專爲安全起見,以及因爲你不希望惡意的集裝箱像格式化磁盤的主機上執行命令的邪惡。

回到問題。

從根本上說,這些都是非常標準的方式的容器可以訪問它的主機的數據;

  1. Unix域套接字
  2. 網絡插座例如寧靜或Web服務

Unix域套接字:

這個想法是有充當服務器偵聽一個Unix domain socket在主機上運行的進程。然後容器將有一個客戶端進程來請求服務器的資源。在這種情況下,資源可以是asking about diskspace

該方法要求*.sock插座文件的文件路徑是在主機和容器,這可以通過使用docker volume命令來實現之間可見。

優勢: 解決方案是可擴展的,你可以,一旦你已經建立了客戶端 - 服務器程序的請求增添別樣。

缺點 可能需要一點時間來構建應用程序。如果你問我,有點矯枉過正。

音量開到

您從主機到容器裝入filepath。然後,您創建一個快速且髒的shell腳本,將df的結果寫入文件並將其放置在共享目錄區域中。

然後在容器中,您將有另一個cron作業來運行一個程序/腳本不斷地parsedf結果,並做任何你需要做的事情之後。

優勢:
還不如你不必寫的小程序來讀取和寫入輸出前一種方案一樣昂貴。

缺點: 可能是骯髒的或不可能的擴展這個解決方案,服務於不同類型的資源。例如。從主機的shell運行程序。

RESTFUL/Web服務的方式

非常非常相似unix domain socket方法太多,但你跟HTTP這裏。您仍然以不同的方式編寫客戶端/服務器程序。然而,它比第一種策略更麻煩,因爲您需要額外的步驟來查找網絡接口的IP地址docker0。這是爲了讓您知道容器如何連接到host

優點: 可擴展的。 您可以使用此程序來控制部署REST服務器的任何遠程主機。

缺點: 昂貴的發展。可能對你的用例超級過度。

結論

我可能只是去docker volume方式。

有一個cron作業來運行一個簡單的shell腳本來運行df,處理它的輸出,並且只需在文件中寫入「TRUE」或「FALSE」關鍵字。

然後,只需在容器中有另一個shell腳本,即cat該文件,以確定是否在預期關鍵字時觸發某些其他腳本。

+0

非常感謝你的詳細解釋。我會檢查每種可能的解決方案,以提供更適合我的情況。 – Vaanz

+0

這是我們得到的更簡單的解決方案。創建一個cron作業,監視磁盤使用情況並每隔幾分鐘將其存儲在一個文件中,然後將該文件掛載到docker容器中。 – Vaanz

1

如果安裝在容器中的ssh客戶端和主機上的sshd服務器,您可以從容器ssh來執行命令的主機。爲了避免輸入密碼,例如自動運行腳本,使用ssh鍵。

據我所知,搬運工不提供從容器主機上下文中執行的命令的裝置。 docker的要點是包含容器,而不是讓它們在主機上執行命令。

相反更容易。您可以通過使用docker exec

+0

我會檢查我們是否也可以獲得憑據,或者他們可以向我們提供用於SSH到主機的密鑰。謝謝! – Vaanz

+0

也許如果你有一個想法,是否有一種方法來檢查我的容器和碼頭容器中的圖像的空間使用情況?嘗試在碼頭集裝箱內運行df -vha,但它只顯示整個碼頭的總空間使用情況,包括我們不關心的圖像。 – Vaanz

+0

@Vaanz您可以在每分鐘運行df命令的主機上設置一個cron作業,然後使用'docker cp'將容器複製到容器中的文件中。 – Paul

2

輸入來自主機的容器上下文如果你想有它運行的任務來監控您的碼頭工人主機系統的使用,更多的容器,你應該看看https://prometheus.io/https://github.com/prometheus/node_exporter

節點出口容器從安裝在主機多克爾得到的procfs和sysfs中,並因此能夠向監控主機的指標。

-v "/proc:/host/proc:ro" \ 
    -v "/sys:/host/sys:ro" \ 
+0

是的,我同意這個解決方案。它與訪問主機通過安裝主機路徑相似。這是更直接的方式。 – Jared