介紹 Docker 的 pulldocker 和 CVFS

類別: IT
標籤: docker
$> sudo pulldocker busybox -o mybb
$> ls
mybb
$> sudo chroot mybb /bin/busybox | head -n1
BusyBox v1.22.1 (2014-05-22 23:22:11 UTC) multi-call binary.

我們認為容器是個很好的想法,Docker擁有大量包含有用應用的倉庫,任何人都可以免費的從Docker Hub上下載。我們希望幫助Docker應用在更多的場景中執行,這是我們釋出pulldocker再加一個新的小型高效的虛擬檔案系統驅動的原因。

這裡下載pulldocker。

很多開發者依舊困在無法使用Docker的機器上,而且他們將永遠無法使用Docker,因為他們無法修改核心,或者無法讓AUFS和VFS使用過多的空間。但所有的Linux環境都有chroot。Docker已經被稱作“吃了類固醇的chroot”(更準確的說,容器是“吃了類固醇的chroot”,Docker程式是使用容器的一種方式),這樣我們讓無論在何處的chroot環境裡使用Docker hub上的dokcer映象變得不那麼重要了。

什麼是chroot監獄?chroot在20世紀70年代被加入Unix,因此它有一個長期被檢驗的歷史。它非常的簡單。基本上,chroot僅僅改變程式的root(ch- root),這樣你可以模擬在一個不同系統中。比如,當一個程式查詢/usr/lib中的一個共享庫時,它會在chroot資料夾下的子資料夾/usr/lib下查詢,而不是在root的/usr/lib下。工程師已經使用chroot十多年了,用於測試和開發、依賴控制、相容性、恢復、許可權分割和部署。

簡單的給pulldocker一個映象的名字,它將解壓映象到一個資料夾(如,pulldocker busybox會進入busybox資料夾)。然後你可以chroot進這個環境。(你可能想先掛載一些東西)。這就像你進入了一個完全不同的系統——你甚至可以無縫巢狀不同的版本(如,在Ubuntu裡巢狀Redhat)。你可以從你的Dockerfile中啟動一個應用程式,或者啟動其他的來記錄資料,執行看門狗等等。

在chroot下執行docker映象會失去什麼呢?你無法從Dockerfile得到所有的配置,如執行的程式和開啟的埠。你也失去了擁有遠端API的Docker後臺程式。但你仍然可以通過用不同的使用者執行不同的程式來得到相互孤立的程式。你可以用nice來模擬容器的CPU限制。僅靠chroot執行不信任的程式碼從來都不是安全的,然而某天Docker保證提供完全的安全性。目前的大多數Docker安裝都執行在信任可控的環境。完整的Docker對於執行你找到的應用或者已經制作的是很棒,但對於製作Docker應用提交的完整工作流程並不好。但是,你無需容器就可以得到大多數的Docker的益處(或者甚至擁有檔案系統的核心支援!):

Docker + chroot Docker + containers
✓ 可移植性 ✓ 可移植性
✓ 以應用為中心 ✓ 以應用為中心
✓ 部件複用 ✓ 部件複用
✓ users的程式隔離 ✓ cgroups的程式隔離
✗ 沒有Docker daemon ✓ Docker remote API
✗ 沒有Dockerfiles ✓ Dockerfiles
✗ 總是不安全 安全逐步升級

pulldocker非daemon自包容的靜態二進位制是從Docker原始碼本身編譯來的,合併到主分支的請求在這裡。內建的VFS引擎是個很好的出發點,但它佔用了過多的空間來變得更加實用,所以我們建立了CVFS(壓縮的VFS)。比如,對於一個簡單的Ubuntu映象,VFS佔用了1.2GB,因為它各層儲存了幾乎整個映象的幾個版本。另一方面AUFS,僅僅使用了200MB來表示相同資料在各層間檔案系統的差異,CVFS使用了和AUFS同樣大小的空間,即使你的系統核心不支援聯合檔案系統。

我們是怎麼達到這樣的壓縮率呢?我們在檔案系統層重用了inodes。這樣做最簡單的不需修改核心的方法是使用硬連結,這就是CVFS現在的做法。對於2.0版本,我們正在調研,若系統支援寫時拷貝(正如VServer做的那樣),則在CVFS中自動支援(cp的--reflink選項)。


CVFS檔案系統驅動以最優的方式壓縮快取映像層,如果你僅僅是在掛載為可讀寫捲上執行不可變容器, 作為推薦,pulldocker具有一個只讀選項可以以只讀方式掛載chroot環境這樣它就不會再使用額外的空間,請隨意對多個不可變Docker應用chroot jail。

如果你的確需要在檔案系統上讀/寫(但你可能要冒損失資料的風險?)那麼這個chroot jail必須是整個檔案系統的完整拷貝,那麼到頭來你還是比寫時複製完整的檔案系統驅動(像AUFS或Btrfs)使用更多的空間。當然,如果你的核心支援這些檔案系統,那麼chroot同樣也可以(或許是在version 2.0).

如果你希望系統擁有相對高效的儲存機制,而你並不在乎核心、既有檔案系統及 root 許可權,那麼可以考慮 CVFS 的設計。當你的每臺計算機上執行少量映象或者磁碟空間充裕時,CVFS 是既快又好的選擇。其實對於 AUFS (Docker 預設的檔案系統)而言,如果存在大量的 layer,它會變得相當慢。為了讀取一個檔案,每次檔案訪問都潛在地訪問了每一個 layer(複雜度 O(layers))。根據提議,現在已經研發出了一個能提升其速度的 docker squash 補丁,但是對 layer 的壓縮合並使 AUFS 在磁碟空間利用上的優勢灰飛煙滅。

      

(最終,CVFS 被設計成為只對 pulldocker 有用的檔案系統驅動程式。為了得到作為儲存後端的主要 Docker 二進位制程式的完全支援,Docker 的 graph 驅動程式 API 需要做一些改進。)

我們就職於 Terminal.com,負責打造既快捷又簡單的強大工具軟體。各種創客都在用,包括富有經驗的後端工程師、諮詢師、資料科學家、生產型消費者以及愛好者。

我們多年從事 Linux 容器的相關工作。公測以來,上萬使用者在我們安全容器技術的幫助下,在雲端高速執行著我們的虛擬機器。你可以通過 pulldocker 在這些虛擬機器上使用 Docker 映象,由於有 root 許可權你還可以使用幾乎任何其他工具。

我們崇尚開源,接下來幾個月會發布更多既快捷又好用的強大工具,這些工具將助你更高效地完成任務,所以記得在 Twitter 上粉我們哦。

$> wget https://www.terminal.com/pulldocker.tgz -O pulldocker.tgz
$> sudo tar -xzf pulldocker.tgz -C /usr/bin/
$> sudo pulldocker busybox -o mybb
$> ls
mybb
$> sudo chroot mybb /bin/busybox | head -n1
BusyBox v1.22.1 (2014-05-22 23:22:11 UTC) multi-call binary.
介紹 Docker 的 pulldocker 和 CVFS原文請看這裡

推薦文章