導(dǎo)語:以Docker為代表的容器技術(shù)正在成為應(yīng)用交付運維的全新標(biāo)準,圍繞其周圍的整個生態(tài)圈也在發(fā)生著天翻地覆的改變,我們可以期待以其為代表的新一輪云技術(shù)革命的到來。 CaaS(Container as a Service)技術(shù)是為了解決Docker容器的最佳應(yīng)用場景 – 云端而生,如何在云端管理部署Docker容器便成為CaaS技術(shù)的核心所在。
應(yīng)用軟件的部署方式主要可以分為部署在用戶環(huán)境的主機上(On-Premise),部署在云端(SaaS)以及兩者混合模式(Hybird)。部署在云端的軟件又可根據(jù)軟件可訪問的范圍分為公有云部署,私有云部署以及其兩者的混合模式。如何在以上各種環(huán)境中創(chuàng)建Docker主機便成為DevOps關(guān)注的一個問題。Docker Machine的產(chǎn)生簡化了這一過程,讓你可以使用一條命令在你的計算機,公有云平臺以及私有數(shù)據(jù)中心創(chuàng)建及管理Docker主機。
在Docker Machine發(fā)布之前,你可能會遇到以下問題:
你需要登錄主機,按照主機及操作系統(tǒng)特有的安裝以及配置步驟安裝Docker,使其能運行Docker容器。
你需要研發(fā)一套工具管理多個Docker主機并監(jiān)控其狀態(tài)。
你在本地開發(fā),產(chǎn)品部署在公有云平臺,你希望能盡可能的減小兩個環(huán)境的差異性
Docker Machine的出現(xiàn)解決了以上問題。
Docker Machine簡化了部署的復(fù)雜度,無論是在本機的虛擬機上還是在公有云平臺,只需要一條命令便可搭建好Docker主機
Docker Machine提供了多平臺多Docker主機的集中管理
Docker Machine 使應(yīng)用由本地遷移到云端變得簡單,只需要修改一下環(huán)境變量即可和任意Docker主機通信部署應(yīng)用。
綜合來說Docker Machine讓下圖這種開發(fā)模式得到了大大的簡化。
Docker Machine的安裝
可以通過下載二進制可執(zhí)行文件的方式安裝Docker Machine,本文以Linux系統(tǒng)為例。
Docker Machine的運行原理
本文通過兩個例子講述了Docker Machine的工作原理及工作流程:在本機安裝Virtualbox虛擬機作為Docker主機,以及在AWS創(chuàng)建Docker主機。
create命令用來創(chuàng)建docker主機,運行create命令需要指明驅(qū)動的名稱,目前支持在本機運行virtualbox虛擬主機,Hyper-V虛擬主機,VMware虛擬主機,AWS EC2,Azure,DigitalOcean,Google等公有云主機,以及使用Openstack搭建的私有數(shù)據(jù)中心。
新的虛擬化(Xen,KVM)支持以及新的云平臺支持可以通過開發(fā)驅(qū)動的方式支持。
在本機安裝Virtualbox虛擬機作為Docker主機
Create Docker Machine主要包括三個Create過程。首先是Provider Create(libmachine/provider.go),此函數(shù)主要是在當(dāng)前運行docker-machine命令主機上創(chuàng)建以machine name命名的文件夾,并將根證書,服務(wù)器證書以及用戶證書拷貝到此文件夾。其次是driver create(例如drivers/virtualbox/virtualbox.go)用來創(chuàng)建主機,最后是運行host create(libmachine/host.go)通過SSH安裝并配置Docker。目前在本地環(huán)境中使用的是boot2docker鏡像,云端環(huán)境使用的是Ubuntu鏡像。
運行在Virtualbox虛擬主機上的docker machine創(chuàng)建過程如下。
1. Docker Machine首先生成一個自簽名的Root CA,然后用這個Root CA簽發(fā)客戶端證書,此證書在Docker客戶端連接遠程Docker服務(wù)器的時候做認證使用;
2. 配置Docker主機的運行參數(shù),參數(shù)包括Docker客戶端與遠程Docker服務(wù)器之間認證參數(shù),遠程Docker daemon的運行參數(shù)以及Docker Swarm的參數(shù)。
3. Docker Machine使用boot2docker作為virtualbox的鏡像 – boot2docker是一個運行Docker容器的輕量級Linux系統(tǒng),完全在內(nèi)存中運行。
4. 創(chuàng)建virtualbox虛擬機
a. 生成ssh key – 部署過程中使用次ssh key認證實現(xiàn)遠程操作
b. 創(chuàng)建一個VMDK文件作為虛擬機的hdd,大小可以在運行時指定參數(shù)–virtualbox-disk-size控制
c. 創(chuàng)建虛擬機
修改虛擬機參數(shù),可通過參數(shù)–virtualbox-memory和–virtualbox-cpu-count控制內(nèi)存大小和CPU個數(shù)。
d. 配置虛擬機網(wǎng)絡(luò) – NIC1為NAT形式使虛擬機能夠訪問外網(wǎng),NIC2為hostonly模式用于內(nèi)部通信,子網(wǎng)可以通過參數(shù)–virtualbox-hostonly-cidr修改
e. 配置存儲 – 將boot2docker iso文件掛載在虛擬dvd光驅(qū),步驟b中創(chuàng)建的文件作為hdd
5. 啟動虛擬機,并設(shè)置端口映射,將本地隨機端口轉(zhuǎn)發(fā)到虛擬機22端口(此時還不知道虛擬機Hostonly網(wǎng)卡的IP地址,所以只能通過NAT網(wǎng)卡進行端口映射的方法訪問虛擬機)
6. 使用默認用戶名docker,默認密碼docker登錄虛擬機將第一步生成的ssh key導(dǎo)入到虛擬機/home/docker/.ssh/authorized_keys。獲取hostonly網(wǎng)卡的IP地址(通過DHCP獲得)
7. 部署虛擬機的Docker運行環(huán)境(所有命令都是通過SSH遠程執(zhí)行)
a. 配置虛擬機hostname
b. 安裝Docker
c. 配置docker daemon使用TLS –tlsverify。使用此選項之后docker daemon只接受來自第1步中自簽名的根證書簽發(fā)的證書,docker客戶端只相信第1步中自簽名的更證書簽發(fā)的服務(wù)器證書
d. 簽發(fā)服務(wù)器證書
自此為止一個基于virtualbox的Docker運行環(huán)境就創(chuàng)建好了,使用者需要將本地的docker客戶端配置到遠程的docker daemon。
Docker Machine的其他命令都是通過drivers/virtualbox/virtualbox.go驅(qū)動實現(xiàn)的,在此就不累述了。
在AWS創(chuàng)建Docker主機
Docker Machine通過AWS REST API創(chuàng)建一個Docker主機所需要的資源,需要使用AWS訪問密鑰(–amazonec2-access-key)和AWS密鑰(–amazonec2-secret-key)進行認證。所創(chuàng)建的EC2主機需要在一個提前創(chuàng)建好的VPC(–amazonec2-vpc-id)里面。
檢查環(huán)境 – 是否已經(jīng)存在重名的密鑰對,檢查指定區(qū)域(–amazonec2-zone)的指定VPC中是否存在子網(wǎng),使用默認的子網(wǎng)
創(chuàng)建密鑰對并通過AWS REST API上傳到AWS服務(wù)器
創(chuàng)建一個安全組允許訪問22(SSH),2376(Docker)或3376(指定Swarm),可通過–amazonec2-security-group指定名稱
創(chuàng)建一個塊設(shè)備
運行EC2實例 – 指定AMI,區(qū)域,安全組,子網(wǎng)等參數(shù)
部署虛擬機的Docker運行環(huán)境 -使用默認用戶ubuntu以及之前生成的密鑰SSH到AWS EC2實例進行遠程操作
a. 配置虛擬機hostname
b. 安裝Docker
c. 配置docker daemon使用TLS –tlsverify。使用此選項之后docker daemon只接受來自第1步中自簽名的根證書簽發(fā)的證書,docker客戶端只相信第1步中自簽名的更證書簽發(fā)的服務(wù)器證
d. 簽發(fā)服務(wù)器證書
至此一個運行在AWS公有云上的Docker主機就創(chuàng)建成功了。Docker Machine的其他命令也是在drivers/amazonec2/amazonec2.go中實現(xiàn)的關(guān)于Docker Machine與Docker Swarm的集成,將在之后Docker Swarm的章節(jié)中介紹。
結(jié)語:
本文通過兩個典型實例分析力Docker Machine在本地虛擬環(huán)境的工作流程以及在遠程公有云平臺的工作流程。通過以上步驟更能說明Docker Machine為開發(fā)者帶來的一步式部署,免去了煩瑣的虛擬機搭建以及公有云IaaS的配置,使開發(fā)者能專注于應(yīng)用開發(fā)。Docker Machine目前還處在初級階段,在其Roadmap我們可以看到包括Mac/Windows支持,多種發(fā)行版支持,更廣泛的支持Docker engine以及Swarm的配置,我們有理由期待Docker Machine成為一個更加通用的Docker主機部署管理工具。