離不開的工具之《Docker開發指南》

圖1 Docker開發指南 封面

如果在3年前,你不知道什么是Docker,還是情有可原,因為Docker那時候才出現一年不到的時間。但如果是現在(2017年中),你還沒聽說過Docker,那么就有些落伍,需要趕緊為自己充充電了。


容器

本書第一部分提到的第一個概念并不是Docker,而是容器。容器是什么,為什么我們要先了解容器?容器是對應用程序及其依賴關系封裝。容器看上去像一個輕量級的虛擬機,但容器和虛擬機相比有幾個優點:

1、啟動和停止快,比如openstack能夠以10臺/min的速度創建虛擬機,而Docker一般啟動一個容器的時間在幾十毫秒(誰用誰知道)。

2、可移植,使得開發、測試環境和生產環境保持一致。以Python開發為例,《Python項目開發實戰》在一開始教我們搭建開發環境的時候就要用virtualenv來保持一個獨立的開發環境,使得python的版本、python第三方包的版本能夠保持在一個相對“純凈”的環境里,但是在測試和生產環境你還是要如樣構建一個virtualenv的環境才能保證你的程序能夠換個地方也能正常運行。再以Node.JS開發為例,Node.JS的版本迭代很快,要想在不同版本之間切換,就要用NVM或n這樣的工具。總之,在容器出現以前切換版本、開發環境,保持開發、測試、生產環境一致是一件很費力的事情。但是,有了容器之后就不同了,我們可以把當前配置好的容器發布成鏡像,然后再在測試或者生產環境下啟動成容器就可以了,保持絕對的一致!

3、在一臺機器上可以啟動大量的容器,模擬分布式生產環境。以MongoDB為例,為了保證生產環境下的可用性,MongoDB要求我們在生產環境下至少保證一主二從的模式,沒有容器的時代,我們要么真去找3臺機器來模擬,要么就得起三個虛擬機來運行。而一臺普通開發計算機上的資源畢竟是有限的,能跑的虛擬機也是很有限的,一旦你的分布式架構復雜起來了,要想拿一臺開發機模擬就有點費勁了。而容器則是輕量級的,一臺開發機上跑個幾百上千個容器還是小case,再結合容器網絡和編排工具,模擬分布式生產環境也是很輕松的事情。

4、可以下載并運行復雜的應用程序。一般我們學習或使用某個工具比如MongoDB/Redis/RabbitMQ/Jenkins啊,書里的第一步都是教你怎么下載、配置環境、安裝……,現在就很輕松了,敲個docker pull mongo 就能把MongoDB的鏡像下載下來,再敲個docker run mongo就能運行MongoDB控制臺了。so easy!

5、微服務(參見《微服務設計》)是最近幾年的熱門概念,是容器最主要的用例,也是容器技術興起的最大推動力。容器與生俱來的輕量級特性及速度,意味著它尤其適合用于微服務架構。與虛擬機相比,容器的體積小很多,并且能快速部署,這使得微服務架構能使用最少的資源,又能迅速應對需求的變化。所以這幾年來,提到微服務的地方,幾乎都少不了容器的身影。


Docker與容器

容器并不是新概念,幾十年來,UNIX 系統一直以 chroot 命令來提供簡單的文件系統隔離。但是,直到Docker的誕生,補充了以往容器化技術的不足,將容器技術帶入主流,并且使Docker成為了容器技術的代名詞。Docker 引擎提供了快速且便捷的CLI以及API用來運行容器,而Docker Hub 提供大量的公共容器鏡像以供下載,方便用戶快速上手,避免了大量重復勞動。Docker 為軟件開發帶來了翻天覆地的變化。假如沒有 Docker,可能容器將仍是一種鮮為人知的技術。

Docker的哲學經常用航運集裝箱的比喻來解釋,其目標是把集裝箱的標準化流程運用到 IT行業中去。Docker 容器簡化了“移動”應用程序的工作,好比聯運集裝箱簡化了貨物運輸一樣。開發者只需要專注于程序開發,再也不用擔心測試與正式發布時環 境及依賴關系的差異所帶來的問題。


圖2 Docker 集裝箱

Docker基礎

第二章介紹Docker的安裝,不過安裝最新版Docker請到官網的下載地址,請按官網的步驟進行。第三章教你體驗一些Docker的基本操作,主要是走馬觀花,也不是本書的主要方面,要想詳細了解可以參閱《Docker基礎與實戰》,對于Docker指令的熟悉還是要在實戰中逐步積累。

