docker组件介绍
docker
:dockerd
客户端工具dockerd
: 即docker daemon
,docker
守护进程containerd
: 工业级标准的容器运行时,主要功能:- 管理容器的生命周期(从创建容器到销毁容器)
- 拉取/推送容器镜像
- 存储管理(管理镜像及容器数据的存储)
- 调用
runC
运行容器(与runC
等容器运行时交互) - 管理容器网络接口及网络
ctr
:containerd
的客户端工具
runC
:runC
是一个符合OCI
规范的命令行工具,用来运行容器。
kubelet创建容器流程
运行时为docker时
kubelet
通过CRI
远程调用内部的dockershim
套接字(/var/run/dockershim.sock
)dockershim
远程调用dockerd
套接字(/var/run/docker.sock
)dockerd
守护进程调用containerd
守护进程套接字(/run/containerd/containerd.sock
)containerd
进程fork
出一个container-shim
进程,通过调用runc
命令行启动、管理容器,并作为容器进程的父进程。
+--------------------+
| |
| | CRI gRPC
| kubelet +-----+ +---------------+ +--------------+
| | | | | | |
| | | +---------------+ +--------------+ fork |container-shim +-----> container |
| +-------------+ | | | | +-------> | | |
| | | | | | | | +---------------+ +--------------+
| | A+<----+ | | | | runc(OCI)
| | dockershim | | dockerd | | containerd | +---------------+ +--------------+
| | +--------->B +------->C | | | | |
| | | | | | +------->container-shim +-----> container |
| | | | | | | | | | |
+------+-------------+ +---------------+ +--------------+ +---------------+ +--------------+
|
A:unix:///var/run/dockershim.sock +------> ......
C:/run/containerd/containerd.sock
B:/var/run/docker.sock
container-shim
有什么作用?
- 兼容多种
OCI
运行时:为了能够支持多种OCI Runtime
,containerd
内部使用containerd-shim
, 每启动一个容器都会创建一个新的containerd-shim
进程,指定容器ID
、Bundle
目录、运行时的二进制(比如runc
) - 作为容器进程的父进程:避免
containerd
进程意外退出导致所有容器进程退出。而containerd
进程又是所有containerd-shim
进程父进程- 在
containerd
运行的情况下,杀死containerd-shim
进程,容器进程会退出。 - 在
containerd
运行的情况下,杀死容器进程,conainerd-shim
进程主动退出,containerd
触发exit
事件以清理该容器。
- 在
进程关系
$ pstree 2762
containerd─┬─6*[containerd-shim─┬─sh───java───21*[{java}]]
│ └─9*[{containerd-shim}]]
├─6*[containerd-shim─┬─java───48*[{java}]]
│ └─9*[{containerd-shim}]]
├─163*[containerd-shim─┬─pause]
│ └─9*[{containerd-shim}]]
├─13*[containerd-shim─┬─redis-server───3*[{redis-server}]]
│ └─11*[{containerd-shim}]]
├─containerd-shim─┬─java───69*[{java}]
│ └─9*[{containerd-shim}]
└─577*[{containerd}]