當前位置:
首頁 > 知識 > 實現容器的底層技術-每天5分鐘玩轉 Docker 容器技術(30)

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

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

cgroup

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

cgroup 到底長什麼樣子呢?我們可以在 /sys/fs/cgroup 中找到它。還是用例子來說明,啟動一個容器,設置 --cpu-shares=512

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

查看容器的 ID:

在 /sys/fs/cgroup/cpu/docker 目錄中,Linux 會為每個容器創建一個 cgroup 目錄,以容器長ID 命名:

目錄中包含所有與 cpu 相關的 cgroup 配置,文件 cpu.shares 保存的就是 --cpu-shares的配置,值為 512。

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

namespace

在每個容器中,我們都可以看到文件系統,網卡等資源,這些資源看上去是容器自己的。拿網卡來說,每個容器都會認為自己有一塊獨立的網卡,即使 host 上只有一塊物理網卡。這種方式非常好,它使得容器更像一個獨立的計算機。

Linux 實現這種方式的技術是 namespace。namespace 管理著 host 中全局唯一的資源,並可以讓每個容器都覺得只有自己在使用它。換句話說,namespace 實現了容器間資源的隔離

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

Mount namespace

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

容器有自己的 /目錄,可以執行mountumount命令。當然我們知道這些操作只在當前容器中生效,不會影響到 host 和其他容器。

UTS namespace

簡單的說,UTS namespace 讓容器有自己的 hostname。 默認情況下,容器的 hostname 是它的短ID,可以通過 -h--hostname參數設置。

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

IPC namespace

IPC namespace 讓容器擁有自己的共享內存和信號量(semaphore)來實現進程間通信,而不會與 host 和其他容器的 IPC 混在一起。

PID namespace

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

通過 ps axf可以查看容器進程:

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

所有容器的進程都掛在 dockerd 進程下,同時也可以看到容器自己的子進程。 如果我們進入到某個容器,ps就只能看到自己的進程了:

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

而且進程的 PID 不同於 host 中對應進程的 PID,容器中 PID=1 的進程當然也不是 host 的 init 進程。也就是說:容器擁有自己獨立的一套 PID,這就是 PID namespace 提供的功能。

Network namespace

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

User namespace

User namespace 讓容器能夠管理自己的用戶,host 不能看到容器中創建的用戶。

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

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

小結

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

下面是容器的常用操作命令:

create 創建容器

run 運行容器

pause 暫停容器

unpause 取消暫停繼續運行容器

stop 發送 SIGTERM 停止容器

kill 發送 SIGKILL 快速停止容器

start 啟動容器

restart 重啟容器

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

exec 在容器中啟動新進程,通常使用 "-it" 參數

logs 顯示容器啟動進程的控制台輸出,用 "-f" 持續列印

rm 從磁碟中刪除容器

到這裡,我們已經學習完了容器章節。下一節開始討論容器網路。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

總結一下遇到的幾個sockaddr數據結構的用法-philarlala
如何用phpcms將靜態網頁生成動態網頁?
NetCore1.1+Linux部署初體驗

TAG:達人科技 |

您可能感興趣

用 ConfigMap 管理配置-每天5分鐘玩轉 Docker 容器技術
Python 容器使用的 5 個技巧和 2 個誤區
GopherChina 2018 區塊鏈+容器+Go底層實現
在 Scale Up 中使用 Health Check-每天5分鐘玩轉 Docker 容器技術
在Linux下使用Docker容器化技術搭建Web伺服器運行環境
安全公司發現,40000個K8s和Docker容器,資料庫暴露個人數據
岌岌可危:22000多個容器編排系統暴露在網上,如 Kubernetes、Docker Swarm……
re:Invent 2018:AWS Marketplace新增大量應用容器和IoT工具
後Kubernetes時代,2019的容器技術生態會發生些什麼?
Docker 容器十誡
IBM私有容器更新 支持Kubernetes 單集群執行1000個節點
Nvidia雲服務新增9個AI超算容器
紅帽以2.5億美元收購Google支持的容器初創公司CoreOS
Docker 容器使用
Kata Containers 開源項目走出實驗室 1.0 發布:「虛擬機與容器的混合體」
廈門大學Energ.Environ.Sci:用於高性能超級電容器的分子水平均勻的多孔聚苯胺/還原氧化石墨烯自組裝複合材料
特斯拉2.2億美元收購超級電容器開發商Maxwell 提升電池續航
容器在 2019 年必將碾壓 VMware!
Docker 容器連接
ofo 基於 K8S 容器雲平台的實踐