容器技術
在前面的章節里,我們安裝了 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. 小結
本節的內容可能有些抽象,別擔心,到這里還不需要大家理解容器具體內容,本節最大的意義在于告訴大家以下兩點:
- 不要把 Docker 的概念與容器技術概念混淆,他們并不是等價的;
- 容器的本質是一個進程。