要解釋清楚 Docker,首先要解釋清楚容器(Container)的概念。要解釋容器的話,就需要從操作系統(tǒng)說起。操作系統(tǒng)太底層,細說的話一兩本書都說不清楚。這里就一句話來總結一下:操作系統(tǒng)(Operating System,簡稱OS)是管理計算機硬件與軟件資源的計算機程序,并且為軟件運行提供通用服務的系統(tǒng)軟件。
隨著硬件的性能提升,軟件種類的豐富,有兩種情況變得很常見:
為了解決軟件沖突,只能配置多臺計算機,或者很麻煩的在同一臺電腦上安裝多個操作系統(tǒng)。顯然這兩個方案都有其缺點:多臺計算機成本太高,多操作系統(tǒng)的安裝、切換都很麻煩。在硬件性能過剩的時候,硬件虛擬化的普及就很自然而然的提出來了。
所謂硬件虛擬化,就是某個特殊的軟件,仿真出一臺或者多臺計算機的各種硬件,用戶可以在這一臺虛擬機上安裝、運行操作系統(tǒng)(一般叫來賓操作系統(tǒng),Guest OS)和各種應用,并且把 Guest OS 和上面應用軟件對硬件資源的訪問轉發(fā)到底層的硬件上來實現(xiàn)。
對于 Guest OS 和上面的應用程序來說,這臺虛擬機和普通物理計算機是完全一樣沒有任何區(qū)別的——除了性能可能差一點。全球第一人氣的 VMware Workstation 就是這么一個軟件,Oracle 的 VirtualBox 以及 Microsoft 的 Virtual PC 都是。這類軟件英語有一個專用的單詞是 Hypervisor(虛擬機管理程序)。
可以把資源分配到不同的虛擬機,達到硬件資源的最大化利用;
相比直接在物理機上部署應用,虛擬機更容易擴展應用;
云服務:通過虛擬機虛擬出不同的物理資源,可以快速搭建云服務。
虛擬化技術主要用來解決高性能的物理硬件產能過剩和老舊的硬件硬件產品產能過低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件。
虛擬機的缺點在于 Guest OS 通常會占用不少硬件資源。例如 Windows 安裝 VMware 并開機 Guest OS,不運行任何應用的情況下,就需要占用 2 ~ 3G 內存,20 ~ 30G 硬盤空間。而且為了應用系統(tǒng)運行的性能,往往還要給每臺虛擬機留出更多的內存容量。雖然不少 Hypervisor 支持動態(tài)內存,但基本上都會降低虛擬機的性能。在這樣的資源占用情況下,少量的虛擬機還是可以接受的,如果同時運行十多臺或數(shù)十臺虛擬機,硬件資源的浪費就會成倍遞增。通常來說,其中相當大一部分甚至全部 Guest OS 都是相同的。
能不能所有應用使用同一個操作系統(tǒng)減少硬件資源的浪費,但是又能避免包括運行庫在內的軟件沖突呢?操作系統(tǒng)層虛擬化——容器概念的提出,就是為了解決這個問題。Docker 就是一個容器的標準化實現(xiàn)。
容器技術已經發(fā)展了很長一段時間了,例如:LXC,BSD Jails,Solaris Zones...
容器化就是應用程序級別的虛擬化技術。容器提供了將應用程序的代碼、運行時、系統(tǒng)工具、系統(tǒng)庫和配置打包到一個實例中的標準方法。容器共享一個內核(操作系統(tǒng)),它安裝在硬件上。
和虛擬機相比,容器有以下優(yōu)點:
2010 年,幾個搞 IT 的年輕人,在美國舊金山成立了一家名叫 dotCloud 的公司。dotCloud 的平臺即服務(Platform-as-a-Service, PaaS)提供商。底層技術上,dotCloud 平臺利用了 Linux 的 LXC 容器技術。
為了方便創(chuàng)建和管理這些容器,dotCloud 基于 Google 公司推出的 Go 語言開發(fā)了一套內部工具,之后被命名為 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 內核中的很多特性,作為一個獨特、穩(wěn)定且不受制于 Linux 的 Library,獨立的時代終于到來了。
如同 Docker 的 Logo 一樣,Docker 的思想來源于集裝箱。集裝箱解決了什么問題?在一艘大船上,可以把貨物規(guī)整的擺放起來,并且各種各樣的貨物被集裝箱標準化,集裝箱與集裝箱之間互不影響。那么就不需要專門運送水果的船和專門運送化學用品的船了。只要這些貨物封裝在不同的集裝箱里,就可以用一艘大船把它們都運走。
Docker 技術誕生之后,并沒有引起行業(yè)的關注。而 dotCloud 公司,作為一家小型創(chuàng)業(yè)企業(yè),在激烈的競爭之下,也步履維艱。
正當他們快要堅持不下去的時候,腦子里蹦出了“開源”的想法。什么是“開源”?開源,就是開放源代碼。也就是將原來內部保密的程序源代碼開放給所有人,然后讓大家一起參與進來,貢獻代碼和意見。
有的軟件一開始就是開源的。也有的軟件,是混不下去,創(chuàng)造者又不想放棄,所以選擇開源。自己養(yǎng)不活,就吃“百家飯”嘛。2013 年 3 月,dotCloud 公司的創(chuàng)始人之一,Docker 之父,28 歲的 Solomon?Hykes 正式決定,將 Docker 項目開源。
不開則已,一開驚人。越來越多的 IT 工程師發(fā)現(xiàn)了 Docker 的優(yōu)點,然后蜂擁而至,加入 Docker 開源社區(qū)。Docker 的人氣迅速攀升,速度之快,令人瞠目結舌。
開源當月, Docker 0.1 版本發(fā)布。此后的每一個月, Docker 都會發(fā)布一個版本。到 2014 年 6 月 9 日, Docker 1.0 版本正式發(fā)布。
此時的 Docker,已經成為行業(yè)里人氣最火爆的開源技術,沒有之一。甚至像 Google、微軟、Amazon、 VMware 這樣的巨頭們都對它青睞有加,表示將全力支持。
Docker 火了之后, dotCloud 公司干脆把公司名字也改成了 Docker Inc. 。
更高效的利用系統(tǒng)資源
由于容器不需要進行硬件虛擬以及運行完整操作系統(tǒng)等額外開銷,Docker 對系統(tǒng)資源的利用率更高。無論是應用執(zhí)行速度、內存損耗或者文件存儲速度,都要比傳統(tǒng)虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運行更多數(shù)量的應用。
更快速的啟動時間
傳統(tǒng)的虛擬機技術啟動應用服務往往需要數(shù)分鐘,而 Docker 容器應用,由于直接運行于宿主內核,無需啟動完整的操作系統(tǒng),因此可以做到秒級、甚至毫秒級的啟動時間。大大的節(jié)約了開發(fā)、測試、部署的時間。
一致的運行環(huán)境
開發(fā)過程中一個常見的問題是環(huán)境一致性問題。由于開發(fā)環(huán)境、測試環(huán)境、生產環(huán)境不一致,導致有些 bug 并未在開發(fā)過程中被發(fā)現(xiàn)。而 Docker 的鏡像提供了除內核外完整的運行時環(huán)境,確保了應用運行環(huán)境一致性,從而不會再出現(xiàn)「這段代碼在我機器上沒問題啊」 這類問題。
持續(xù)交付和部署
對開發(fā)和運維(DevOps)人員來說,最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運行。
使用 Docker 可以通過定制應用鏡像來實現(xiàn)持續(xù)集成、持續(xù)交付、部署。開發(fā)人員可以通過 Dockerfile 來進行鏡像構建,并結合持續(xù)集成(Continuous Integration)系統(tǒng)進行集成測試,而運維人員則可以直接在生產環(huán)境中快速部署該鏡像,甚至結合持續(xù)部署(Continuous Delivery/Deployment)系統(tǒng)進行自動部署。
而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發(fā)團隊可以理解應用運行環(huán)境,也方便運維團隊理解應用運行所需條件,幫助更好的在生產環(huán)境中部署該鏡像。
更輕松的遷移
由于 Docker 確保了執(zhí)行環(huán)境的一致性,使得應用的遷移更加容易。Docker 可以在很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結果是一致的。因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上,而不用擔心運行環(huán)境的變化導致應用無法正常運行的情況。
更輕松的維護和擴展
Docker 使用的分層存儲以及鏡像的技術,使得應用重復部分的復用更為容易,也使得應用的維護更新更加簡單,基于基礎鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高質量的 官方鏡像,既可以直接在生產環(huán)境使用,又可以作為基礎進一步定制,大大的降低了應用服務的鏡像制作成本。
下面的圖片比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處,可見容器是在操作系統(tǒng)層面上實現(xiàn)虛擬化,直接復用本地主機的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實現(xiàn)。
與傳統(tǒng)的虛擬機相比,Docker 優(yōu)勢體現(xiàn)為啟動速度快、占用體積小。
至此 Docker 概念性相關內容就介紹到這里,下文我們聊聊 Docker 架構及其工作原理。
您的 點贊 和 轉發(fā) 是對我最大的支持。
關注 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕松噢 ~