上篇文章中我簡單介紹了如何使用Docker三劍客的知識,這篇文章我將簡單介紹下Docker涉及的一些其他知識抚笔,包括Docker的安全性機制扶认、Docker的底層原理實現(xiàn)等。
首先殊橙,簡單介紹下Docker的安全機制:
Docker的安全機制包含以下內(nèi)容:
Docker 容器和 LXC 容器很相似辐宾,所提供的安全特性也差不多。當(dāng)用 docker run 啟動一個容器時蛀柴,在后臺 Docker 為容器創(chuàng)建了一個獨立的命名空間和控制組集合螃概。命名空間提供了最基礎(chǔ)也是最直接的隔離,在容器中運行的進程不會被運行在主機上的進程和其它容器發(fā)現(xiàn)和作用鸽疾。
控制組是 Linux 容器機制的另外一個關(guān)鍵組件吊洼,負(fù)責(zé)實現(xiàn)資源的審計和限制。它提供了很多有用的特性制肮;以及確保各個容器可以公平地分享主機的內(nèi)存冒窍、CPU、磁盤 IO 等資源豺鼻;當(dāng)然综液,更重要的是,控制組確保了當(dāng)容器內(nèi)的資源使用產(chǎn)生壓力時不會連累主機系統(tǒng)儒飒。
運行一個容器或應(yīng)用程序的核心是通過 Docker 服務(wù)端谬莹。Docker 服務(wù)的運行目前需要 root 權(quán)限,因此其安全性十分關(guān)鍵桩了。
首先附帽,確保只有可信的用戶才可以訪問 Docker 服務(wù)。Docker 允許用戶在主機和容器間共享文件夾井誉,同時不需要限制容器的訪問權(quán)限蕉扮,這就容易讓容器突破資源限制。例如颗圣,惡意用戶啟動容器的時候?qū)⒅鳈C的根目錄/映射到容器的 /host 目錄中喳钟,那么容器理論上就可以對主機的文件系統(tǒng)進行任意修改了屁使。這聽起來很瘋狂?但是事實上幾乎所有虛擬化系統(tǒng)都允許類似的資源共享奔则,而沒法禁止用戶共享主機根文件系統(tǒng)到虛擬機系統(tǒng)蛮寂。
能力機制(Capability)是 Linux 內(nèi)核一個強大的特性,可以提供細(xì)粒度的權(quán)限訪問控制应狱。 Linux 內(nèi)核自 2.2 版本起就支持能力機制共郭,它將權(quán)限劃分為更加細(xì)粒度的操作能力,既可以作用在進程上疾呻,也可以作用在文件上除嘹。
例如,一個 Web 服務(wù)進程只需要綁定一個低于 1024 的端口的權(quán)限岸蜗,并不需要 root 權(quán)限尉咕。那么它只需要被授權(quán) net_bind_service 能力即可。此外璃岳,還有很多其他的類似能力來避免進程獲取 root 權(quán)限年缎。
其次,從基本架構(gòu)铃慷、命名空間单芜、控制組和聯(lián)合文件系統(tǒng)四個方面講一下Docker的底層技術(shù)實現(xiàn):
1、基本架構(gòu):
Docker 采用了 C/S 架構(gòu)犁柜,包括客戶端和服務(wù)端洲鸠。Docker 守護進程 (Daemon)作為服務(wù)端接受來自客戶端的請求,并處理這些請求(創(chuàng)建馋缅、運行扒腕、分發(fā)容器)。
客戶端和服務(wù)端既可以運行在一個機器上萤悴,也可通過 socket 或者 RESTful API 來進行通信瘾腰。
Docker 守護進程一般在宿主主機后臺運行,等待接收來自客戶端的消息覆履。
Docker 客戶端則為用戶提供一系列可執(zhí)行命令蹋盆,用戶用這些命令實現(xiàn)跟 Docker 守護進程交互。
2硝全、命名空間:
命名空間是 Linux 內(nèi)核一個強大的特性怪嫌。每個容器都有自己單獨的命名空間,運行在其中的應(yīng)用都像是在獨立的操作系統(tǒng)中運行一樣柳沙。命名空間保證了容器之間彼此互不影響。
pid 命名空間
不同用戶的進程就是通過 pid 命名空間隔離開的拌倍,且不同命名空間中可以有相同 pid赂鲤。所有的 LXC 進程在 Docker 中的父進程為 Docker 進程噪径,每個 LXC 進程具有不同的命名空間。同時由于允許嵌套数初,因此可以很方便的實現(xiàn)嵌套的 Docker 容器找爱。
net 命名空間
有了 pid 命名空間,每個命名空間中的 pid 能夠相互隔離泡孩,但是網(wǎng)絡(luò)端口還是共享 host 的端口车摄。網(wǎng)絡(luò)隔離是通過 net 命名空間實現(xiàn)的, 每個 net 命名空間有獨立的 網(wǎng)絡(luò)設(shè)備仑鸥,IP 地址吮播,路由表,/proc/net 目錄眼俊。這樣每個容器的網(wǎng)絡(luò)就能隔離開來意狠。Docker 默認(rèn)采用 veth 的方式,將容器中的虛擬網(wǎng)卡同 host 上的一 個Docker 網(wǎng)橋 docker0 連接在一起疮胖。
ipc 命名空間
容器中進程交互還是采用了 Linux 常見的進程間交互方法(interprocess communication - IPC)环戈, 包括信號量、消息隊列和共享內(nèi)存等澎灸。然而同 VM 不同的是院塞,容器的進程間交互實際上還是 host 上具有相同 pid 命名空間中的進程間交互,因此需要在 IPC 資源申請時加入命名空間信息性昭,每個 IPC 資源有一個唯一的 32 位 id拦止。
mnt 命名空間
類似 chroot,將一個進程放到一個特定的目錄執(zhí)行巩梢。mnt 命名空間允許不同命名空間的進程看到的文件結(jié)構(gòu)不同创泄,這樣每個命名空間 中的進程所看到的文件目錄就被隔離開了。同 chroot 不同括蝠,每個命名空間中的容器在 /proc/mounts 的信息只包含所在命名空間的 mount point鞠抑。
uts 命名空間
UTS("UNIX Time-sharing System") 命名空間允許每個容器擁有獨立的 hostname 和 domain name, 使其在網(wǎng)絡(luò)上可以被視作一個獨立的節(jié)點而非 主機上的一個進程忌警。
user 命名空間
每個容器可以有不同的用戶和組 id搁拙, 也就是說可以在容器內(nèi)用容器內(nèi)部的用戶執(zhí)行程序而非主機上的用戶
3、控制組
控制組(cgroups)是 Linux 內(nèi)核的一個特性法绵,主要用來對共享資源進行隔離箕速、限制、審計等朋譬。只有能控制分配到容器的資源盐茎,才能避免當(dāng)多個容器同時運行時的對系統(tǒng)資源的競爭。
控制組技術(shù)最早是由 Google 的程序員在 2006 年提出徙赢,Linux 內(nèi)核自 2.6.24 開始支持字柠。
控制組可以提供對容器的內(nèi)存探越、CPU、磁盤 IO 等資源的限制和審計管理窑业。
4钦幔、聯(lián)合文件系統(tǒng)
聯(lián)合文件系統(tǒng)(UnionFS)是一種分層、輕量級并且高性能的文件系統(tǒng)常柄,它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加鲤氢,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。
聯(lián)合文件系統(tǒng)是 Docker 鏡像的基礎(chǔ)西潘。鏡像可以通過分層來進行繼承卷玉,基于基礎(chǔ)鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像秸架。
另外揍庄,不同 Docker 容器就可以共享一些基礎(chǔ)的文件系統(tǒng)層,同時再加上自己獨有的改動層东抹,大大提高了存儲的效率蚂子。
Docker 中使用的 AUFS(AnotherUnionFS)就是一種聯(lián)合文件系統(tǒng)。 AUFS 支持為每一個成員目錄(類似 Git 的分支)設(shè)定只讀(readonly)缭黔、讀寫(readwrite)和寫出(whiteout-able)權(quán)限, 同時 AUFS 里有一個類似分層的概念, 對只讀權(quán)限的分支可以邏輯上進行增量地修改(不影響只讀部分的)食茎。
Docker 目前支持的聯(lián)合文件系統(tǒng)包括 OverlayFS, AUFS, Btrfs, VFS, ZFS 和 Device Mapper。
各 Linux 發(fā)行版 Docker 推薦使用的存儲驅(qū)動如下