底層實作
Docker 底層的核心技術包括 Linux 上的命名空間(Namespaces)、控制組(Control groups)、Union 檔案系統(Union file systems)和容器格式(Container format)。
我們知道,傳統的虛擬機透過在宿主主電腦中執行 hypervisor 來類比一整套完整的硬體環境提供給虛擬機的作業系統。虛擬機系統看到的環境是可限制的,也是彼此隔離的。 這種直接的做法實作了對資源最完整的封裝,但很多時候往往意味著系統資源的浪費。 例如,以宿主電腦和虛擬機系統都為 Linux 系統為例,虛擬機中執行的應用其實可以利用宿主電腦系統中的執行環境。
我們知道,在作業系統中,包括核心、檔案系統、網路、PID、UID、IPC、 記憶體、硬碟、CPU 等等,所有的資源都是應用處理序直接共享的。 要想實作虛擬化,除了要實作對 記憶體、CPU、網路IO、硬碟IO、儲存空間等的限制外,還要實作檔案系統、網路、PID、UID、IPC等等的相互隔離。 前者相對容易實作一些,後者則需要宿主電腦系統的深入支援。
隨著 Linux 系統對於命名空間功能的完善實作,程式設計師已經可以實作上面的所有需求,讓某些處理序在彼此隔離的命名空間中執行。大家雖然都共用一個核心和某些執行時環境(例如一些系統指令和系統庫),但是彼此卻看不到,都以為系統中只有自己的存在。這種機制就是容器(Container),利用命名空間來做權限的隔離控制,利用 cgroups 來做資源指派。