實現容器的底層技術 - 天天5分鐘玩轉 Docker 容器技術(30)

爲了更好地理解容器的特性,本節咱們將討論容器的底層實現技術。
cgroup 和 namespace 是最重要的兩種技術。cgroup 實現資源限額, namespace 實現資源隔離。docker

cgroup

cgroup 全稱 Control Group。Linux 操做系統經過 cgroup 能夠設置進程使用 CPU、內存 和 IO 資源的限額。相信你已經猜到了:前面咱們看到的--cpu-shares-m--device-write-bps 實際上就是在配置 cgroup。網絡

cgroup 到底長什麼樣子呢?咱們能夠在 /sys/fs/cgroup 中找到它。仍是用例子來講明,啓動一個容器,設置 --cpu-shares=512學習

138.png

查看容器的 ID:spa

在 /sys/fs/cgroup/cpu/docker 目錄中,Linux 會爲每一個容器建立一個 cgroup 目錄,以容器長ID 命名:操作系統

目錄中包含全部與 cpu 相關的 cgroup 配置,文件 cpu.shares 保存的就是 --cpu-shares 的配置,值爲 512。rest

一樣的,/sys/fs/cgroup/memory/docker 和 /sys/fs/cgroup/blkio/docker 中保存的是內存以及 Block IO 的 cgroup 配置。code

namespace

在每一個容器中,咱們均可以看到文件系統,網卡等資源,這些資源看上去是容器本身的。拿網卡來講,每一個容器都會認爲本身有一塊獨立的網卡,即便 host 上只有一塊物理網卡。這種方式很是好,它使得容器更像一個獨立的計算機。進程

Linux 實現這種方式的技術是 namespace。namespace 管理着 host 中全局惟一的資源,並可讓每一個容器都以爲只有本身在使用它。換句話說,namespace 實現了容器間資源的隔離內存

Linux 使用了六種 namespace,分別對應六種資源:Mount、UTS、IPC、PID、Network 和 User,下面咱們分別討論。資源

Mount namespace

Mount namespace 讓容器看上去擁有整個文件系統。

容器有本身的 / 目錄,能夠執行 mount 和 umount 命令。固然咱們知道這些操做只在當前容器中生效,不會影響到 host 和其餘容器。

UTS namespace

簡單的說,UTS namespace 讓容器有本身的 hostname。 默認狀況下,容器的 hostname 是它的短ID,能夠經過 -h 或 --hostname 參數設置。

IPC namespace

IPC namespace 讓容器擁有本身的共享內存和信號量(semaphore)來實現進程間通訊,而不會與 host 和其餘容器的 IPC 混在一塊兒。

PID namespace

咱們前面提到過,容器在 host 中以進程的形式運行。例如當前 host 中運行了兩個容器:

經過 ps axf 能夠查看容器進程:

全部容器的進程都掛在 dockerd 進程下,同時也能夠看到容器本身的子進程。 若是咱們進入到某個容器,ps 就只能看到本身的進程了:

並且進程的 PID 不一樣於 host 中對應進程的 PID,容器中 PID=1 的進程固然也不是 host 的 init 進程。也就是說:容器擁有本身獨立的一套 PID,這就是 PID namespace 提供的功能。

Network namespace

Network namespace 讓容器擁有本身獨立的網卡、IP、路由等資源。咱們會在後面網絡章節詳細討論。

User namespace

User namespace 讓容器可以管理本身的用戶,host 不能看到容器中建立的用戶。

在容器中建立了用戶 cloudman,但 host 中並不會建立相應的用戶。

小結

本章首先經過大量實驗學習了容器的各類操做以及容器狀態之間如何轉換,而後討論了限制容器使用 CPU、內存和 Block IO 的方法,最後學習了實現容器的底層技術:cgroup 和 namespace。

下面是容器的經常使用操做命令:

create      建立容器  

run         運行容器  

pause       暫停容器  

unpause     取消暫停繼續運行容器  

stop        發送 SIGTERM 中止容器  

kill        發送 SIGKILL 快速中止容器  

start       啓動容器  

restart     重啓容器  

attach      attach 到容器啓動進程的終端  

exec        在容器中啓動新進程,一般使用 "-it" 參數  

logs        顯示容器啓動進程的控制檯輸出,用 "-f" 持續打印  

rm          從磁盤中刪除容器


到這裏,咱們已經學習完了容器章節。下一節開始討論容器網絡。

二維碼+指紋.png

相關文章
相關標籤/搜索