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监控容器文件,监控容器事件。

容器从创建到启动的过程如下图:

原文地址:https://www.cnblogs.com/zh-dream/p/14998967.html