Docker 的前世此生

虛擬化

  

  要解釋清楚 Docker,首先要解釋清楚容器(Container)的概念。要解釋容器的話,就須要從操做系統提及。操做系統太底層,細說的話一兩本書都說不清楚。這裏就一句話來總結一下:操做系統(Operating System,簡稱OS)是管理計算機硬件與軟件資源的計算機程序,而且爲軟件運行提供通用服務的系統軟件。前端

  隨着硬件的性能提高,軟件種類的豐富,有兩種狀況變得很常見:docker

  1. 硬件性能過剩——不少計算機的硬件配置,每每會有大量時間處於硬件資源閒置的狀態。例如通常家用電腦,已是四核、六核的配置了,除了3A遊戲、視頻製做、3D渲染、高性能計算等特殊應用外,一般有 90% 以上時間 CPU 是閒置的;
  2. 軟件衝突——由於業務須要,兩個或者多個軟件之間衝突,或者須要同一個軟件的不一樣版本。例如早幾年作 Web 前端的,要測試網頁在不一樣版本的 IE 上是否能正常顯示,然而 Windows 只能裝一個版本的 IE。

  

  爲了解決軟件衝突,只能配置多臺計算機,或者很麻煩的在同一臺電腦上安裝多個操做系統。顯然這兩個方案都有其缺點:多臺計算機成本過高,多操做系統的安裝、切換都很麻煩。在硬件性能過剩的時候,硬件虛擬化的普及就很天然而然的提出來了。服務器

  所謂硬件虛擬化,就是某個特殊的軟件,仿真出一臺或者多臺計算機的各類硬件,用戶能夠在這一臺虛擬機上安裝、運行操做系統(通常叫來賓操做系統,Guest OS)和各類應用,而且把 Guest OS 和上面應用軟件對硬件資源的訪問轉發到底層的硬件上來實現。架構

  對於 Guest OS 和上面的應用程序來講,這臺虛擬機和普通物理計算機是徹底同樣沒有任何區別的——除了性能可能差一點。全球第一人氣的 VMware Workstation 就是這麼一個軟件,Oracle 的 VirtualBox 以及 Microsoft 的 Virtual PC 都是。這類軟件英語有一個專用的單詞是 Hypervisor(虛擬機管理程序)。app

  

  

虛擬機的優勢

  

  能夠把資源分配到不一樣的虛擬機,達到硬件資源的最大化利用;運維

  相比直接在物理機上部署應用,虛擬機更容易擴展應用;工具

  雲服務:經過虛擬機虛擬出不一樣的物理資源,能夠快速搭建雲服務。性能

虛擬化技術主要用來解決高性能的物理硬件產能過剩和老舊的硬件硬件產品產能太低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件。學習

  

虛擬機的缺點

  

  虛擬機的缺點在於 Guest OS 一般會佔用很多硬件資源。例如 Windows 安裝 VMware 並開機 Guest OS,不運行任何應用的狀況下,就須要佔用 2 ~ 3G 內存,20 ~ 30G 硬盤空間。並且爲了應用系統運行的性能,每每還要給每臺虛擬機留出更多的內存容量。雖然很多 Hypervisor 支持動態內存,但基本上都會下降虛擬機的性能。在這樣的資源佔用狀況下,少許的虛擬機仍是能夠接受的,若是同時運行十多臺或數十臺虛擬機,硬件資源的浪費就會成倍遞增。一般來講,其中至關大一部分甚至所有 Guest OS 都是相同的。測試

  能不能全部應用使用同一個操做系統減小硬件資源的浪費,可是又能避免包括運行庫在內的軟件衝突呢?操做系統層虛擬化——容器概念的提出,就是爲了解決這個問題。Docker 就是一個容器的標準化實現。

  

容器化

  

  容器技術已經發展了很長一段時間了,例如:LXC,BSD Jails,Solaris Zones...

  容器化就是應用程序級別的虛擬化技術。容器提供了將應用程序的代碼、運行時、系統工具、系統庫和配置打包到一個實例中的標準方法。容器共享一個內核(操做系統),它安裝在硬件上。

  

  

  和虛擬機相比,容器有如下優勢:

  1. 啓動迅速:沒有虛擬機硬件的初始化,沒有 Guest OS 的啓動過程,能夠節約不少啓動時間,這就是容器的「開箱即用」;
  2. 佔用資源少:沒有運行 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 國際」許可協議

你們能夠經過 分類 查看更多關於 Docker 的文章。

  

🤗 您的點贊轉發是對我最大的支持。

📢 掃碼關注 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~

相關文章
相關標籤/搜索