Linux中國

Docker 是什麼?

這是一篇摘錄,取自於 Karl Matthias 和 Sean P. Kane 撰寫的 Docker 即學即用。其中或許包含一些引用到本文中沒有的內容,因為那些是整本書中的一部分。

2013 年 3 月 15 日,在加利福尼亞州聖克拉拉召開的 Python 開發者大會上,dotCloud 的創始人兼首席執行官 Solomon Hvkes 在一場僅五分鐘的微型演講中,首次提出了 Docker 這一概念。當時,僅約 40 人(除 dotCloud 內部人員)獲得了使用 Docker 的機會。

這在之後的幾周內,有關 Docker 的新聞鋪天蓋地。隨後這個項目很快在 Github 上開源,任何人都可以下載它並為其做出貢獻。在之後的幾個月中,越來越多的業界人士開始聽說 Docker 以及它是如何徹底地改變了軟體的開發、交付和運行的方式。一年之內,Docker 的名字幾乎無人不知無人不曉,但還是有很多人不太明白 Docker 究竟是什麼,人們為何如此興奮。

Docker 是一個工具,它致力於為任何應用程序創建分發版本而簡化封裝流程,將其部署到各種規模的環境中,並將敏捷軟體組織的工作流程和響應流水化。

Docker 帶來的希望

雖然表面上被視為一個虛擬化平台,但 Docker 遠遠不止如此。Docker 涉及的領域橫跨了業界多個方面,包括 KVM、 Xen、 OpenStack、 Mesos、 Capistrano、 Fabric、 Ansible、 Chef、 Puppet、 SaltStack 等技術。或許你已經發現了,在 Docker 的競爭產品列表中有一些很值得關注。例如,大多數工程師都不會認為,虛擬化產品和配置管理工具是競爭關係,但 Docker 和這兩種技術都有點關係。前面列舉的一些技術常常因其提高了工作效率而獲得稱讚,這就導致了大量的探討。而現在 Docker 正是這些過去十年間最廣泛使用的技術之一。

如果你要拿 Docker 分別與這些領域的衛冕冠軍按照功能逐項比較,那麼 Docker 看上去可能只是個一般的競爭對手。Docker 在某些領域表現的更好,但它帶來的是一個跨越廣泛的解決工作流程中眾多挑戰的功能集合。通過將類似 Capistrano 和 Fabric 這樣的易用的應用部署工具和易於管理的虛擬系統結合起來,提供鉤子使工作流自動化、編排易於實施,Docker 提供了一套非常強大的功能集。

大量的新技術來來去去,因此對這些新事物保持一定的懷疑總是好的。如果不深入研究,人們很容易誤以為 Docker 只是另一種為開發者和運營團隊解決一些具體問題的技術。如果把 Docker 單獨看作一種虛擬化技術或者部署技術,它看起來並不引人注目。不過 Docker 可比表面上看起來的強大得多。

即使在小型團隊中,團隊內部的溝通和相處也往往是困難的。然而在我們生活的這個世界裡,團隊內部對於細節的溝通是邁向成功越來越不可或缺的因素。而一個能夠降低溝通複雜性,協助開發更為強健軟體的工具,無疑是一個巨大的成功。這正是 Docker 值得我們深入了解的原因。當然 Docker 也不是什麼靈丹妙藥,它的正確使用還需深思熟慮,不過 Docker 確實能夠解決一些組織層面的現實問題,還能夠幫助公司更好更快地發布軟體。使用精心設計的 Docker 工作流程能夠讓技術團隊更加和諧,為組織創造實實在在的收益。

那麼,最讓公司感到頭疼的問題是什麼呢?現如今,很難按照預期的速度發布軟體,而隨著公司從只有一兩個開發人員成長到擁有若干開發團隊的時候,發布新版本時的溝通負擔將越來越重,難以管理。開發者不得不去了解軟體所處環境的複雜性,生產運營團隊也需要不斷地理解所發布軟體的內部細節。這些通常都是不錯的工作技能,因為它們有利於更好地從整體上理解發布環境,從而促進軟體的魯棒性設計。但是隨著組織成長的加速,這些技能的拓展很困難。

充分了解所用的環境細節往往需要團隊之間大量的溝通,而這並不能直接為團隊創造值。例如,為了發布版本 1.2.1、開發人員要求運維團隊升級特定的庫,這個過程就降低了開發效率,也沒有為公司創造價值。如果開發人員能夠直接升級他們所使的庫,然後編寫代碼,測試新版本,最後發布軟體,那麼整個交付過程所用的時間將會明顯縮短。如果運維人員無需與多個應用開發團隊相協調,就能夠在宿主系統上升級軟體,那麼效率將大大提高。Docker 有助於在軟體層面建立一層隔離,從而減輕團隊的溝通負擔。

