## [官方文檔][1]

* 容器技術的興起源于 PaaS 技術的普及;
* Docker 公司發布的 Docker 項目具有里程碑式的意義;
* Docker 項目通過“容器鏡像”,解決了應用打包這個根本性難題。
> 容器本身沒有價值,有價值的是“容器編排”。
容器技術生態才爆發了一場關于“容器編排”的“戰爭”。而這次戰爭,最終以`
Kubernetes` 項目和 `CNCF` 社區的勝利而告終。
## 進程
一旦“程序”被執行起來,它就從磁盤上的二進制文件,變成了計算機內存中的數據、
寄存器里的值、堆棧中的指令、被打開的文件,以及各種設備的狀態信息的一個集合。像這樣一
個程序運起來后的計算機執行環境的總和,即進程。
而容器技術的核心功能,就是通過約束和修改進程的動態表現,從而為其創造出一個“邊界”。
對于 Docker 等大多數 Linux 容器來說,`Cgroups` 技術是用來制造約束的主要手段,而
`Namespace` 技術則是用來修改進程視圖的主要方法。
## Docker 鏡像
操作系統分為**內核**和**用戶空間**。對于 Linux 而言,內核啟動后,會掛載 root 文件系統為其提供用戶空間支持。而 Docker 鏡像(Image),就相當于是一個 root 文件系統。
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等) 。鏡像**不包含任何動態數據**,其內容在構建之后也**不會被改變**。
### 分層存儲
因為鏡像包含操作系統完整的 root 文件系統,其體積往往是龐大的,因此在Docker 設計時,就充分利用 **Union FS** 的技術,將其設計為分層存儲的架構。
## Docker 容器
鏡像(Image) 和容器(Container) 的關系,就像是面向對象程序設計中的 **類** 和 **實例**一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
容器的實質是**進程**,但與直接在宿主執行的進程不同,容器進程運行于屬于自己的獨立的 **命名空間**。
### 容器存儲層
容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失。
按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用 數據卷(Volume) 、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。
## Registry 倉庫
一個 Docker Registry 中可以包含多個倉庫(Repository) ;每個倉庫可以包含多個標簽(Tag) ;每個標簽對應一個鏡像。
## 開源與商業版
開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現,足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。在官方的商業化版本 Docker Trusted Registry 中,提供了這些高級功能
[1]:https://docs.docker.com/