Docker Machine深入學習

2022-09-25 11:00:13 字數 2777 閱讀 6434

筆者在《docker machine 簡介》一文中簡單介紹了 docker machi程式設計客棧ne 及其基本用法,但是忽略的細節實在是太多了。比如 docker 與 docker machine 的區別?又如當我們執行 docker-machine create 命令時,docker machine 都做了哪些重要的事情使得我們可以遠端操作 docker daemon?這樣的遠端操作安全嗎?本文將試**讀這些問題。注:本文的演示環境為 ubuntu16.04。

docker 與 docker machine 的區別

docker 是乙個 client-server 架構的應用,人家是有官稱的:docker engine。docker 只是大家對 docker engine 的暱稱,當然 docker 還有其他的意思,比如一家公司的名稱。簡單起見,本文中的 docker 等同於 docker engine。

提到 docker 我們必須要知道它包含了三部分內容:

下圖很清晰的展示了它們之間的關係:

docker machine則是乙個安裝和管理 docker 的工具。它有自己的命令列工具:docker-machine。

docker daemon socket

既然 docker 客戶端要和 docker daemon 通過 rest api 通訊,那就讓我們看看它們可以採用的方法有哪些:

我們可以簡單的把 1 和 2 理解成一種方式,就是同一臺主機上的程序間通訊。至於 3 則很好理解:通過 tcp 協議進行跨網路的通訊。

既然 1 和 2 用於同一臺機器上的程序間通訊,那麼我們可以猜想:安裝在同一主機上的 docker 客戶端和 docker daemon 就是通過這種方式來通訊的。事實也正是如此,我們可以檢視安裝 docker 時預設新增的 docker daemon 啟動配置,開啟檔案 /etc/systemd/system/multi-user.target.wants/docker.service:

圖中的 -h 用來指定 docker daemon 監聽的 socket,此處指定的型別為 system socket activation。使用型別 1 和 2 進行通訊需要程序具有 root 許可權。這也是 docker 安裝過程中會自動建立乙個具有 root 許可權的使用者和使用者組的主要原因。新建立的使用者和使用者組名稱為 docker,建議大家把需要操作slknxqmkj docker 的使用者都加入到這個組中,否則當你執行命令時就會碰到下圖顯示的問題:

我們還可以同時指定多個 -h 引數讓 docker daemon 同時監聽不同的 socket 型別。比如要新增對 tcp 埠 2376 的監聽就可以使用下面的命令列引數:

$ sudo dockerd -h fd:// -h tcp:

執行上面的命令,然後檢視本機監聽的埠:

此時我們就可以從遠端主機上的 docker 客戶端訪問這部主機的 2376 埠了。

docker_host 環境變數

docker 客戶端預設的配置是訪問本機的 docker daemon,當你指定了 docker_host 變數後,docker 客戶端會訪問這個變數中指定的 docker daemon。讓我們回顧一下 docker-machine env 命令:

原來我們在前文中執行的 $ eval $(docker-machine env krdevdb) 命令就是在設定 docker_host 環境變數。

解決安全問題

我們的 docker daemon 監聽了 tcp 埠,糟糕的是此時我們沒有做任何的保護措施。因此任何 docker 客戶端都可以通過 tcp 埠與我們的 docker daemon 互動,這顯然是無法接受的。解決方案是同時啟用 docker daemon 和 docker 客戶端的 tls 證書認證機制。這樣 docker daemon 和 docker 客戶端之間的通訊會被加密,並且只有安裝了特定證書的客戶端才能夠與對應的 docker daemon 互動。

至此本文的鋪墊部分終於結束了,接下來我們將討論 docker machine 相關的內容。

docker machine create 命令

根據 docker machine 驅動的不同,create 命令執行的操作也不太一樣,但其中有兩步是我們在這裡比較關心的:

docker-machine 會在您指定的主機上執行下面的操作:

配置 docker daemon

docker 的安裝過程並沒有什麼秘密,這裡不再贅述。我們重點關注 docker daemon 的配置。仔細觀察我們會發現,通過 docker-machine 安裝的 docker 在 /etc/systemd/system 目錄下多出了乙個 docker 相關的目錄:docker.service.d。這個目錄中只有乙個檔案 10-machine.conf:

好吧,-h tcp: 出現在這裡並沒有讓我們太吃驚。在我們做了巨多的鋪墊之後,你應該覺得這是理所當然才是。--tls 開頭的幾個引數主要和證書相關,我們會在後面的安全設定中詳細的介紹它們。讓人多少有些疑惑的地方是上圖中的 /usr/bin/docker。當前最新版本的 docker machine 還在使用舊的方式設定 docker daemon,希望在接下來的版本中會有所更新。

這個配置檔案至關重要,因為它會覆蓋 docker 預設安裝時的配置檔案,從而以 docker machine 指定的方式啟動 docker daemon。至此我們有了乙個可以被遠端訪問的 docker daemon。

生成證書

我們在 docker daemon 的配置檔案中看到四個以 --tls 開頭的引數,分別是 --tls和 –tlskey。其中的 --tlsverify 告訴 docker daemon 需要通過 tls 來驗證遠端客戶端。其它三個引數分別指定了乙個 pem 格式檔案的路徑,按照它們指定的檔案路徑去檢視一下:

docker和docker machine的安裝

mac os x 下用 docker toolbox,而且命令也由 boot2docker 換成了 docker machine.當然由於是非 linux 系統,所以mac os x 仍然需要借助於 virtualbox 中的 linux 虛擬機器作為橋梁,docker toolbox 建立的虛擬機...

docker machine建立虛擬機器

docker machine 是一種可以讓您在虛擬主機上安裝 docker 的工具,並可以使用 docker machine 命令來管理主機。docker machine 也可以集中管理所有的 docker 主機,比如快速的給 100 臺伺服器安裝上 docker。使用 docker machine...

深入篇 decltype深入分析

int fun int main void double tempa 3.0 const double ctempa 5.0 const double ctempb 6.0 const double const cptrtempa ctempa 1.dcltempa推斷為const double 保...