除了有助於解決溝通問題,在某種程度上 Docker 的軟體架構還鼓勵開發出更多健壯的應用程序。這種架構哲學的核心是一次性的小型容器。在新版本部署的時候,會將舊版本應用的整個運行環境全部丟棄。在應用所處的環境中,任何東西的存在時間都不會超過應用程序本身。這是一個簡單卻影響深遠的想法。這就意味著,應用程序不會意外地依賴於之前版本的遺留產物;對應用的短暫調試和修改也不會存在於未來的版本中;應用程序具有高度的可移植性,因為應用的所有狀態要麼直接包含於部署物中,且不可修改,要麼存儲於資料庫、緩存或文件伺服器等外部依賴中。

因此,應用程序不僅具有更好的可擴展性,而且更加可靠。存儲應用的容器實例數量的增減,對於前端網站的影響很小。事實證明,這種架構對於非 Docker 化的應用程序已然成功,但是 Docker 自身包含了這種架構方式,使得 Docker 化的應用程序始終遵循這些最佳實踐,這也是一件好事。

Docker 工作流程的好處

我們很難把 Docker 的好處一一舉例。如果用得好,Docker 能在多個方面為組織,團隊,開發者和運營工程師帶來幫助。從宿主系統的角度看,所有應用程序的本質是一樣的,因此這就決定了 Docker 讓架構的選擇更加簡單。這也讓工具的編寫和應用程序之間的分享變得更加容易。這世上沒有什麼只有好處卻沒有挑戰的東西,但是 Docker 似乎就是一個例外。以下是一些我們使用 Docker 能夠得到的好處:

使用開發人員已經掌握的技能打包軟體

許多公司為了管理各種工具來為它們支持的平台生成軟體包,不得不提供一些軟體發布和構建工程師的崗位。像 rpm、mock、 dpkg 和 pbuilder 等工具使用起來並不容易,每一種工具都需要單獨學習。而 Docker 則把你所有需要的東西全部打包起來,定義為一個文件。

使用標準化的鏡像格式打包應用軟體及其所需的文件系統

過去,不僅需要打包應用程序,還需要包含一些依賴庫和守護進程等。然而,我們永遠不能百分之百地保證,軟體運行的環境是完全一致的。這就使得軟體的打包很難掌握,許多公司也不能可靠地完成這項工作。常有類似的事發生,使用 Scientific Linux 的用戶試圖部署一個來自社區的、僅在 Red Hat Linux 上經過測試的軟體包,希望這個軟體包足夠接近他們的需求。如果使用 Dokcer、只需將應用程序和其所依賴的每個文件一起部署即可。Docker 的分層鏡像使得這個過程更加高效,確保應用程序運行在預期的環境中。

測試打包好的構建產物並將其部署到運行任意系統的生產環境

當開發者將更改提交到版本控制系統的時候,可以構建一個新的 Docker 鏡像,然後通過測試,部署到生產環境,整個過程中無需任何的重新編譯和重新打包。

將應用軟體從硬體中抽象出來,無需犧牲資源

傳統的企業級虛擬化解決方案,例如 VMware,以消耗資源為代價在物理硬體和運行其上的應用軟體之間建立抽象層。虛擬機管理程序和每一個虛擬機中運行的內核都要佔用一定的硬體系統資源,而這部分資源將不能夠被宿主系統的應用程序使用。而容器僅僅是一個能夠與 Linux 內核直接通信的進程,因此它可以使用更多的資源,直到系統資源耗盡或者配額達到上限為止。

Docker 出現之前,Linux 容器技術已經存在了很多年,Docker 使用的技術也不是全新的。但是這個獨一無二的集強大架構和工作流程於一身的 Docker 要比各個技術加在一起還要強大的多。Docker 終於讓已經存在了十餘年的 Linux 容器走進了普通技術人員的生活中。Docker 讓容器更加輕易地融入到公司現有的工作流程中。以上討論到的問題已被很多人認可,以至於 Docker 項目的快速發展超出了所有人的合理預期。

Docker 發布的第一年,許多剛接觸的新人驚訝地發現,儘管 Docker 還不能在生產環境中使用,但是來自 Docker 開源社區源源不斷的提交,飛速推動著這個項目向前發展。隨著時間的推移,這一速度似乎越來越快。現在 Docker 進入了 1.x 發布周期,穩定性好了,可以在生產環境中使用。因此,許多公司使用 Docker 來解決它們在應用程序交付過程中面對的棘手問題。

