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