博客
关于我
docker进程分析
阅读量:80 次
发布时间:2019-02-26

本文共 1754 字,大约阅读时间需要 5 分钟。

序言

     闷热,无风。。。   

 

    很久没写技术文章,所以今天分析一下docker相关的进程。

容器相关的进程

    安装容器的时候,一句话就够了,yum -y install docker-ce,前提是配置好docker的yum源,但是有的时候配置好了源,总是会发现timeout,呵呵哒。。。尝试下阿里云的yum源。

640?wx_fmt=png

    安装完成docker之后,就会发现如上的文件,除去了相关的帮助文档,在其中可以看到,分为各种各样的二进制程序,docker表示为docker的客户端,一个命令行程序的使用;dockerd主要是服务端程序,在默认的情况下,客户端发送的请求都是由dockerd接收,而dockerd则是一个restfull的api接口;docker-containerd可以看出来包括三部分,一部分是客户端名称为ctr,一个是containerd用来提供grpc的接口,主要用来进行容器的管理,镜像的管理,存储和网络的管理,一个是containerd-shim,主要是用来运行容器的进程;而docker-runc则是容器的运行时,docker-proxy主要是来实现网络转发功能,docker-init看名字是初始化的意思,应该是初始化网络,生成相关的文件。

    在安装完成之后,启动docker服务如下:

640?wx_fmt=png

    启动完成之后,就看到生成文件,运行时文件,并且生成了一个桥接的网络接口。

640?wx_fmt=png

    容器的根目录主要用来存放一些镜像,网络配置情况,编译image的缓存,运行时环境,挂载的卷等元数据信息。

    在没有启动容器的时候,进程信息如下所示:

640?wx_fmt=png

    运行一个容器之后,进程信息如下所示:

640?wx_fmt=png

    进程与线程:

640?wx_fmt=png

    从进程的id可以看出来,dockerd生成了docker-containerd,docker-containerd生成了docker-containerd-shim,那么docker-runc去哪里了。。。

    1、 docker-runc是容器的运行时,专门用来做容器的创建,启动,停止,删除操作,当每次执行完毕之后,就会退出,容器的运行时已经成为标准,在docker-ce里面使用的runc,而在原来的版本中使用的lxc,其他的版本还有rkt等。

    2、 docker-containerd-shim主要是来负责容器的运行,并且用来向docker-containerd来汇报容器的状态,从而容器的状态数据不用存放在内存中,而每个容器都会使用一个docker-containerd-shim的进程来进行管理。

    3、 docker-containerd主要是用来负责容器生命周期的管理,镜像,存储,网络的管理,这个开放了一个grpc的接口,从而可以适配很多平台,上层可以直接调用,而dockerd则是一个具体的实现,其他还有lxd等。

    4、 dockerd主要是服务端程序,提供了restfull接口,可以使用curl直接访问

640?wx_fmt=png

    支持远程访问的时候,需要修改启动参数:

640?wx_fmt=png

    查看运行时环境:

640?wx_fmt=png

    为什么要使用docker-containerd-shim,主要是为了防止dockerd和containerd挂掉,也是为了热迁移做准备,如下杀掉containerd之后,依旧能访问容器的服务:

640?wx_fmt=png

    无法连接docker主机(也有可能是docker服务未启动):

640?wx_fmt=png

        

闲扯    

    当分析完这个进程之后,陷入了深深的沉思。。。分析这些进程有个毛的用。。。

640?wx_fmt=png

    查看服务是否启动,如果dockerd进程被杀,会被systemd自动拉起

640?wx_fmt=png

   

    如果带有实用性的目的去看这些进程,一点用处都没有,如果从了解原理的方面,倒是略有所获,从dockerd一个容器引擎分离出几个进程,containerd,shim,runc,除了标准化之外,也从另外一个方面说出了各个组件的专一职责原则,从而可以进行替换,并不怕一家公司进行垄断,另外在进行分层的时候,也表现了上层只是对下层的一层的封装,并提供额外的功能,例如dockerd提供了从registry上传和下载的作用,而containerd则是提供管理容器生命周期的功能,而runc则是从运行容器的工具。

    从标准化的指定上来说,无论runc的标准话还是image的标准化,总体的目标是弱依赖,只要提供相应的接口就可以提供服务,只要符合标准,那么就是可以运行的。

    

转载地址:http://igyk.baihongyu.com/

你可能感兴趣的文章
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>
Mysql中怎样设置指定ip远程访问连接
查看>>
mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
查看>>
Mysql中文乱码问题完美解决方案
查看>>
mysql中的 +号 和 CONCAT(str1,str2,...)
查看>>