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

阿狸不歌發表於2017-07-21

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每時每刻都要打交道的概念,還有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開發到運維的方方面面,實在是一本不可多得的好書。

相關文章