簡單的講就是,Linux namespace 允許用戶在獨立進程之間隔離 CPU 等資源。進程的訪問權限及可見性僅限於其所在的 Namespaces 。因此,用戶無需擔心在一個 Namespace 內運行的進程與在另一個 Namespace 內運行的進程沖突。甚至可以同一台機器上的不同容器中運行具有相同 PID 的進程。同樣的,兩個不同容器中的應用程序可以使用相同的端口。

與虛擬機相比,容器更輕量且速度更快,因為它利用了 Linux 底層操作系統在隔離的環境中運行。虛擬機的 hypervisor 創建了一個非常牢固的邊界,以防止應用程序突破它,而容器的邊界不那么強大。另一個區別是,由於 Namespace 和 Cgroups 功能僅在 Linux 上可用,因此容器無法在其他操作系統上運行;Docker 實際上使用了一個技巧,並在非 Linux 操作系統上安裝 Linux 虛擬機,然后在虛擬機內運行容器。
雖然大多數IT行業正在采用基於容器的基礎架構(雲原生解決方案),但必須了解該技術的局限性。 傳統容器(如Docker,Linux Containers(LXC)和Rocket(rkt))並不是真正的沙箱,因為它們共享主機操作系統內核。 它們具有資源效率,但攻擊面和破壞的潛在影響仍然很大,特別是在多租戶雲環境中,共同定位屬於不同客戶的容器。
當主機操作系統為每個容器創建虛擬化用戶空間時,問題的根源是容器之間的弱分離。一直致力於設計真正的沙盒容器的研究和開發。 大多數解決方案重新構建容器之間的邊界以加強隔離。譬如來自IBM,Google,Amazon和OpenStack的四個獨特項目,這些項目使用不同的技術來實現相同的目標,為容器創建更強的隔離。
- IBM Nabla在Unikernels之上構建容器
- Google gVisor創建了一個用於運行容器的專用客戶機內核
- Amazon Firecracker是一個用於沙盒應用程序的極輕量級管理程序
- OpenStack將容器放置在針對容器編排平台優化的專用VM中