第四章介紹Docker的基本概念,諸如鏡像、守護進程、網絡連接、數據卷等都是玩Docker每時每刻都要打交道的概念,還有Swarm、Compose、Machine、服務發現、服務編排這些進階概念,對于這些概念的深度介紹可以參見《Docker——容器與容器云》。


Docker與軟件生命周期

本書第二部分將告訴我們如何將Docker 整合到軟件開發過程中,而且會是我們在實戰過程中熟悉Docker的各種概念和指令。要充分的利用 Docker 的功能,就需要采用 DevOps 的思維。在開發的過程中,我們要思考在生產環境中軟件將如何運行,如何做能夠減輕部署到各種環境時將要面臨的痛苦,這也是本書名稱叫《Docker開發指南》的原因。

第5章對于熟悉Python的同學來說比較容易上手但也有一些不一樣,本章要通過輕量級的Flask跑一個“Hello World”。與《Flask Web開發》 里介紹的安裝步驟不一樣,在Docker里安裝Flask是不需要安裝virtualenv,因為容器已經提供了隔離環境。本章教我們用Python官方鏡像快速創建一個可移植和可重復創建的Flask鏡像,我們可以使用數據卷來動態修改容器中的代碼,通過容器輕松的同時維護生產環境和開發環境,最后可以通過使用 Compose 將開發流程自動化。

在第6章里,我們馬上可以把上面這個鏡像應用起來,再把identicon加入進來,再用compose把我們創建的identidock容器與dnmonster容器連接起來,再添加一個redis我們就可以為這個系統添加緩存微服務。就像搭積木一樣,三個容器三個微服務構成了一個微服務架構的系統,這種系統很適合橫向擴展到多臺機器。由于每個容器/微服務各自獨立,所以將其中的微服務被其他效能更高且功能相同的服務替代。在發生意外情況的時候,可以只對部分微服務進行回滾,無需把系統的其他部分一并關閉。還有一點就是,我們看到不同的微服務可以用不同的語言實現,使我們能夠選擇適用于手頭任務的語言。

第7、8、9、10章分別涉及鏡像分發、持續集成與測試、部署容器、日志與監控。涉及開發完成后的持續集成/測試/生產的過程。在DevOps里,前一段是開發,后一段就是運維以及不斷的持續迭代。跟著這幾章走下來,你就會發現容器天生就適用于持續集成與持續交付的工作流。


Docker 容器集群

在真正的生產環境里的分布式系統不會只有一臺服務器,更不會只有一個容器,你還得應付潛伏著的黑客,所以聯網和服務發現、編排、集群和管理、容器安全與限制容器都是必不可少的內容。

服務發現在現今的分布式和動態系統中往往是必不可少的功能。容器和服務都會不斷變化,它們會因需求或故障而被停止、啟動和遷移。而方案也有很多種,到底是zookeeper還是etcd,究竟什么是正確的選擇,很大程度取決于你的特定需求和你所使用的平臺。

現在市面上常見的集群和編排工具有:Swarm、fleet、Kubernetes 和 Mesos,第12章依次介紹了它們的獨特功能。Swarm 的優點在于它使用了標準的 Docker 接口。這使得無論是使用它還是把它整合到現有的工作流程都非常容易。fleet 是一個低階并且相當簡單的編排層,可以作為運行更高階的編排工具(如 Kubernetes)或定制系統的基礎。Kubernetes 作為一個編排工具,它自帶服務發現和復制的功能,并且很堅持自己的一套設計理念。使用它時或許需要對現有應用程序重新設計。Mesos 則支持多個容器編排框架,包括 Marathon、Kubernetes 和 Swarm。

為了能夠安全地使用 Docker,防止被黑,我們必須對潛在的安全問題有清楚的認識,并且對保護容器化系統的主要工具和技術有所了解。第13章在安全性方面給了我們不少建議,需要我們注意。在安全性方面,容器技術提供了正面作用,因為它能夠提供多一重隔離和控制。無論在什么時候,正確使用容器的系統只會比沒有使用容器的系統更安全。

關于容器集群實戰的更多信息,可以參閱《Docker經典實例


總結

以本書的篇幅而言,不可能是一本Docker百科大全,因為Docker/容器/微服務/CI/CD/DevOps涉及到的東西實在是太雜太多,所以不可能由一本書進行全覆蓋,事實上目前也沒有這樣一本Docker百科全書。但本書以DevOps的思想出發,以實戰的方式指導,涉及到了從Docker開發到運維的方方面面,《Docker開發指南》實在是一本不可多得的好書。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容