docker进程
查看docker版本及进程树
[root@web1 ~]# yum -y install psmisc
查看docker版本信息
[root@web1 ~]# docker version Client: Docker Engine - Community Version: 20.10.7 API version: 1.41 Go version: go1.13.15 Git commit: f0df350 Built: Wed Jun 2 11:58:10 2021 OS/Arch: linux/amd64 Context: default Experimental: true
查看宿主机进程树
[root@web1 ~]# pstree -p 1 systemd(1)─┬─NetworkManager(525)─┬─{NetworkManager}(543) │ └─{NetworkManager}(545) ├─agetty(540) ├─auditd(39733)───{auditd}(39734) ├─chronyd(515) ├─containerd(39773)─┬─{containerd}(39777) │ ├─{containerd}(39778) │ ├─{containerd}(39779) │ ├─{containerd}(39780) │ ├─{containerd}(39781) │ ├─{containerd}(39782) │ ├─{containerd}(39785) │ └─{containerd}(39795) ├─crond(534) ├─dbus-daemon(511)───{dbus-daemon}(523) ├─dnsmasq(28219)───dnsmasq(28220) ├─dockerd(39784)─┬─{dockerd}(39786) │ ├─{dockerd}(39787) │ ├─{dockerd}(39788) │ ├─{dockerd}(39789) │ ├─{dockerd}(39790) │ ├─{dockerd}(39791) │ └─{dockerd}(39792) ├─lvmetad(24148)
18.06版本之前
[root@localhost ~]# pstree -p 1 systemd(1)─┬─NetworkManager(527)─┬─{NetworkManager}(544) │ └─{NetworkManager}(546) ├─agetty(543) ├─auditd(8213)───{auditd}(8214) ├─chronyd(518) ├─crond(535) ├─dbus-daemon(513)───{dbus-daemon}(525) ├─dockerd(8241)─┬─docker-containe(8247)─┬─{docker-containe}(8248) │ │ ├─{docker-containe}(8249) │ │ ├─{docker-containe}(8250) │ │ ├─{docker-containe}(8252) │ │ ├─{docker-containe}(8253) │ │ ├─{docker-containe}(8254) │ │ └─{docker-containe}(8255) │ ├─{dockerd}(8242) │ ├─{dockerd}(8243) │ ├─{dockerd}(8244) │ ├─{dockerd}(8245) │ ├─{dockerd}(8246) │ ├─{dockerd}(8256) │ ├─{dockerd}(8258) │ └─{dockerd}(8259)
docker的进程关系
[root@web1 ~]# ps -ef|egrep "docker|container" root 39773 1 0 04:31 ? 00:00:10 /usr/bin/containerd root 39784 1 0 04:31 ? 00:00:03 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock root 45191 39784 0 05:56 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 49153 -container-ip 172.17.0.2 -container-port 80 root 45195 39784 0 05:56 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 49153 -container-ip 172.17.0.2 -container-port 80 root 45206 1 0 05:56 ? 00:00:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 38c480501902a1491c2d734481737f0c2655f885854235390a6447a0d2f6b404 -address /run/containerd/containerd.sock
主要有以下4个进程
进程名 | 作用 |
dockerd(即daemon) |
被client直接访问,其父进程为宿主机的systemd守护进程。 daemon 的主要功能包括镜像管理、镜像构建、 REST API、身份验证、安全、核心网络以及编排。 |
docker-proxy |
实现容器通信,其父进程为dockerd |
containerd |
被dockerd进程调用以实现与runc交互。由runc创建容器 |
containerd-shim |
真正运行容器的载体,其父进程为containerd。实现无daemon容器的工具 (1)保持所有 STDIN 和 STDOUT 流是开启状态,从而当 daemon 重启的时候,容器不会因为管道(pipe)的关闭而终止。 (2)将容器的退出状态反馈给 daemon |
通信流程
- docker通过grpc和containerd模块通信(runc)交换,dockerd和containerd通信的socker文件:/run/containerd/containerd.sock
- containerd在dockerd启动时被启动,然后containerd启动grpc请求监听,containerd处理grpc请求,根据请求做相应动作。
- 若是创建容器,containerd拉起一个container-shim容器进程,并进行相应的创建操作。创建后的容器为runc的子进程,启动完毕后,runc退出。当runc退出后,containerd-shim进程就是容器的父进程
- container-shim被拉起后,start/exec/create拉起runC进程,通过exit、control文件和containerd通信,通过父子进程关系和SIGCHLD(信号)监控容器中进程状态。
在整个容器生命周期中,containerd通过epoll监控容器文件,监控容器事件。
容器从创建到启动的过程如下图:
posted on 2021-07-11 17:05 hopeless-dream 阅读(267) 评论(0) 编辑 收藏 举报