Docker 組件基本介紹
Docker Cli
供用戶使用的命令行工具,負(fù)責(zé)請(qǐng)求 docker API 與 dockerd 交互,使得用戶可以便捷友好的操作 docker。
Dockerd
監(jiān)聽 Docker API 請(qǐng)求,通過(guò) containerd 管理 container 生命周期。
dockerd 通過(guò) unix、tcp、fd 三種類型方式來(lái)接收 API 請(qǐng)求。默認(rèn)的 unix socket 創(chuàng)建在 /var/run/docker.sock,啟動(dòng) dockerd 需要 root 權(quán)限或者 docker group 權(quán)限。
dockerd 在啟動(dòng)的時(shí)候會(huì)拉起 containerd,并與 containerd 保持通信。
$?ps?aux?|?grep?dockerd
/usr/bin/dockerd?-H?fd://?--containerd=/run/containerd/containerd.sock
Containerd
containerd 的主要職責(zé)是管理容器的生命周期,此外它還做:
鏡像的 pull&push管理 storage運(yùn)行容器的時(shí)候通過(guò) runc,并附帶上合適的參數(shù)管理網(wǎng)絡(luò)
containerd 包含一個(gè)暴露 gRPC API 的 daemon 服務(wù),這些 API 比較底層,為了被更好層調(diào)用,或者基于此做擴(kuò)展。Docker 有很好的分層機(jī)制,containerd 不會(huì)直接被用戶使用, 自己也是通過(guò) runc 去運(yùn)行容器。
containerd 擁有很強(qiáng)的適配性,其已是事實(shí)上的工業(yè)標(biāo)準(zhǔn)。containerd 通過(guò) UNIX socket 對(duì)外暴露 gRPC API 。通過(guò) containerd 的啟動(dòng)命令,可以很輕易的找到 sokcet 文件的具體位置。
$?ps?aux?|?grep?containerd
root?????19513??0.0??4.9?634988?93836??????????Ssl???2020???0:20?/usr/bin/dockerd?-H?fd://?--containerd=/run/containerd/containerd.sock
RunC
/usr/bin/docker-runc 可以視作 containerd 的一部分,它是一個(gè)運(yùn)行遵從 OCI 標(biāo)準(zhǔn)容器的二進(jìn)制工具。容器鏡像通過(guò) OCI 標(biāo)準(zhǔn)的格式打包,通常包括一個(gè) config.json 文件和系統(tǒng)根目錄。
$?tree?-L?2?.
.
├──?config.json
└──?rootfs
????├──?bin
????├──?boot
????├──?dev
????├──?docker-entrypoint.d
????├──?docker-entrypoint.sh
????├──?etc
????├──?home
????├──?lib
????├──?lib64
????├──?media
????├──?mnt
????├──?opt
????├──?proc
????├──?root
????├──?run
????├──?sbin
????├──?srv
????├──?sys
????├──?tmp
????├──?usr
????└──?var
21?directories,?2?files
config.json 文件具體都記錄了點(diǎn)什么呢?主要字段包括:
ociVersion遵從的 OCI 版本mounts掛載信息linux需要做隔離的 namespace...
containerd-shim
containerd-shim 的存在使得 container 可以脫離 containerd 獨(dú)立運(yùn)行。(默認(rèn)的,停掉 dockerd,container 也停止了,但可以通過(guò) daemon.json 配置實(shí)現(xiàn) dockerd 停掉后,container 照常運(yùn)行。)
作為 container 的父進(jìn)程,container-shim 主要負(fù)責(zé)如下職責(zé):
使得 runc 運(yùn)行完 container 后可以退出,無(wú)需為了一個(gè) container 開啟一個(gè) runtime 常駐進(jìn)程 保持容器的 stdio開啟狀態(tài),不至于容器寫stdio后收到SIGPIPE而退出把容器的 exit status 報(bào)告給 containerd
這些 docker 組件是如何協(xié)同工作的?
當(dāng)我們啟動(dòng) docker 后,dockerd 會(huì)默認(rèn)拉起 containerd
$?ps?fxa?|?grep?docker?-A?3
52660??????????Ssl????0:01?/usr/bin/dockerd
52666??????????Ssl????0:01??\_?docker-containerd?--config?/var/run/docker/containerd/containerd.toml
假使我們運(yùn)行一個(gè) container ,這時(shí)就會(huì)看到 containerd-shim
$?docker?run?-d?alpine?sleep?60
643b5259637ced4c0c41a830034ebfe411aa1bdfac23b1c1f57926d3a9e552f0
$?ps?fxa?|?grep?docker?-A?3
52660??????????Ssl????0:01?/usr/bin/dockerd
52666??????????Ssl????0:01??\_?docker-containerd?--config?/var/run/docker/containerd/containerd.toml
54038??????????Sl?????0:00??????\_?docker-containerd-shim?-namespace?moby?-workdir?/var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/643b5259637ced4c0c41a830034ebfe411aa1bdfac23b1c1f57926d3a9e552f0?-address?/var/run/docker/containerd/docker-containerd.sock?-containerd-binary?/usr/bin/docker-containerd?-runtime-root?/var/run/docker/runtime-runc
54052??????????Ss?????0:00??????????\_?sleep?60
調(diào)用順序是 dockerd --> containerd --> container-shim --> "sleep 60"
“原文鏈接:https://github.com/Wang-Kai/cherish-today/issues/145
”
?點(diǎn)擊屏末?|?閱讀原文?|?即刻學(xué)習(xí)
