天天看點

當Azure遇上Docker

容器技術現在發展的如火如荼,包括微軟也會在下一代作業系統中提供原生支援,個人認為微軟的優勢在于其擁有成熟的叢集工作環境(Nano Server)以及成熟的管理平台(System Center),除此之外還有一系列圍繞容器的生态鍊,比如自動化(PowerShell DSC),比如監控,比如生命周期管理等等。當然目前如果想在Win平台上體驗容器的話,除了Docker提供的boot2docker,最“土”的辦法就是在Hyper-V裡建立一台Linux虛拟機,然後去部署并使用Docker環境。那麼還有沒有一些友善快捷的方法呢?或者對于開源平台的運維人員來說,可否在公有雲中可以快速的傳遞出一個Docker環境來,其實這正是Azure目前所支援的。說到這裡就不得不提一下Docker的架構:

#################################################################

Docker是C/S架構的,主要由client、daemon、registry構成,其中registry用于管理鏡像(image),而container則是生于鏡像之上,更多有關docker的基礎概念我就不在這裡耍大刀了,畢竟也是才接觸容器沒多久:) 這裡主要關注一下client(用戶端)與daemon(服務端也叫守護程序),daemon用來接收從client發來的指令然後進行處理,是以說通常都是在本地調用(通過unix socket),當然docker是支援遠端調用的(通過TLS),也就是我本地隻要有docker client(可以簡單了解client就是docker.exe,或者是你直覺看到的那個CLI console)就能夠向遠端的daemon端(可以簡單了解daemon就是docker的背景服務程序)發起指令,比如pull或build一個鏡像,建構自己的dockerfile等等所有操作。

<a href="http://s3.51cto.com/wyfs02/M02/6D/63/wKiom1ViyKKjBbZdAAEQY9hEJeg207.jpg" target="_blank"></a>

##############################################################

想在Azure上體驗docker daemon模式就需要用到azure vm擴充,之前博文提到過幾類實用的擴充程式,比如BGinfo,比如DSC等等,這次就會提到Docker extension,目前在azure global版本的新門戶中(預覽版)可以看到,當然要想在azure上快速的擷取一個docker daemon傳遞還是需要一些準備工作的,首先要有一台支援docker相應版本的虛拟機,這裡以目前流行的也是推薦的ubuntu 14.04 LTS為例,我在建立虛拟機時使用了SSH公鑰認證方式(出于安全性和便捷性考慮建議大家選擇這種方式),如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/5E/wKioL1Vix2Kj0p9TAAPVSpQYvKI496.jpg" target="_blank"></a>

新門戶還是比較炫的,但是内容太多難免讓人需要花時間去适應,可以看到目前ubuntu虛拟機正在建立中,如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/62/wKiom1VixdXiEQeFAANYdNCD_Jk950.jpg" target="_blank"></a>

這台叫做dockertemp的ubuntu虛拟機建立好之後,可以快速的浏覽相關資訊,比如dns名稱,IP位址資訊等等,如下圖:

<a href="http://s3.51cto.com/wyfs02/M00/6D/5E/wKioL1Vix2KRG-V-AAJ_5vgAjY8702.jpg" target="_blank"></a>

通過本地的xshell登陸之後确認版本為14.04.2 LTS,接下來就該在這台機器上準備docker daemon環境了

<a href="http://s3.51cto.com/wyfs02/M00/6D/62/wKiom1VixdWzh5OoAAMXnb0WwlE234.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/6D/5E/wKioL1Vix2OQFzIxAANi6VO3FNc591.jpg" target="_blank"></a>

回到剛才建立好的dockertemp這台虛拟機,一步一步來建立所需要的證書和密鑰檔案,使用openssl生成ca證書,并且注意FQDN要與dockertemp這台虛拟機所在的雲服務名稱一緻,如下圖:

<a href="http://s3.51cto.com/wyfs02/M01/6D/62/wKiom1VixdbQuvXNAAOIAdHA9kQ800.jpg" target="_blank"></a>

