Docker 的前世今生
虛擬化
「要解釋清楚 Docker,首先要解釋清楚容器(Container)的概念」。要解釋容器的話,就需要從作業系統說起。作業系統太底層,細說的話一兩本書都說不清楚。這裡就一句話來總結一下:作業系統(Operating System,簡稱OS)是管理電腦硬體與軟體資源的電腦程式,並且為軟體運行提供通用服務的系統軟體。
隨著硬體的性能提升,軟體種類的豐富,有兩種情況變得很常見:
-
硬體性能過剩——很多電腦的硬體配置,往往會有大量時間處於硬體資源閑置的狀態。例如一般家用電腦,已經是四核、六核的配置了,除了3A遊戲、影片製作、3D渲染、高性能計算等特殊應用外,通常有 90% 以上時間 CPU 是閑置的; -
軟體衝突——因為業務需要,兩個或者多個軟體之間衝突,或者需要同一個軟體的不同版本。例如早幾年做 Web 前端的,要測試網頁在不同版本的 IE 上是否能正常顯示,然而 Windows 只能裝一個版本的 IE。
為了解決軟體衝突,只能配置多台電腦,或者很麻煩的在同一台電腦上安裝多個作業系統。顯然這兩個方案都有其缺點:多台電腦成本太高,多作業系統的安裝、切換都很麻煩。在硬體性能過剩的時候,「硬體虛擬化」的普及就很自然而然的提出來了。
所謂硬體虛擬化,就是某個特殊的軟體,模擬出一台或者多台電腦的各種硬體,用戶可以在這一台虛擬機上安裝、運行作業系統(一般叫來賓作業系統,Guest OS)和各種應用,並且把 Guest OS 和上面應用軟體對硬體資源的訪問轉發到底層的硬體上來實現。
對於 Guest OS 和上面的應用程式來說,這台虛擬機和普通物理電腦是完全一樣沒有任何區別的——除了性能可能差一點。全球第一人氣的 VMware Workstation 就是這麼一個軟體,Oracle 的 VirtualBox 以及 Microsoft 的 Virtual PC 都是。這類軟體英語有一個專用的單詞是 Hypervisor(虛擬機管理程式)。
虛擬機的優點
可以把資源分配到不同的虛擬機,達到硬體資源的最大化利用;
相比直接在物理機上部署應用,虛擬機更容易擴展應用;
雲服務:通過虛擬機虛擬出不同的物理資源,可以快速搭建雲服務。
❝
虛擬化技術主要用來解決高性能的物理硬體產能過剩和老舊的硬體硬體產品產能過低的重組重用,透明化底層物理硬體,從而最大化的利用物理硬體。
❞
虛擬機的缺點
虛擬機的缺點在於 Guest OS 通常會佔用不少硬體資源。例如 Windows 安裝 VMware 並開機 Guest OS,不運行任何應用的情況下,就需要佔用 2 ~ 3G 記憶體,20 ~ 30G 硬碟空間。而且為了應用系統運行的性能,往往還要給每台虛擬機留出更多的記憶體容量。雖然不少 Hypervisor 支援動態記憶體,但基本上都會降低虛擬機的性能。在這樣的資源佔用情況下,少量的虛擬機還是可以接受的,如果同時運行十多台或數十台虛擬機,硬體資源的浪費就會成倍遞增。通常來說,其中相當大一部分甚至全部 Guest OS 都是相同的。
能不能所有應用使用同一個作業系統減少硬體資源的浪費,但是又能避免包括運行庫在內的軟體衝突呢?「作業系統層虛擬化——容器」概念的提出,就是為了解決這個問題。Docker 就是一個容器的標準化實現。
容器化
容器技術已經發展了很長一段時間了,例如:LXC,BSD Jails,Solaris Zones…

