天天看點

容器底層實作技術

對于容器的了解需要知道他的底層實作技術。

  • cfgroup:實作資源限額
  • namespace:實作資源隔離

cgroup

全稱:control group, linux作業系統通過cgroup設定程序使用CPU、記憶體和IO資源的限額。我們可以在

/sys/fs/cgroup/cpu/docker

下檢視。

這裡我們檢視了一個容器的cpu限額,它儲存的是–cpu-shares的配置,值為1024

容器底層實作技術

當然你還可以檢視block io以及memory記憶體的cgroup配置

容器底層實作技術
容器底層實作技術

namespace

每個容器中我們都可以檢視檔案系統、網卡等資源,這些資源就像是容器自己的一樣。例如網卡,我們檢視網卡資訊的時候,即使host上隻有一個網卡,但是每個容器都會認為自己有一個獨立的網卡。

實作這種方式的技術是namespace,它管理着host中全局唯一的資源,并可以讓每個容器都認為自己是唯一使用者。namespace能夠實作資源的隔離。

一共有6種namespace,對應6種資源

  • mount namespace:讓容器看上去擁有整個檔案系統,容器有自己的/目錄,可以執行mount和umount操作。
  • UTS namespace:讓容器擁有自己的hostname,預設情況下hostname是短id
  • IPC namespace:讓容器擁有自己的共享記憶體和信号量來實作程序通信,而不會與host的其他容器的ipc混在一起
  • PID namespace:容器在host上是以程序的形式進行的。可以通過

    ps axf

    來檢視容器程序。可以看到所有容器程序都是挂載在dockerd程序下,同時也可以看到容器自己的子程序。當我們進入到某一個容器中,可以看到它自己的程序。
    容器底層實作技術
    容器裡程序的pid不同于host中程序的pid,也就是說容器有自己的一套獨立的pid。
  • network namespace:讓容器擁有獨立的網卡、ip、路由等配置。
  • user namespace:讓容器能夠管理自己的使用者,host不能看到容器中建立的使用者。即你在容器中建立了一個使用者,在host上是查詢不到的。