接下來準備伺服器證書,期間需要生成一個請求檔案,建立如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/5E/wKioL1Vix2PSG7CuAAJjFctycd8000.jpg" target="_blank"></a>

最後是用戶端證書,如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/62/wKiom1VixdaDrJrMAAQhXQybEqo713.jpg" target="_blank"></a>

由于目前Azure隻認base64編碼,是以要把服務端的三個證書格式轉換一下,它們分别是ca.pem/server-cert.pem/server-key.pem,剩下三個key用來本地docker client使用,如下圖:

<a href="http://s3.51cto.com/wyfs02/M00/6D/5E/wKioL1Vix2SyHnojAAHi3WKWHsY195.jpg" target="_blank"></a>

把需要上傳到Azure的三個證書下載下傳到本地,也可以全部下載下傳,如下圖:

<a href="http://s3.51cto.com/wyfs02/M00/6D/62/wKiom1VixdbgUGZuAAWlybs_uP8579.jpg" target="_blank"></a>

##################################################################

上文中對TLS加密認證所需要的檔案進行了準備,接下來就是傻瓜的下一步下一步了~首先對dockertemp這台虛拟機安裝docker擴充,如下圖:

<a href="http://s3.51cto.com/wyfs02/M01/6D/5E/wKioL1Vix2TDPlBOAAOQxC8YXV4013.jpg" target="_blank"></a>

可以看到幾個可用擴充,新門戶中很多操作都可以通過圖形化界面來進行友善了許多,這裡可以看到docker擴充的作用,它會安裝docker daemon服務并接受來自遠端client的請求,如下圖:

<a href="http://s3.51cto.com/wyfs02/M01/6D/62/wKiom1VixdfxtiyWAAP1dhHITbc692.jpg" target="_blank"></a>

此時需要提供相應的證書,這裡把剛才下載下傳的證書ca64.pem/server-cert64.pem/server-key64.pem上傳,然後Azure提供了預設的daemon模式端口4243,如果有需要可以在這裡修改,确認無誤後就能夠進行擴充程式的安裝了,如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/5E/wKioL1Vix2ayMC9OAAN013GlBWM965.jpg" target="_blank"></a>

等待一會時間會獲得成功提示,新門戶的通知中心還是比較美觀的,如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/62/wKiom1VixdjzvNbHAAJCJ7AiqUs503.jpg" target="_blank"></a>

接下來還需要手動為dockertemp這台虛拟機開發一個4243的端點(端口映射),如下圖:

<a href="http://s3.51cto.com/wyfs02/M00/6D/5E/wKioL1Vix2fC7xQGAAMABBEUoFU334.jpg" target="_blank"></a>

此時回到虛拟機詳情,檢視擴充程式狀态,目前的docker extension status顯示success,如下圖:

<a href="http://s3.51cto.com/wyfs02/M00/6D/62/wKiom1VixdyyyOZ7AALB82yV6Rk460.jpg" target="_blank"></a>

#####################################################################

到此為止Azure上的docker daemon模式就啟用了,隻要你本地有docker client并配合一緻的密鑰對就可以使用TLS加密認證與雲端的docker daemon進行互動了,我在本地先把client需要的證書下載下傳(不需要轉換成base64),如下圖:

<a href="http://s3.51cto.com/wyfs02/M01/6D/5E/wKioL1Vix2uyJmsLAAUw95P8EA8736.jpg" target="_blank"></a>

我的用戶端就用boot2docker來示範,從桌面或者開始菜單啟動boot2docker start,此時它就是client,如下圖顯示預設的證書存放路徑是紅框部分,那麼我就把上文中下載下傳的三個證書拷貝到這裡

<a href="http://s3.51cto.com/wyfs02/M01/6D/62/wKiom1Vixd7x5UvKAAPNuRLnpqE156.jpg" target="_blank"></a>