容器化就是應用程式級別的虛擬化技術。容器提供了將應用程式的程式碼、運行時、系統工具、系統庫和配置打包到一個實例中的標準方法。容器共享一個內核(作業系統),它安裝在硬體上。
和虛擬機相比,容器有以下優點:
-
啟動迅速:沒有虛擬機硬體的初始化,沒有 Guest OS 的啟動過程,可以節約很多啟動時間,這就是容器的「開箱即用」; -
佔用資源少:沒有運行 Guest OS 所需的記憶體開銷,無需為虛擬機預留運行記憶體,無需安裝、運行 App 不需要的運行庫/作業系統服務,記憶體佔用、存儲空間佔用都小的多。相同配置的伺服器,如果運行虛擬機能運行十多台的,通常可以運行上百個容器毫無壓力——當然前提是單個容器應用本身不會消耗太多資源。
Docker 歷史
2010 年,幾個搞 IT 的年輕人,在美國舊金山成立了一家名叫 dotCloud
的公司。dotCloud 的平台即服務(Platform-as-a-Service, PaaS)提供商。底層技術上,dotCloud 平台利用了 Linux 的 LXC 容器技術。
為了方便創建和管理這些容器,dotCloud 基於 Google 公司推出的 Go 語言開發了一套內部工具,之後被命名為 Docker
。Docker 就是這樣誕生的。
❝
LXC 是 Docker 的底層基石,但是在 Docker 0.9 版本的時候,Docker 見異思遷了,引入了基於 Go 語言構建的 Libcontainer 的 execution driver。有了 Libcontainer 這個項目,Docker 不再需要依賴於 Linux 部件(LXC,libvirt,systemd-nspawn…)就可以處理 namespaces、control groups、capabilities、apparmor profiles、network interfaces。這下,LXC 淪為可選項。
在 Docker 1.8 中 LXC 被 deprecated,在 Docker 1.10,LXC 徹底出局。Docker 推出 Libcontainer 自己集成了 Linux 內核中的很多特性,作為一個獨特、穩定且不受制於 Linux 的 Library,獨立的時代終於到來了。
❞
如同 Docker 的 Logo 一樣,Docker 的思想來源於集裝箱。集裝箱解決了什麼問題?在一艘大船上,可以把貨物規整的擺放起來,並且各種各樣的貨物被集裝箱標準化,集裝箱與集裝箱之間互不影響。那麼就不需要專門運送水果的船和專門運送化學用品的船了。只要這些貨物封裝在不同的集裝箱里,就可以用一艘大船把它們都運走。
Docker 技術誕生之後,並沒有引起行業的關注。而 dotCloud 公司,作為一家小型創業企業,在激烈的競爭之下,也步履維艱。
正當他們快要堅持不下去的時候,腦子裡蹦出了「開源」的想法。什麼是「開源」?開源,就是開放源程式碼。也就是將原來內部保密的程式源程式碼開放給所有人,然後讓大家一起參與進來,貢獻程式碼和意見。
有的軟體一開始就是開源的。也有的軟體,是混不下去,創造者又不想放棄,所以選擇開源。自己養不活,就吃「百家飯」嘛。2013 年 3 月,dotCloud 公司的創始人之一,Docker 之父,28 歲的 「Solomon Hykes」 正式決定,將 Docker 項目開源。
不開則已,一開驚人。越來越多的 IT 工程師發現了 Docker 的優點,然後蜂擁而至,加入 Docker 開源社區。Docker 的人氣迅速攀升,速度之快,令人瞠目結舌。
開源當月, Docker 0.1 版本發布。此後的每一個月, Docker 都會發布一個版本。到 2014 年 6 月 9 日, Docker 1.0 版本正式發布。
此時的 Docker,已經成為行業里人氣最火爆的開源技術,沒有之一。甚至像 Google、微軟、Amazon、 VMware 這樣的巨頭們都對它青睞有加,表示將全力支援。
Docker 火了之後, dotCloud 公司乾脆把公司名字也改成了 Docker Inc. 。
為什麼選擇 Docker
「更高效的利用系統資源」
由於容器不需要進行硬體虛擬以及運行完整作業系統等額外開銷,Docker 對系統資源的利用率更高。無論是應用執行速度、記憶體損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運行更多數量的應用。
「更快速的啟動時間」
傳統的虛擬機技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由於直接運行於宿主內核,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。
「一致的運行環境」
開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一致,導致有些 bug 並未在開發過程中被發現。而 Docker 的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現「這段程式碼在我機器上沒問題啊」 這類問題。
「持續交付和部署」
對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。
使用 Docker 可以通過訂製應用鏡像來實現持續集成、持續交付、部署。開發人員可以通過 Dockerfile 來進行鏡像構建,並結合持續集成(Continuous Integration)系統進行集成測試,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合持續部署(Continuous Delivery/Deployment)系統進行自動部署。
而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的在生產環境中部署該鏡像。
「更輕鬆的遷移」
由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在很多平台上運行,無論是物理機、虛擬機、公有雲、私有雲,甚至是筆記型電腦,其運行結果是一致的。因此用戶可以很輕易的將在一個平台上運行的應用,遷移到另一個平台上,而不用擔心運行環境的變化導致應用無法正常運行的情況。
「更輕鬆的維護和擴展」
Docker 使用的分層存儲以及鏡像的技術,使得應用重複部分的復用更為容易,也使得應用的維護更新更加簡單,基於基礎鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高品質的 官方鏡像,既可以直接在生產環境使用,又可以作為基礎進一步訂製,大大的降低了應用服務的鏡像製作成本。
容器與虛擬機的比較
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在作業系統層面上實現虛擬化,直接復用本地主機的作業系統,而傳統方式則是在硬體層面實現。
與傳統的虛擬機相比,Docker 優勢體現為啟動速度快、佔用體積小。

❝
至此 Docker 概念性相關內容就介紹到這裡,下文我們聊聊 Docker 架構及其工作原理。
❞
本文採用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議
。
🤗 您的點贊
和轉發
是對我最大的支援。
📢 掃碼關注 哈嘍沃德先生
「文檔 + 影片」每篇文章都配有專門影片講解,學習更輕鬆噢 ~