Docker 不是什麼

Docker 可以解決很多問題,這些問題是其他類型的傳統工具專門解決的。那麼 Docker 在功能上的廣度就意味著它在特定的功能上缺乏深度。例如,一些組織認為,使用 Docker 之後可以完全擯棄配置管理工具,但 Docker 真正強大之處在於,它雖然能夠取代某些傳統的工具,但通常與它們是兼容的,甚至與它們結合使用還能增強自身的功能。下面將列舉一些 Docker 還未能完全取代的工具,如果與它們結合起來使用,往往能取得更好的效果。

企業級虛擬化平台(VMware、KVM 等)

容器並不是傳統意義上的虛擬機。虛擬機包含完整的操作系統,運行在宿主操作系統之上。虛擬化平台最大的優點是,一台宿主機上可以使用虛擬機運行多個完全不同的操作系統。而容器是和主機共用同一個內核,這就意味著容器使用更少的系統資源,但必須基於同一個底層操作系統(如 Linux)。

雲平台(Openstack、CloudStack 等)

與企業級虛擬化平台一樣,容器和雲平台的工作流程表面上有大量的相似之處。從傳統意義上看,二者都可以按需橫向擴展。但是,Docker 並不是雲平台,它只能在預先安裝 Docker 的宿主機中部署,運行和管理容器,並能創建新的宿主系統(實例),對象存儲,數據塊存儲以及其他與雲平台相關的資源。

配置管理工具(Puppet、Chef 等)

儘管 Docker 能夠顯著提高一個組織管理應用程序及其依賴的能力,但不能完全取代傳統的配置管理工具。Dockerfile 文件用於定義一個容器構建時內容,但不能持續管理容器運行時的狀態和 Docker 的宿主系統。

部署框架(Capistrano、Fabric等)

Docker 通過創建自成一體的容器鏡像,簡化了應用程序在所有環境上的部署過程。這些用於部署的容器鏡像封裝了應用程序的全部依賴。然而 Docker 本身無法執行複雜的自動化部署任務。我們通常使用其他工具一起實現較大的工作流程自動化。

工作負載管理工具(Mesos、Fleet等)

Docker 伺服器沒有集群的概念。我們必須使用其他的業務流程工具(如 Docker 自己開發的 Swarm)智能地協調多個 Docker 主機的任務,跟蹤所有主機的狀態及其資源使用情況,確保運行著足夠的容器。

虛擬化開發環境(Vagrant 等)

對開發者來說,Vagrant 是一個虛擬機管理工具,經常用來模擬與實際生產環境盡量一致的伺服器軟體棧。此外,Vagrant 可以很容易地讓 Mac OS X 和基於 Windows 的工作站運行 Linux 軟體。由於 Docker 伺服器只能運行在 Linux 上,於是它提供了一個名為 Boot2Docker 的工具允許開發人員在不同的平台上快速運行基於 Linux 的 Docker 容器。Boot2Docker 足以滿足很多標準的 Docker 工作流程,但仍然無法支持 Docker Machine 和 Vagrant 的所有功能。

如果沒有強有力的參考標準,很難理解 Docker 的作用。下一章我們將概覽 Docker,它是什麼,它的目標使用場景,以及它的優勢。

作者簡介:

Karl Matthias

Karl Matthias 曾在創業公司和世界 500 強企業中擔任過開發人員,系統管理員和網路工程師。在德國和英國的初創公司工作了若干年後,他和家人回到了美國俄勒岡州波特蘭,在 New Relic 公司擔任首席網站可靠性工程師。業餘時間,他會和他的兩個女兒玩,用他那老式相機攝攝影,或者騎騎自行車。

Sean Kane

Sean Kane 目前在 New Relic 公司的共享基礎設施團隊中擔任首席網站可靠性工程師。他在生產運維領域有很長的職業生涯,在不同的行業中工作過,有許多不同的頭銜。他在各類聚會和技術論壇做過演講,涉及過疲勞預警和硬體自動化等話題。他的青年階段大部分在海外度過,畢業於林林兄弟及巴納姆和貝利小丑學院,在美國中央情報局做過兩次實習等等,他一直在探索生活的真諦。

via: https://www.oreilly.com/learning/what-is-docker

作者:Karl Matthias,Sean Kane 譯者:Cathon 校對:jasminepeng

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國