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 阅读(308) 评论(0) 收藏 举报
浙公网安备 33010602011771号