Docker Machine 簡介

Docker Machine 是什么?

Docker Machine 是 Docker 官方提供的一個(gè)工具,它可以幫助我們?cè)谶h(yuǎn)程的機(jī)器上安裝 Docker,或者在虛擬機(jī) host 上直接安裝虛擬機(jī)并在虛擬機(jī)中安裝 Docker。我們還可以通過 docker-machine 命令來管理這些虛擬機(jī)和 Docker。下面是來自 Docker Machine 官方文檔的一張圖,很形象哦!

本文將通過一系列 demo 來展示 Docker Machine 的主要使用場(chǎng)景。

安裝 Docker Machine

安裝 Docker Machine 前請(qǐng)先在本地安裝 Docker。

Docker Machine 的安裝十分簡單,在 Ubuntu 中直接把可執(zhí)行文件下載到本地就可以了。

$?curl?-Lhttps://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 是最新的版本。當(dāng)然 Docker Machine 是個(gè)開源項(xiàng)目,你可以選擇安裝不同的版本,或者是自行編譯。下圖為筆者安裝之后顯示的版本信息:

在遠(yuǎn)程主機(jī)上安裝 Docker

如果我們有多臺(tái) Ubuntu 主機(jī)都需要安裝 Docker,怎么辦呢?是不是一個(gè)個(gè)登錄上去通過 apt-get 命令安裝呢?當(dāng)然不需要,通過 docker-machine 命令我們可以輕松的在遠(yuǎn)程主機(jī)上安裝 Docker?!?a target="_blank" rel="nofollow">這可能是最為詳細(xì)的Docker入門吐血總結(jié)】

前提條件

在使用 docker-machine 進(jìn)行遠(yuǎn)程安裝前我們需要做一些準(zhǔn)備工作:

在目標(biāo)主機(jī)上創(chuàng)建一個(gè)用戶并加入sudo 組

為該用戶設(shè)置 sudo 操作不需要輸入密碼

把本地用戶的 ssh public key 添加到目標(biāo)主機(jī)上

比如我們要在遠(yuǎn)程主機(jī)上添加一個(gè)名為 nick 的用戶并加入 sudo 組:

$?sudo?adduser?nick

$?sudo?usermod?-a?-G?sudo?nick

然后設(shè)置 sudo 操作不需要輸入密碼:

$?sudo?visudo

把下面一行內(nèi)容添加到文檔的最后并保存文件:

nickALL=(ALL:ALL)?NOPASSWD:ALL

最后把本地用戶的 ssh public key 添加到目標(biāo)主機(jī)上:

$?ssh-copy-id?-i?~/.ssh/id_rsa.pub?nick@xxx.xxx.xxx.xxx

這幾步操作的主要目的是獲得足夠的權(quán)限可以遠(yuǎn)程的操作目標(biāo)主機(jī)。

安裝命令

在本地運(yùn)行下面的命令:

$?docker-machinecreate-d?generic?\

--generic-ip-address=xxx.xxx.xxx.xxx?\

--generic-ssh-user=nick?\

--generic-ssh-key?~/.ssh/id_rsa?\

krdevdb

注意,create 命令本是要?jiǎng)?chuàng)建虛擬主機(jī)并安裝 Docker,因?yàn)楸纠械哪繕?biāo)主機(jī)已經(jīng)存在,所以僅安裝 Docker。-d 是 --driver 的簡寫形式,主要用來指定使用什么驅(qū)動(dòng)程序來創(chuàng)建目標(biāo)主機(jī)。Docker Machine 支持在云服務(wù)器上創(chuàng)建主機(jī),就是靠使用不同的驅(qū)動(dòng)來實(shí)現(xiàn)了。

本例中使用 generic 就可以了。接下來以 --generic 開頭的三個(gè)參數(shù)主要是指定操作的目標(biāo)主機(jī)和使用的賬戶。最后一個(gè)參數(shù) krdevdb 是虛擬機(jī)的名稱,Docker Machine 會(huì)用它來設(shè)置目標(biāo)主機(jī)的名稱?!?a target="_blank" rel="nofollow">Docker 基礎(chǔ) : 數(shù)據(jù)管理】

