雲端容器化技術與資源調度
容器化技術發展
虛擬化
指透過任何手段在一個既有環境(稱為Host)來模擬出 作業系統
、儲存裝置
、網路設備
等…。被模擬出來的東西,稱為 Guest。
虛擬化的需求及發展,其實早從1960年代起就開始了,當時就是為了要解決在大型主機 (Mainframe) 上面如何隔離應用系統的問題。
虛擬化的實作
硬體層虛擬化
將 Host CPU / Memory / 網卡等既有的硬體資源隔離。例如:
- Host 有一個 2 核心 CPU,經過硬體虛擬化之後,隔離成為兩個 1 核心的 Guest CPU
- Host 有 16G RAM,經過硬體虛擬化之後,隔離成為兩個 8G 的 Guest RAM
VMWare、Virtual PC、Xen 等技術都是硬體層虛擬化的例子
作業系統層虛擬化
將 Host OS 的 Process / Library / File System 進行隔離,在一個 Host OS 上模擬出多個 Guest OS。然而 Guest OS 仍是共享同一套 Host Kernel。
作業系統層虛擬化當中 Guest OS 就是大家一直再說的 容器
(Container)。
Jail, LXC, Docker 等技術都是作業系統層虛擬化的例子
chroot (Jail)
- 1982 的 Unix 內建了
chroot
的指令,可以讓該 Unix 環境當中,虛擬化另一個完全隔離的沙箱環境出來,這個環境就稱為容器。 - 1991年,William Cheswick 開發出第一個
蜜罐
程式,來監視入侵駭客的行動。他使用了chroot來進行實作,這是chroot最早被用於開發程式的先例,也因此,chroot創造出的根目錄空間,之後被人稱為軟體監獄(chroot jail)。
駭客非正規方法以及漏洞來突破 chroot 的管制區,這種行為就是大家說熟知的『越獄』(JB)。
LXC (Linux Container)
在 Linux Kernel 中,提供了 cgroups
功能,來達成資源的區隔化。
它同時也提供了名稱空間區隔隔離的功能,使應用程式看到的作業系統環境被區隔成獨立區間,包括Process Tree,網路,使用者id,以及掛載的檔案系統。
LXC 利用 cgroups 與名稱空間的功能,提供應用軟體一個獨立的作業系統環境。
$ lxc-create -t download -n my-container
$ lxc-start -n my-container -d
$ lxc-attach -n my-container
# ...
my-container$
Docker Container
Docker Container = LXC + AUFS (Advanced Multi-Layered Unification Filesystem)
Docker 將 LXC 結合上 Layered FS 的觀念,進而催生了 Docker Image 的概念。使得容器化技術,在隔離的目的之上,多了一個 繼承
的功能。
Image 本身紀錄了一個容器的靜態檔案狀態,是不可變動的。如果像要改變檔案,則要透過透過層層的堆疊來達成,當然,每變動一次,Image 都會多一層,體積都會變大些: