Docker Machine 是 Docker 官方提供的一個工具,它能夠幫助咱們在遠程的機器上安裝 Docker,或者在虛擬機 host 上直接安裝虛擬機並在虛擬機中安裝 Docker。咱們還能夠經過 docker-machine 命令來管理這些虛擬機和 Docker。下面是來自 Docker Machine 官方文檔的一張圖,很形象哦!git
本文將經過一系列 demo 來展現 Docker Machine 的主要使用場景。github
安裝 Docker Machine 前請先在本地安裝 Docker。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 是個開源項目,你能夠選擇安裝不一樣的版本,或者是自行編譯。下圖爲筆者安裝以後顯示的版本信息:併發
若是咱們有多臺 Ubuntu 主機都須要安裝 Docker,怎麼辦呢?是否是一個個登陸上去經過 apt-get 命令安裝呢?固然不須要,經過 docker-machine 命令咱們能夠輕鬆的在遠程主機上安裝 Docker。ssh
在使用 docker-machine 進行遠程安裝前咱們須要作一些準備工做:
1. 在目標主機上建立一個用戶並加入sudo 組
2. 爲該用戶設置 sudo 操做不須要輸入密碼
3. 把本地用戶的 ssh public key 添加到目標主機上curl
好比咱們要在遠程主機上添加一個名爲 nick 的用戶並加入 sudo 組:工具
$ sudo adduser nick $ sudo usermod -a -G sudo nick
而後設置 sudo 操做不須要輸入密碼:url
$ sudo visudo
把下面一行內容添加到文檔的最後並保存文件:spa
nick ALL=(ALL:ALL) NOPASSWD: ALL
最後把本地用戶的 ssh public key 添加到目標主機上:
$ ssh-copy-id -i ~/.ssh/id_rsa.pub nick@xxx.xxx.xxx.xxx
這幾步操做的主要目的是得到足夠的權限能夠遠程的操做目標主機。
在本地運行下面的命令:
$ 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。
在實際使用中咱們通常會在物理機上安裝 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 來啓動服務器端 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 命令,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 的版本就行了!