好了,就這么簡單!經(jīng)過簡短的等待 Docker 就在目標(biāo)機(jī)器上安裝成功了:

檢查安裝結(jié)果

我們可以通過 Docker Machine 的 ls 命令查看當(dāng)前可管理的主機(jī)列表:

其中的 krdevdb 主機(jī)就是剛才我們安裝了 Docker 的主機(jī),最后一列顯示了安裝的 Docker 版本:v17.05.0-ce。

然后執(zhí)行 eval $(docker-machine env krdevdb) 命令,就可以通過本地的客戶端操作遠(yuǎn)程主機(jī)上的 Docker daemon 了。執(zhí)行 docker version 命令看看:

請(qǐng)注意上圖中的 Client 和 Server 版本不一樣,這也說明了我們正在使用本地的 Client 連接遠(yuǎn)程的 Server。

在本地主機(jī)上安裝帶有 Docker 的虛機(jī)

在實(shí)際使用中我們一般會(huì)在物理機(jī)上安裝 vSphere 等虛擬機(jī)管理軟件,并稱之為虛擬機(jī) host。然后通過 vSphere 工具安裝虛擬機(jī)進(jìn)行使用。接下來我們將介紹如何在本地的一臺(tái)安裝了 vSphere 的虛擬機(jī) host 上安裝帶有 Docker 的虛擬機(jī)。直接上命令:

$?docker-machinecreate\

--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

解釋一下比較重要的參數(shù):

--driver?vmwarevsphere

我們的虛擬機(jī) host 上安裝的是 vmware 的產(chǎn)品 vSphere,因此需要給 Docker Machine 提供對(duì)應(yīng)的驅(qū)動(dòng),這樣才能夠在上面安裝新的虛擬機(jī)。

--vmwarevsphere-vcenter=xxx.xxx.xxx.xxx?\

--vmwarevsphere-username=root?\

--vmwarevsphere-password=12345678\

上面三行分別指定了虛擬機(jī) host 的 IP 地址、用戶名和密碼。

--vmwarevsphere-cpu-count=1\

--vmwarevsphere-memory-size=512\

--vmwarevsphere-disk-size=10240\

上面三行則分別指定了新創(chuàng)建的虛擬機(jī)占用的 cpu、內(nèi)存和磁盤資源。

testvm

最后一個(gè)參數(shù)則是新建虛擬機(jī)的名稱。

很快虛擬機(jī)的創(chuàng)建就完成了。先在 vSphere 的客戶端中看一下:

名為 testvm 的虛擬機(jī)已經(jīng)在運(yùn)行了。

再執(zhí)行 docker-machine ls 命令看看:

已經(jīng)可以看到 testvm了,并且它的 DRIVER 顯示為 vmwarevsphere。

這就搞定了嗎?

好像哪里不對(duì)呀!是的,平時(shí)我們手動(dòng)創(chuàng)建虛機(jī)時(shí)最重要的東西是什么?是安裝虛擬機(jī)的鏡像?。〉@里我們并沒有指定相關(guān)的東西,那么docker-machine 究竟給我們安裝了一個(gè)什么系統(tǒng)?

在使用 vmwarevsphere 驅(qū)動(dòng)安裝虛機(jī)時(shí),我們不能指定自己喜歡的虛機(jī)鏡像(可能是 Docker Machine 還沒有準(zhǔn)備好)。默認(rèn)使用一個(gè)叫做 boot2docker 的虛擬機(jī)鏡像,這個(gè)東西非常小,只有幾十兆,因此安裝會(huì)很快。

管理遠(yuǎn)程的 Docker

客戶端服務(wù)器模式

Docker 一直是以客戶端和服務(wù)器的模式運(yùn)行的,只不過起初的版本是通過同一個(gè)二進(jìn)制文件 docker 來啟動(dòng)服務(wù)器端 daemon 和客戶端的。在近期的版本中,服務(wù)端的可執(zhí)行文件已經(jīng)和客戶端的可執(zhí)行文件分離開了。查看 /usr/bin 目錄下的可執(zhí)行文件:

