【Docker / KEN】什麼是容器?(Docker)

什麼是容器?(Docker)

—— 軟件的標準化單元

(最後修改時間 —— 2019.8.20 / 撰寫人:Kenllf / 轉載請註明出處 / 本文已完成


將軟件打包到標準化單元中,方便進行開發、轉移和部署

容器,是由 代碼 與其 運行所需的依賴 [1] 打包而成的一個標準化單元。使用容器,可以讓我們很 快速可靠 地將應用從一個開發環境 轉移 到另一個開發環境 [2]Docker 容器鏡像 [3],是軟件的一個 輕量獨立的且可執行的包。它包含了一個應用運行所需的一切 —— 包括 代碼運行時(runtime)系統工具系統庫配置等。

注:
[1]:指環境變量,系統庫之類的
[2]:例如,將一個 應用/軟件 從一個 Windows 轉到另一個 Windows,或者從 Windows 轉到 Linux 之類的情況。原本還需要重新配環境,安裝依賴什麼的,使用容器可以省去這些麻煩。而且原本往往重新配置環境什麼的也很麻煩,能不能配成功也難說,而使用容器技術就不會有這些顧慮
[3]:對虛擬機有了解的,可以將 Docker 容器鏡像 類比虛擬機的鏡像。當我們在一臺電腦創建好容器之後,可以創建其相應的鏡像,然後在新的電腦上部署好鏡像後,即可使用,不必再配什麼環境。

容器動態 的,容器鏡像靜態 的,它們關係很簡單,不用想複雜了。以 Docker 容器 舉例 —— 當 Docker 鏡像 運行Docker 引擎 上時,它就成爲了一個 容器。是不是很簡單!而且發展到現在,容器技術已經支持 Linux 和 Windows 的應用了 [4],不管 底層設施 [5] 如何,容器化的軟件 都一樣可以運行。容器將 軟件 和它周圍的 運行環境 隔絕開 [6],確保即使開發階段和發行階段存在差異,軟件一樣能運行。

注:
[4]:曾經只有 Linux 有自己的容器技術,後來容器技術發展起來並大火之後,Windows 也開始發展自己的容器技術。
[5]:這裏所說的 底層設施 是指 硬件設施 等。
[6]:容器中已經包含軟件正常運行所需的一切,前面已經講解過了。所以 軟件外部環境 隔絕開 不會 對軟件的正常運行產生影響。相反,當容器內部崩潰,或是容器外部環境崩潰,它們之間不會相互影響。這也是容器技術最初的目的 —— 爲了防止某個軟件運行發生問題影響到整個系統,就將該軟件部署到容器中。而 “Build Once, Run Anywhere”(一次編寫,到處運行),則是容器技術後來發展的成果,這也是 Docker 大火的一個原因。

運行在 Docker 引擎 上的 Docker 容器 的特點:

  • 標準化(Standard):Docker 爲容器制定了 行業標準,這樣容器就可以 方便統一 地在各處運行。
  • 輕量(Lightweight):所有容器 共享同一個 操作系統內核 [7],所以 不必 額外爲每個容器中的應用獨立配備一個操作系統(OS) [8]。這樣做可以提高服務器(或者電腦設備)的效率,降低服務器和許可權限(licensing)的開銷。
  • 安全(Secure):應用運行在容器之內會更加的安全 [9]。Docker 提供了很好的隔離功能。

[7]:這個內核就是最原本的操作系統(OS)的內核,所以實際上容器內外的軟件都是共用這一個內核。
[8]:想想虛擬機的虛擬化方式,就是重新打造一個操作系統,讓軟件運行在新的操作系統之上。可想而知,虛擬機的方式會消耗更多的資源。容器與之對比,真的輕量許多。
[9]:相對虛擬機而言,容器的隔離效果是會差一些。因爲虛擬機是從操作系統到上層軟件全部隔離了,顯然更加徹底。但是 Docker 容器也足夠安全了,國內在使用的大公司也不少 —— 像 騰訊、京東、美團、新浪、大衆點評等很早就有在使用了,國外使用 Docker 容器的公司就更多了。

如果看完上面一大段文字,還是對容器概念比較模糊,那就看看下面的這幅圖。

container-what-is-container
圖中最下面的是 底層設施(Infrastructure)。在其之上是 主機操作系統(Host Operating System),這就是我們平常在使用的操作系統,可能是 Windows 或者 Linux。這兩層都是公共的部分,也是最原始的,不需要改變的。

主機操作系統(Host Operating System),我們先運行 Docker 引擎 [10],然後就可以在 Docker 引擎 中打開 Docker 鏡像Docker 引擎 就會自動幫我們創建出 Docker 容器。圖中 應用 A(App A)應用 F(App F) 都分別是一個獨立的容器。

容器就是這樣一個簡單的概念。具體的實現原理還是有些複雜的,但是對於我們使用者來說,能夠了解它的基本原理,知道它的優缺點,知道如何使用,就完全足夠了。畢竟我們不是要開發 Docker 引擎,我們只是要使用它 [11]

[10]:Docker 引擎 就是圖中 Docker 的那一層。運行 Docker 引擎 這一步跟我們平常運行任何一個軟件沒有任何區別。
[11]:但是也歡迎有志向,有能力的開發者們,參與到 Docker 的開發中。Docker 的開源項目名稱已經從原來的 Docker 更改爲 moby 了。但其實 moby 就是原來的 Docker 開源項目,沒兩樣。Docker 開源項目之所以更名爲 moby,外界都說是 Docker 公司 爲了將 Docker 的流量引到自己公司來。所以現在 Docker 開源項目的地址是:https://github.com/Moby/moby


Docker 容器隨處可見:linux,Windows,數據中心(Data center),雲,無服務器架構(Serverless)等

Docker 容器技術 在 2013 年以一個 開源 的 Docker 引擎 正式發行。

它利用了當時已有的容器概念,特別是 Linux 領域中的容器概念。比如說 cgroups(control groups)namespaces [12]原語(primitives) [13]。Docker 的技術的獨特之處來自於,它專注於解決開發者和系統操作者關於 將應用的依賴從基礎設施(infrastructure)中獨立出來 的需求。

[12]:cgroups 和 namespaces 都在容器技術上起了重要的作用。cgroups 主要用於資源管理,而 namespaces 用於隔離不同的程序,可以理解爲每個容器有獨立的 namespace。
[13]:原語(primitives)在計算機中是指不可拆分的操作,或者說原子操作。

在這裏插入圖片描述
容器技術在 Linux 領域的成功 [14],推動了 Docker 和 微軟 的合作。這一合作也將 Docker 容器 和它強大的功能帶到了 Windows 服務器 上(有時也成爲 Docker Windows 容器)。

[14]:或者說是 Docker 在 Linux 容器虛擬化領域的成功,推動了它們之間的合作。因爲 Linux 領域的容器虛擬化技術早在 Docker 之前就存在了,而 Docker 是讓 Linux 的容器虛擬化技術更易於使用,可以說 Linux 容器虛擬化的大火就是 Docker 直接推動的。

Docker 及其開源項目 Moby [15] 提供的技術,已經被很多主要的數據中心提供商和雲提供商所採用。這些提供商很多都把 Docker 作爲他們的容器本地 IaaS 產品 [16]。此外,領先的開源無服務器框架也都採用 Docker 的容器技術

[15]:前面提到過,開源項目 Moby 其實就是原來的開源項目 Docker,只是後來改名了,內容還是原來的內容,而且一直在發展中。Docker 公司爲了將 “Docker” 這個名稱的流量引到自己公司,無恥的將開源項目改名了 -_-
[16]:比較拗口。首先 IaaS基礎設施即服務,這種服務的特點是,把 IT 基礎設施作爲一種服務通過網絡對外提供。注意,是通過網絡,不是真的賣硬件。相當於我們可以通過網絡訪問到他們的硬件資源,並且進行利用。這種情況下,Docker 就可以作爲一個快速部署的利器。


容器 VS 虛擬機

容器和虛擬機都有資源隔離和分配的優勢。但是他們的運作方式不一樣 —— 因爲容器是對 操作系統 虛擬化 [17],而虛擬機是對 硬件 進行虛擬化 [18]。所以比較起來,容器更輕便,也更高效。

[17]:對操作系統虛擬化,是指,對於容器內部的軟件來說,它看起來像是擁有自己的操作系統(其實它沒有,容器騙它說有)。而容器內部的創建和運行都是基於這個 “自己的操作系統” 的。
[18]:對硬件虛擬化,是指,對於虛擬機內部來說,它看起來像是擁有自己的硬件系統(其實它也沒有,虛擬機騙它說有 =_=)。而虛擬機內部,包括操作系統的創建和系統的運行,都是基於這個 “自己的硬件系統” 的。所以虛擬化就像是一個童話,而童話裏都是騙人的。

下面兩幅圖是兩者結構的對比:

在這裏插入圖片描述

  • 容器:
    容器是 應用層(app layer) 的抽象,打包了代碼和各種依賴。多個容器能運行在同一個機器上。從圖中可以看到,它們共享 主機操作系統,自始至終 不需要 額外創建操作系統,所以顯然它們也是共享同一個 操作系統內核(OS Kernel) 的。它們在同一個用戶空間中 [19],但是卻相互隔離地運行着 [20]。與虛擬機相比,容器佔用更少的空間(容器鏡像通常只有 幾十MB 的大小)。這使得每次可以運行較多的容器,而且不需要那麼多的虛擬機和操作系統 [21]

[19]:用戶空間可以這麼理解 —— 當我們打開電腦時,需要選擇用戶,或者輸入密碼,隨後進入的就是一個用戶空間。所以顯然一臺電腦上的容器都是在同一個用戶空間的。現在來看虛擬機 —— 當我們打開虛擬機時,我們還要重複一次平常開電腦時,選用戶或者輸密碼的過程,因爲進入的是一個新的用戶空間。
[20]:所謂相互隔離,簡單理解就是容器中的應用覺得它就是唯一的應用,它對容器外的情況一無所知。容器起的就是一個隔離地作用。
[21]:奇怪,不是隻需一個操作系統,也不需要用虛擬機嗎?其實這裏是從整個宏觀來看 —— 比如說以一整個公司,或者是一羣用戶來看,使用容器的情況下,確實整體對虛擬機和操作系統的需求下降了(所謂下降是和原來虛擬機時代對比)。

在這裏插入圖片描述

  • 虛擬機
    虛擬機是 物理硬件 的抽象,它將一個服務器擴展爲了多個服務器 [22]。虛擬機管理器(hypervisor)使得多個虛擬機可以運行在同一個機器上。每個虛擬機都有一個完整的 操作系統應用 以及 必要的二進制文件和庫。這使得一個虛擬機常常有 幾 GB 甚至 幾十 GB 的大小。所以虛擬機就連開機都很慢。

[22]:比如在一個服務器上安裝 3 個虛擬機,那麼服務器就相當於 1 個變成 3 個了,可以給更多的客戶獨立使用。


容器 Plus 虛擬機

雖然聽起來容器似乎比虛擬機要好上很多,但是容器要完全淘汰虛擬機還不太可能。其實容器和虛擬機組合使用,能大大地提升部署和管理應用(App)的靈活性。

下圖中,右側的圖就是二者組合後的結果

在這裏插入圖片描述
如今雲服務器已經很普及,而計算資源也相當豐富。如果按照一個服務器只有一個操作系統,那麼大量計算資源就會被閒置,很浪費。由於服務器的性能要比家用電腦好很多,即使在上面安裝一定量的虛擬機,每臺虛擬機的性能也做夠普通用戶使用。再在虛擬機上安裝容器,就可以很好地利用到容器帶來的好處。

以上就是對容器的介紹,如有錯誤,歡迎指出!~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章