此時還需要注意DOCKER_TLS_VERIFY是否為“1”,若不是的話用export修改一下即可,另外還要使用export指定HOST路徑,這裡就是我Azure上dockertemp的雲服務名稱加端口,如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/5E/wKioL1Vix22QeKFYAAO0zadEmSw514.jpg" target="_blank"></a>

配置好之後直接運作docker info,顯示的是Azure上dockertemp(基本A1規格)的資訊,1顆vCPU,1.7GB記憶體,且名稱确認無誤,證明目前成功的連接配接上了遠端docker daemon,如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/62/wKiom1VixeHi3NnbAAHu0PHfSNU487.jpg" target="_blank"></a>

接下來就直接給daemon發号施令吧,例如可以search一下鏡像名稱,如下圖:

<a href="http://s3.51cto.com/wyfs02/M00/6D/5E/wKioL1Vix3CT8FfwAAJTllmtGQU413.jpg" target="_blank"></a>

或者幹脆pull一個ubunut鏡像到本地,如下圖:

<a href="http://s3.51cto.com/wyfs02/M01/6D/5E/wKioL1Vix3DQHc1iAAHK41RLIPo389.jpg" target="_blank"></a>

這裡我做一個非常非常簡單的demo,從本地通過TLS連接配接Azure上的daemon并建立一個分布式的容器應用(這裡以大家耳熟能詳的wordpress為例);首先下載下傳兩個鏡像,分别是wordpress與mysql,如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/5E/wKioL1Vix3GhtWk_AAE1-zBCmlQ349.jpg" target="_blank"></a>

基于mysql建立一個容器,名為mysql_wordpress,指定mysql的root密碼,并使用-d作為背景常駐運作;另外再基于wordpress鏡像建立一個容器名為wordpress_demo,使用--link參數連結到已存在的mysql_wordpress容器,并将容器内部80端口映射到外部,同樣使用-d做背景運作,完成之後通過docker ps顯示兩個容器正常運作,如下圖:

<a href="http://s3.51cto.com/wyfs02/M01/6D/62/wKiom1VixeSxvjUcAAJTgnDvLkA426.jpg" target="_blank"></a>

接下來将dockertemp虛拟機建立一個新端點,就是把80端口釋出出來以便可以從外部通路這個wordpress站點,如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/62/wKiom1VixeXwTmwbAANgcNmQcBY750.jpg" target="_blank"></a>

然後~~~~打開浏覽器通路雲服務名稱(DNS)dockertemp.cloudapp.net,可以正常顯示wordpress初始化配置頁面了,這樣就完成了一個容器應用的部署,真的是so easy :)

<a href="http://s3.51cto.com/wyfs02/M02/6D/5E/wKioL1Vix3PTYd0-AAJK92k4cM0376.jpg" target="_blank"></a>

通過Xshell登陸到dockertemp虛拟機并檢視docker啟動配置檔案,可以清楚的看到目前啟動方式為指定的tls驗證方式,且聲明了監聽端口為4243,如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/6D/83/wKiom1VljcujuKZCAAOadSoGrcQ933.jpg" target="_blank"></a>

綜上所述,要想在Azure上使用docker服務,其實就是微軟幫我們自動化實作了docker daemon模式的部署和啟用,但是在過程中我們需要手動的準備證書檔案和端口映射,熟悉一遍之後感覺還是比較簡單的,另外需要注意的是,如果docker client使用的是boot2docker,則每次重新開機時boot2docker預設會生成新的證書,如果不想每次都修改一邊TLS配置并指定遠端host位址,則需要使用boot2docker ssh登陸到virtualbox裡面的虛拟機進行操作,具體可以參見boot2docker官方文檔,在此不做贅述;當然了~Azure遇上Docker,故事才剛剛開始。

本文轉自maomaostyle 51CTO部落格,原文連結:http://blog.51cto.com/maomaostyle/1654994,如需轉載請自行聯系原作者