Docker Machine講解
本文在Docker Machine幾個使用場景上講的比較好,能很好的理解Docker Machine的作用,另外也涉及瞭如何操作遠端機器上的docker daemon,並通過TLS加密。
Docker Machine 是 Docker 官方提供的一個工具,它可以幫助我們在遠端的機器上安裝 Docker,或者在虛擬機器 host 上直接安裝虛擬機器並在虛擬機器中安裝 Docker。我們還可以通過 docker-machine 命令來管理這些虛擬機器和 Docker。下面是來自 Docker Machine 官方文件的一張圖,很形象哦!
本文將通過一系列 demo 來展示 Docker Machine 的主要使用場景。
安裝 Docker Machine
安裝 Docker Machine 前請先在本地安裝 Docker。
Docker Machine 的安裝十分簡單,在 Ubuntu 中直接把可執行檔案下載到本地就可以了。
$ curl -L https://github.com/docker/machine/releases/download/v0.12.0/docker-machine-`uname -s`-`uname -m` > /tmp/docker-machine $ chmod +x /tmp/docker-machine $ sudo mv /tmp/docker-machine /usr/local/bin/docker-machine
其中 v0.12.0 是最新的版本。當然 Docker Machine 是個開源專案,你可以選擇安裝不同的版本,或者是自行編譯。下圖為筆者安裝之後顯示的版本資訊:
在遠端主機上安裝 Docker
如果我們有多臺 Ubuntu 主機都需要安裝 Docker,怎麼辦呢?是不是一個個登入上去通過 apt-get 命令安裝呢?當然不需要,通過 docker-machine 命令我們可以輕鬆的在遠端主機上安裝 Docker。
前提條件
在使用 docker-machine 進行遠端安裝前我們需要做一些準備工作:
1. 在目標主機上建立一個使用者並加入sudo 組
2. 為該使用者設定 sudo 操作不需要輸入密碼
3. 把本地使用者的 ssh public key 新增到目標主機上
比如我們要在遠端主機上新增一個名為 nick 的使用者並加入 sudo 組:
$ sudo adduser nick
$ sudo usermod -a -G sudo nick
然後設定 sudo 操作不需要輸入密碼:
$ sudo visudo
把下面一行內容新增到文件的最後並儲存檔案:
nick ALL=(ALL:ALL) NOPASSWD: ALL
最後把本地使用者的 ssh public key 新增到目標主機上:
$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
這幾步操作的主要目的是獲得足夠的許可權可以遠端的操作目標主機。
安裝命令
在本地執行下面的命令:
$ docker-machine create -d generic \ --generic-ip-address=xxx.xxx.xxx.xxx \ --generic-ssh-user=nick \ --generic-ssh-key ~/.ssh/id_rsa \ krdevdb
注意,create 命令本是要建立虛擬主機並安裝 Docker,因為本例中的目標主機已經存在,所以僅安裝 Docker。-d 是 --driver 的簡寫形式,主要用來指定使用什麼驅動程式來建立目標主機。Docker Machine 支援在雲伺服器上建立主機,就是靠使用不同的驅動來實現了。本例中使用 generic 就可以了。接下來以 --generic 開頭的三個引數主要是指定操作的目標主機和使用的賬戶。最後一個引數 krdevdb 是虛擬機器的名稱,Docker Machine 會用它來設定目標主機的名稱。
好了,就這麼簡單!經過簡短的等待 Docker 就在目標機器上安裝成功了:
檢查安裝結果
我們可以通過 Docker Machine 的 ls 命令檢視當前可管理的主機列表:
其中的 krdevdb 主機就是剛才我們安裝了 Docker 的主機,最後一列顯示了安裝的 Docker 版本:v17.05.0-ce。
然後執行 eval $(docker-machine env krdevdb) 命令,就可以通過本地的客戶端操作遠端主機上的 Docker daemon 了。執行 docker version 命令看看:
請注意上圖中的 Client 和 Server 版本不一樣,這也說明了我們正在使用本地的 Client 連線遠端的 Server。
在本地主機上安裝帶有 Docker 的虛機
在實際使用中我們一般會在物理機上安裝 vSphere 等虛擬機器管理軟體,並稱之為虛擬機器 host。然後通過 vSphere 工具安裝虛擬機器進行使用。接下來我們將介紹如何在本地的一臺安裝了 vSphere 的虛擬機器 host 上安裝帶有 Docker 的虛擬機器。直接上命令:
$ docker-machine create \ --driver vmwarevsphere \ --vmwarevsphere-vcenter=xxx.xxx.xxx.xxx \ --vmwarevsphere-username=root \ --vmwarevsphere-password=12345678 \ --vmwarevsphere-cpu-count=1 \ --vmwarevsphere-memory-size=512 \ --vmwarevsphere-disk-size=10240 \ testvm
解釋一下比較重要的引數:
--driver vmwarevsphere
我們的虛擬機器 host 上安裝的是 vmware 的產品 vSphere,因此需要給 Docker Machine 提供對應的驅動,這樣才能夠在上面安裝新的虛擬機器。
--vmwarevsphere-vcenter=xxx.xxx.xxx.xxx \
--vmwarevsphere-username=root \
--vmwarevsphere-password=12345678 \
上面三行分別指定了虛擬機器 host 的 IP 地址、使用者名稱和密碼。
--vmwarevsphere-cpu-count=1 \
--vmwarevsphere-memory-size=512 \
--vmwarevsphere-disk-size=10240 \
上面三行則分別指定了新建立的虛擬機器佔用的 cpu、記憶體和磁碟資源。
testvm
最後一個引數則是新建虛擬機器的名稱。
很快虛擬機器的建立就完成了。先在 vSphere 的客戶端中看一下:
名為 testvm 的虛擬機器已經在運行了。
再執行 docker-machine ls 命令看看:
已經可以看到 testvm了,並且它的 DRIVER 顯示為 vmwarevsphere。
這就搞定了嗎?
好像哪裡不對呀!是的,平時我們手動建立虛機時最重要的東西是什麼?是安裝虛擬機器的映象啊!但這裡我們並沒有指定相關的東西,那麼docker-machine 究竟給我們安裝了一個什麼系統?在使用 vmwarevsphere 驅動安裝虛機時,我們不能指定自己喜歡的虛機映象(可能是 Docker Machine 還沒有準備好)。預設使用一個叫做 boot2docker 的虛擬機器映象,這個東西非常小,只有幾十兆,因此安裝會很快。
管理遠端的 Docker
客戶端伺服器模式
Docker 一直是以客戶端和伺服器的模式執行的,只不過起初的版本是通過同一個二進位制檔案 docker 來啟動伺服器端 daemon 和客戶端的。在近期的版本中,服務端的可執行檔案已經和客戶端的可執行檔案分離開了。檢視 /usr/bin 目錄下的可執行檔案:
其中 dockerd 就是執行伺服器端任務的可執行檔案。而我們平時執行本機 docker 任務則主要通過 docker 這個客戶端命令給本機的伺服器端傳送任務。
使用本地的客戶端連線遠端的伺服器
那麼本地的客戶端可不可以連線併發送任務給遠端的 Docker 伺服器端呢?當然是可以的,只不過我們手動設定起來稍微麻煩一些。不過沒關係,Docker Machine 都為我們做好了!下面就讓我們看看如何通過本地的 Docker 客戶端在 krdevdb 這臺主機上執行容器:
$ docker-machine env krdevdb
這個命令輸出的內容可以作為命令來設定一些 Docker 客戶端使用的環境變數,從而讓本機的 Docker 客戶端可以與遠端的 Docker 伺服器通訊。按照上面的提示執行命令:
$ eval $( docker-machine env krdevdb)
好了,在當前的命令列終端中,接下來執行的 docker 命令操作的都是遠端主機 krdevdb 上的 Docker daemon。為了區分本機的 Docker daemon 操作,我們重新啟動一個新的命令列終端,然後分別執行 docker ps 命令:
從上圖中可以明顯的看出本地主機和遠端主機上分別執行著不同的容器。
管理遠端 Docker daemon
除了執行基本的 docker 命令,Docker Machine 還能夠管理遠端的 Docker 主機。比如我們可以通過 start, stop, restart 命令分別啟動、關閉和重啟遠端的 Docker daemon。這裡的情況稍微複雜一些,只有支援這些命令的驅動才能完成相關的操作。比如,我們分別關閉 krdevdb 和 testvm:
前一個提示 generic 驅動不支援 stop 命令。而 testvm 是通過 vmwarevsphere 驅動安裝的,所以成功的執行了 stop。
對於遠端管理來說,SSH 的支援是必不可少的!Docker Machine 當然也盡職盡責的完成了任務:
$ docker-machine ssh krdevdb
執行上面的命令就可以了。注意,這個命令可不會提示你輸入密碼,當然更不會讓你去配置 SSH 祕鑰什麼的,因為 Docker Machine 私下全把髒活累活幹完了。
總結
Docker Machine 的目的是簡化 Docker 的安裝和遠端管理。從本文的內容我們也可以看到,Docker Machine 確實為我們使用和管理 Docker 帶來了很多的便利。至於有待提高的方面,現在 Docker Machine 會安裝最新版本的 Docker,筆者覺得如果能夠支援指定安裝 Docker 的版本就好了!