1. 程式人生 > Docker入門教學 >容器技術概念詳解

容器技術概念詳解

在前面的章節裡,我們安裝了 Linux,也安裝了 Docker,接下來是不是該上手 Docker 的使用了呢?

先不要著急,通過《Docker簡介》的章節介紹,相信我們已經對 Docker 有了初步的瞭解。但是回想下我們過往的學習經歷,每當接觸一個新的技術時,總會有一種陌生感,這個感覺主要來源於我們對這門新技術的基礎概念沒有認知,或者是理解得不夠準確。這種陌生感可能會導致兩個問題:

  • 在學習過程中喪失樂趣和成就感;
  • 對將來的深入學習造成障礙。

要排除這種陌生感,就一定要把最核心的基礎搞明白,心急是吃不了熱豆腐的。

我們知道 Docker 是一個開源的容器引擎,它的核心是容器技術。那麼容器技術到底是什麼呢?這一節我們就一起來了解下。

1. 容器技術的歷史

2000 年,隨著 FreeBSD 4.0 的釋出,容器技術正式對外公開,這種技術可將 FreeBSD 系統分割槽為多個子系統,稱為 Jail。Jail 是作為安全環境而開發的,Jail 的目的是讓程序在經過修改的 chroot 環境中建立,而不會脫離和影響整個系統,在 chroot 環境中,已經對檔案系統、網路和使用者的訪問都實現了虛擬化。2001 年,藉助 VServer 專案,容器技術進入了 Linux。這項工作的目的是在高度獨立且安全的單一環境中執行多個 Linux 伺服器,之後 Linux 容器技術開始逐漸成形。

2. 容器技術與虛擬化

容器技術其實是一種基於虛擬化的沙盒技術。

沙盒(sandbox)是一種安全機制,為執行中的程式提供隔離環境。通常是作為一些來源不可信、具破壞力或無法判定程式意圖的程式提供實驗之用。

在計算機中,虛擬化是一種資源管理的技術,它將計算機的各種實體資源,如CPU、網路、記憶體及儲存等,進行抽象後展示出來,使使用者更方便地使用這些資源。

我們舉一些常見的例子:

平臺虛擬化

平臺虛擬化是針對計算機和作業系統的虛擬化,也就是最常見的一種虛擬化技術,Hyper-V,Virtualbox,VMware 等產品都是應用這類虛擬化技術。

資源虛擬化

資源虛擬化是指對特定的計算機系統資源的虛擬化,例如對記憶體、網路資源等等。

應用程式虛擬化

應用程式虛擬化的一個最典型的應用就是 JAVA,生成的程式在指定的 JVM 虛擬機器中執行。

那麼容器技術屬於哪一種虛擬化呢?

現在的容器技術,執行在作業系統之上,使用作業系統自身支援的機制(Namespace,CGroup,下面的章節會詳細講解),提供了相對獨立的應用程式執行的環境,能夠讓應用程式間可以互不干擾地獨立執行,也提供了資源控制的功能,能對其在執行中所使用的資源進行干預,可以理解為作業系統虛擬化的範疇。

3. 容器技術的實質

假定我們編寫了一個批量運算加法的程式,這個程式的輸入需要從一個檔案 A 中讀取,處理結果儲存到另一個檔案 B 中。當作業系統執行這個加法程式時,作業系統會根據程式的指引,從檔案 A 中讀取資料,儲存到記憶體裡,然後執行加法指令,CPU 與記憶體協作,完成了運算,將結果儲存到 B 中。

在程式的執行過程中,計算機記憶體的資料,CPU 暫存器裡的資料,記憶體堆疊中的指令,讀取寫入的檔案,以及執行過程中計算機的狀態,這些資訊的集合,就是程序。

對於程序來說,它的靜止態就是一個二進位制可執行檔案,它的執行態就是與它相關的計算機資料和狀態的總和。而子程序的所有資源都繼承父程序,只要控制住父程序的資源,通過父程序衍生的子程序也會被控制。

所以,簡單來說容器技術的實質就是:通過各種手段,修改、約束一個"容器”程序的執行狀態,按照使用者的意圖“誤導”它能看到的資源,控制它的邊界,從而達到環境隔離,或者說虛擬化的目的

4. 小結

本節的內容可能有些抽象,別擔心,到這裡還不需要大家理解容器具體內容,本節最大的意義在於告訴大家以下兩點:

  1. 不要把 Docker 的概念與容器技術概念混淆,他們並不是等價的;
  2. 容器的本質是一個程序。