四 docker 服务进程

通过查看 docker 进程,了解docker的运行及工作方式

4.1 containerd 进程关系

有四个进程: 
1> dockerd:被client(docker命令)直接访问,其父进程为宿主机的 systemd 守护进程。

2> docker-proxy:实现容器通信,生成iptables规则,其父进程为dockerd  
  有多少个容器就会有多少个docker-prox子进程,每个docker-proxy只为当前自己维护的容器来处理网络通信(管理iptables规则)
 

3> containerd:被dockerd进程调用以实现与runc交互。 
  在docker的启动文件中有一个sock文件,这个sock文件就是containerd的本机的sock文件,
  dockerd是基于这个sock文件调用的containerd服务以实现和runc的交互,创建容器等等

  containerd本身是一个单独的服务.但是他并不对外直接提供服务,而是由dockerd调用,
  docker命令调用dockerd服务,dockerd服务再用containerd来创建容器

4> containerd-shim:真正运行容器的载体,其父进程为containerd。  
  每起一个容器就会生成一个containerd-shim进程,进程中就会包装容器运行的目录结构或者说运行空间

4.2 containerd-shim 命令使用:

containerd-shim 命令也可以用来创建容器
容器的创建是由dockerd来调用containerd-shim来创建的

containerd-shim -h 
Usage of containerd-shim: 
  -address string 
     	grpc address back to main containerd   
  -containerd-binary containerd publish 
     	path to containerd binary (used for containerd publish) (default "containerd") 
  -criu string 
     	path to criu binary 
  -debug 
     	enable debug output in logs 
  -namespace string 
     	namespace that owns the shim 
  -runtime-root string 
     	root directory for the runtime (default "/run/containerd/runc")   
  -socket string 
     	abstract socket path to serve 
  -systemd-cgroup 
     	set runtime to use systemd-cgroup 
  -workdir string 
     	path used to storge large temporary data 

4.3 容器的创建与管理过程:

通信流程:  
1.dockerd通过grpc和containerd模块通信,通信目录的是为了实现runc的运行空间交换
  dockerd和containerd通信的socket文件:/run/containerd/containerd.sock。 
  dockerd在启动的时候会通过containerd.sock文件调用containerd,containerd再调用runc,通过runc创建和管理容器
 
2.containerd在dockerd启动时被启动,然后containerd启动grpc请求监听,containerd处理grpc请求,根据请求做相应动作。 
  /usr/bin/dockerd -H fd:// 
  --containerd=/run/containerd/containerd.sock 
  grpc: google开发的一款中立、开源的远程过程调用(RPC)系统,各个组件之间通过API相互调用的一个方式
 
3.若是创建容器,containerd拉起一个container-shim容器进程,并进行相应的创建操作(对容器进行初始化)。 
 
4.container-shim被拉起后,start/exec/create拉起runC进程,通过exit、control文件和containerd通信,
  通过父子进程关系和 SIGCHLD(信号)监控容器中进程状态。 
 
5.在整个容器生命周期中,containerd通过epoll监控容器文件,监控容器事件。 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QKEuyUix-1638600416326)(D:/%E6%8A%80%E6%9C%AF%E4%B9%A6%E7%B1%8D/K8s%E7%AC%94%E8%AE%B0/docker%E5%9F%BA%E7%A1%80/docker-image/docker-containerd.png)]

创建容器和访问容器都是先访问到dockerd,然后dockerd通过GRPC发送request请求给containerd(发送给containerd.sock文件,本地调用)
然后containerd收到以后,处理request请求,不同的消息会有不同的处理方式,如果要创建容器或者启动容器,他会调用shim进程。
然后拉起一个容器,拉起容器以后就会创建一个containerd-shim的进程,再调用runc进程,执行create/start/ex rc,将容器创建起来,成为容器以后,再将创建的结果,一步一步返回回来,这样容器就创建成功了

如果结果是发送respose返回回来的,要执行一些操作,containerd要和runc进行交互,然后再返回给dockerd

4.4 grpc 简介:

gRPC是Google开发的一款高性能、开源和通用的RPC框架,支持众多语言客户端。 

官网地址:
https://www.grpc.io/ 
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