其中 dockerd 就是執(zhí)行服務(wù)器端任務(wù)的可執(zhí)行文件。而我們平時(shí)執(zhí)行本機(jī) docker 任務(wù)則主要通過 docker 這個(gè)客戶端命令給本機(jī)的服務(wù)器端發(fā)送任務(wù)。

使用本地的客戶端連接遠(yuǎn)程的服務(wù)器

那么本地的客戶端可不可以連接并發(fā)送任務(wù)給遠(yuǎn)程的 Docker 服務(wù)器端呢?當(dāng)然是可以的,只不過我們手動(dòng)設(shè)置起來稍微麻煩一些。不過沒關(guān)系,Docker Machine 都為我們做好了!

下面就讓我們看看如何通過本地的 Docker 客戶端在 krdevdb 這臺(tái)主機(jī)上運(yùn)行容器:

$?docker-machine?env?krdevdb

這個(gè)命令輸出的內(nèi)容可以作為命令來設(shè)置一些 Docker 客戶端使用的環(huán)境變量,從而讓本機(jī)的 Docker 客戶端可以與遠(yuǎn)程的 Docker 服務(wù)器通信。按照上面的提示執(zhí)行命令:

$eval$(?docker-machine?env?krdevdb)

好了,在當(dāng)前的命令行終端中,接下來運(yùn)行的 docker 命令操作的都是遠(yuǎn)程主機(jī) krdevdb 上的 Docker daemon。為了區(qū)分本機(jī)的 Docker daemon 操作,我們重新啟動(dòng)一個(gè)新的命令行終端,然后分別執(zhí)行 docker ps 命令:

從上圖中可以明顯的看出本地主機(jī)和遠(yuǎn)程主機(jī)上分別運(yùn)行著不同的容器。

管理遠(yuǎn)程 Docker daemon

除了運(yùn)行基本的 docker 命令,Docker Machine 還能夠管理遠(yuǎn)程的 Docker 主機(jī)。比如我們可以通過 start, stop, restart 命令分別啟動(dòng)、關(guān)閉和重啟遠(yuǎn)程的 Docker daemon。

這里的情況稍微復(fù)雜一些,只有支持這些命令的驅(qū)動(dòng)才能完成相關(guān)的操作。比如,我們分別關(guān)閉 krdevdb 和 testvm:

前一個(gè)提示 generic 驅(qū)動(dòng)不支持 stop 命令。而 testvm 是通過 vmwarevsphere 驅(qū)動(dòng)安裝的,所以成功的執(zhí)行了 stop。

對(duì)于遠(yuǎn)程管理來說,SSH 的支持是必不可少的!Docker Machine 當(dāng)然也盡職盡責(zé)的完成了任務(wù):

$?docker-machine?ssh?krdevdb

執(zhí)行上面的命令就可以了。注意,這個(gè)命令可不會(huì)提示你輸入密碼,當(dāng)然更不會(huì)讓你去配置 SSH 秘鑰什么的,因?yàn)?Docker Machine 私下全把臟活累活干完了。

總結(jié)

Docker Machine 的目的是簡化 Docker 的安裝和遠(yuǎn)程管理。從本文的內(nèi)容我們也可以看到,Docker Machine 確實(shí)為我們使用和管理 Docker 帶來了很多的便利。至于有待提高的方面,現(xiàn)在 Docker Machine 會(huì)安裝最新版本的 Docker,筆者覺得如果能夠支持指定安裝 Docker 的版本就好了!

擴(kuò)展閱讀

這可能是最為詳細(xì)的Docker入門吐血總結(jié)

Docker 基礎(chǔ) : 數(shù)據(jù)管理

徹底理解cookie,session,token

分布式之消息隊(duì)列復(fù)習(xí)精講

Vim 命令、操作、快捷鍵(收藏大全)

來源:https://www.cnblogs.com/sparkdev/p/7044950.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容