這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
漲薪!漲薪!漲薪!時下Docker技術已經成為最流行的一個漲薪理由了。希雲是Docker私人雲端的領導者,利用Docker提供更好的雲端運算產品和培訓、諮詢等服務!Docker的出現,解決了微服務的粒度問題,利用Docker容器技術,使我們能開發具有獨立性的代碼,構建一個非常完美的微服務運行環境,讓微服務不在受限於臃腫的虛擬機器。
我們剛接觸Docker時,最常見的入門方式是使用Ubuntu或Debian等系統構建虛擬機器,這種方式的弊端是產生的鏡像太大了,單單是Ubuntu的基礎鏡像就已經有187.9MB,而且大部分裝好的軟體和依賴庫都不會用到。
容器和虛擬機器的主要區別在於,容器在宿主系統的一個隔離進程空間裡邊運行,因此它不需要有獨立的核心和其他系統檔案,只要在上邊安裝你需要使用的東西,我們會需要Python來運行Go的服務嗎?這不是一個很難回答的問題。
微基礎鏡像
首先我們要拋棄使用Ubuntu或者Debian作為基礎鏡像這種思路,我們著眼於更輕量的選擇。
Alpine Linux是一個微型的Linux分發版,可以用來構建一個體積只有5M的基容器,它是基於一個嵌入式系統BusyBox改造的。那為什麼不直接用BusyBox呢?使用Alpine有幾個優點,首先,Alpine上有一個包管理系統apk,使用它可以簡化容器的維護;第二,Alpine的核心已經被打上PaX補丁,可以免受大量0 day漏洞的侵害。
你可以在以下列表看到,Alpine只在BusyBox的基礎上增加了4.1MB的體積,但是同時相應增加了那些便利,我覺得這部分開銷非常值得。
| 鏡像 |
體積 |
| ubuntu |
187.90 MB |
| nicholasjackson/microservice-basebox |
15.82 MB |
| alpine |
5.24 MB |
| busybox |
1.10 MB |
為Alpine Linux編譯Go應用
使用Go來構建微服務的一個優點是,它會被編譯成二進位包,這樣的話,它就不需要架構或者運行依賴,這樣非常有利,因為正如前面所說Alpine是一個非常輕量級的分發版,並不是所有C語言依賴庫都有安裝,所以Go的動態庫依賴很可能也沒有。所幸的是有專門的方法去禁用了cgo依賴,可以把應用通過連結的方式編譯,我們只需要這樣告訴編譯器去重新構建我們的所有應用程式套件就可以了:
$ CGO_ENABLED=0 go build -a -installsuffix cgo .
我們更詳細說一下上邊這個命令的細節:
CGO_ENABLED=0 是一個編譯標誌,會讓構建系統忽略cgo並且靜態連結所有依賴;
-a會強制重新編譯,即使所有包都是由最新代碼編譯的;
-installsuffix cgo 會為新編譯的包目錄添加一個尾碼,這樣可以把編譯的輸出與預設的路徑分離。
運行應用
那麼在二進位包裡怎麼使用設定檔呢,如果你是在使用微服務架構,那你很可能在使用Consul,如果還沒有的話,那你真的應該好好研究一下它,它確實很強大。在本文中,我會假定你已經熟悉Consul,你在使用這個Consul模板去管理你的設定檔。
我們通常需要使用監護進程來運行這些服務,例如Supervisor,不過這個工具需要使用Python,這樣有違我們輕量級的初衷,所以我們使用Skaware S6。
S6是一個簡單有效工具,它使用/etc/s6下的設定檔,來啟動s6-svscan進程。你可以從我的基鏡像倉庫中看到,這個目錄下包含了一系列的shell指令碼。
.S6-svscan
這個目錄包含兩個指令碼”crash”和”finish”,當s6所管理的應用由於錯誤終結時,crash指令碼會被調用,當s6進程關閉時,finish指令碼會被調用。
App
這個目錄包含”run”和”finish”兩個指令碼,run用來啟動主服務,並且會被配置上Go應用的執行路徑。而在finish中可以設定應用程式關閉時要執行的指令碼。
Consul-template
這個目錄同樣也是包含了那兩個指令碼,但是這次它是用來配置consul-template應用的,consul-template產生微服務所用到的設定檔,相關設定檔會被儲存在Consul服務端上,在Go微服務的整個生命週期中,Consul應用都需要運行著提供佈建服務,所以我們也要通過s6來監控守護它。
Docker基礎鏡像
為了方便測試,我已經使用Alpine來構建了一個帶有Skaware S6和Consul Template的鏡像,這個新的鏡像也是只有15.82MB。即使你基於這個鏡像構建一個再臃腫的應用,那也估計不過30MB左右,但是這樣還是只有一個Ubuntu基礎鏡像體積的13%。
結論
在本文中,希雲主要討論了Go應用,但可以基於類似的技術使用在Ruby或Python上,Alpine 的apk已經提供這兩種語言的相關依賴包,另外,也可以嘗試著在上邊部署一個JRE環境。
如瞭解更多docker相關知識,請觀看培訓視頻:https://csphere.cn/training!
如需要docker相關產品,請訪問希雲官網首頁:https://csphere.cn!
cSphere1.0版本發行,正式商用!歡迎諮詢 400-686-1560