對于容器的了解需要知道他的底層實作技術。
- 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上是以程序的形式進行的。可以通過
來檢視容器程序。可以看到所有容器程序都是挂載在dockerd程序下,同時也可以看到容器自己的子程序。當我們進入到某一個容器中,可以看到它自己的程序。 容器裡程序的pid不同于host中程序的pid,也就是說容器有自己的一套獨立的pid。ps axf
- network namespace:讓容器擁有獨立的網卡、ip、路由等配置。
- user namespace:讓容器能夠管理自己的使用者,host不能看到容器中建立的使用者。即你在容器中建立了一個使用者,在host上是查詢不到的。