搭建環境向來是一個重複造輪子的過程,Docker Machine 則把使用者搭建 Docker 環境的各種方案彙集在了一起。筆者在《Docker Machine 簡介》一文中演示了使用 Docker Machine 在本地的 vSphere 主機中安裝 Docker 環境。但是在雲端計算大爆炸的今天,真正讓我們頭疼的可能是五花八門的 IaaS 平臺!這才是 Docker Machine 真正發揮威力的地方。
Docker Machine 把與平臺相關的部分封裝到了不同的驅動中。只要為某個 IaaS 平臺提供了驅動程式,Docker Machine 就能夠支援該平臺上的操作。像 Azure、AWS、GCE、DigitalOcean 等大的廠商早已被支援。本文將以 Azure 為例介紹使用 Docker Machine 在 IaaS 上建立並管理 Docker 虛擬主機。
如果您還不瞭解 Docker Machine ,請先移步筆者的前兩篇文章補充相關知識:《Docker Machine 簡介》、《Docker Machine 詳解》。
準備
我們的目標是通過 Docker Machine 在 Azure 上面建立一臺安裝了 Docker 的虛擬主機。因為 Azure 上的所有資源都必須通過訂閱賬號才能授權使用,所以我們首先得準備一個 Azure 的訂閱賬號。國內的 Azure 一直在搞一元試用的活動,趕快去申請一個吧!
Azure 建議我們把資源通過 resource group 組織起來。為了演示方便,我們新建立一個名為 nickcontainer 的 resource group 存放將要建立的虛機:
此時 resource group 中還沒有任何內容。
建立雲端虛機
使用 Docker Machine,一個 create 命令就能搞定:
docker-machine create \ --driver azure \ --azure-environment AzurePublicCloud \ --azure-subscription-id xxxxxxxxxxxxxxxxxxxxxxxxxx \ --azure-location "East Asia" \ --azure-size Standard_A0 \ --azure-image canonical:UbuntuServer:16.04.0-LTS:latest \ --azure-ssh-user nick \ --azure-resource-group nickcontainer \ --azure-availability-set testvmtiggeras \ testvmtigger
使用國內 Azure 的使用者請把引數 --azure-environment AzurePublicCloud 修改為 --azure-environment AzureChinaCloud。
執行上面的命令,首先會驗證我們是否有許可權訪問 Azure 進行操作:
這時執行流程停住了,上圖的輸出中說的很明確,需要在瀏覽器中訪問 https://aka.ms/devicelogin,然後輸入一個驗證碼:
填入驗證碼並繼續:
在此處輸入你的訂閱賬號和密碼就可以進完成身份驗證了:
此時身份認證過程已經完成,可以關掉瀏覽器了。回到剛才的命令列,發現又接著往下執行了。整個過程大概需要幾分鐘,直到輸出下面的內容:
讓我們看看虛機 testvmtigger 的狀態:
已經處於 "Runing" 狀態,連上 Docker daemon 試試:
可以看到伺服器端的版本是 17.05.0-ce,遠高於本地客戶端的版本。
再讓我們回到 Azure 的 portal 上,看看 resource group 中新建立了哪些內容:
一看嚇一跳,怎麼這麼多東西?其實玩過 Azure 虛機的同學都知道,當我們建立一臺虛機的同時會建立這臺虛機依賴的所有資源,比如儲存、虛擬網路、網路安全組、可用性集合、網路卡、公有IP地址等等。這裡我們只關心兩點(上圖中的紅框框)就足夠了:第一,虛機被成功建立了;第二,所有資源的區域都在東亞。
經過一輪檢查,我們可以確定 create 命令很好的完成了任務:在 Azure 上建立了虛機,並且安裝了 Docker 環境。下面我們解釋一下 create 命令中主要的幾個引數。
引數詳解
--driver azure
driver 引數告訴 Docker Machine 我們操作的物件在 Azure 雲上,需要使用 Azure 相關的介面來進行操作。
--azure-environment AzurePublicCloud
其實存在多套相互獨立的 Azure 雲環境,比如國內的。所以需要用這個引數來指定具體的 Azure 雲環境。預設值是 AzurePublicCloud,指向我們說的 Azure 國際版。連線國內版需要指定為 AzureChinaCloud。
--azure-subscription-id xxxxxxxxxxxxxxxxxxxxxxxxxx
這個是與你賬號關聯的訂閱 ID,Azure 內部的操作都是依賴於這個 ID 的。
--azure-location "East Asia"
Azure 在全球各地部署了很多的資料中心,我們可以通過 location 指定建立的資源所在的位置。這個位置當然是越靠近使用者越好,國內的國際版使用者選擇東亞稍微好一點。
--azure-size Standard_A0
Azuer 根據不同的 size(其實就是配置)對虛擬機器進行收費,demo 中選擇的 Standard_A0 大概是這個樣子:
雖然配置不高,但作為 demo 來說已經足夠用了。MS 提供了非常豐富的 size 可供選擇,如果你要建立生產環境的虛機例項,可能需要選擇每個月幾十到幾百美金的例項。
--azure-image canonical:UbuntuServer:16.04.0-LTS:latest
對於生產環境來說,虛機的映象是至關重要的。Demo 中使用了 ubuntu server 16.04 的映象,當然我們可以在這裡指定 Azure 支援的任何虛擬機器映象。這點可比只能使用 boot2docker 的驅動強多了!
--azure-ssh-user nick
可以通過 SSH 登入到虛擬機器中的使用者,讓我們試一下:
直接以使用者 nick 登入成功了,其實 Docker Machine 已經為這個使用者配置了通過祕鑰登入的相關資訊。
--azure-resource-group nickcontainer
新建立的資源所屬的 resource group。
清除資源
Docker Machine 不僅可以建立虛機,還可以管理虛機。所謂的管理,僅僅是能夠 stop、start 和 restart 嗎?答案是可以有更多的功能,但是需要相關驅動的支援。比如 rm 命令,對於 azure 驅動來說,它是可以把剛才建立那一坨東西幾乎全部幹掉的!執行下面的命令:
$ docker-machine rm testvmtigger
這是一個很危險的操作,所以會有一個確認執行的步驟,然後就真的把 Azure 上的資源給幹掉了(除了儲存部分):
雖然筆者覺得這真的是一個很強很酷的功能,但還是要警告自己和同學們:一定要慎用!
總結
雲服務為我們開啟了一扇新的大門,當然對運維人員來說也帶來了諸多的挑戰。如何選擇對雲端操作友好的工具就成了我們提升效率的重要途徑。就 Docker 操作來說,Docker Machine 在這個方向上做了很好的嘗試。真心的希望這個工具能夠不斷的完善,成為運維人員手中的一把利劍。