小知识:Docker Runc容器生命周期详细介绍

Docker Runc容器生命周期

容器的生命周期涉及到内部的程序实现和面向用户的命令行界面,runc内部容器状态转换操作、runc命令的参数定义的操作、docker client定义的容器操作是不同的,比如对于docker client的create来说,

语义和runc就完全不同,这一篇文章分析runc的容器生命周期的抽象、内部实现以及状态转换图。理解了runc的容器状态转换再对比理解docker client提供的容器操作命令的语义会更容易些。

容器生命周期相关接口

最基本的required的接口 Start: 初始化容器环境并启动一个init进程,或者加入已有容器的namespace并启动一个setns进程;执行postStart hook; 阻塞在init管道的写端,用户发信号替换执行真正的命令 Exec: 读init管道,通知init进程或者setns进程继续往下执行 Run: Start + Exec的组合 Signal: 向容器内init进程发信号 Destroy: 杀掉cgroups中的进程,删除cgroups对应的path,运行postStop的hook 其他 Set: 更新容器的配置信息,比如修改cgroups resize等 Config: 获取容器的配置信息 State: 获取容器的状态信息 Status: 获取容器的当前运行状态: created、running、pausing、paused、stopped Processes: 返回容器内所有进程的列表 Stats: 容器内的cgroups统计信息 对于linux容器定义并实现了特有的功能接口 Pause: free容器中的所有进程 Resume: thaw容器内的所有进程 Checkpoint: criu checkpoint Restore: criu restore

接口在内部的实现

对于Start/Run/Exec的接口是作为不同os环境下的标准接口对开发者暴露,接口在内部的实现有很多重复的部分可以统一,因此内部的接口实际上更简洁,这里以linux容器为例说明 对于Start/Run/Exec在内部实现实际上只用到下面两个函数,通过传入flag(容器是否处于stopped状态)区分是创建容器的init进程还是创建进程的init进程 start: 创建init进程,如果status == stopped,则创建并执行newInitProcess,否则创建并执行newSetnsProcess,等待用户发送执行信号(等在管道写端上),用用户的命令替换掉 exec: 读管道,发送执行信号 Start直接使用start Run实际先使用start(doInit = true),然后exec Exec实际先使用start(doInit = false), 然后exec

对用户暴露的命令行参数与容器接口的对应关系,以linux容器为例

create -> Start(doInit = true) start -> Exec run -> Run(doInit = true) exec -> Run(doInit = false) kill -> Signal delete -> Signal and Destroy update -> Set state -> State events -> Stats ps -> Processes list linux specific pause -> Pause resume -> Resume checkpoint -> Checkpoint restore -> Restore

runc命令行的动作序列对容器状态机的影响

对于一个容器的生命周期来说,稳定状态有4个: stopped、created、running、paused 注意下面状态转换图中的动作是runc命令行参数动作,不是容器的接口动作,这里没考虑checkpoint相关的restore状态
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
delete
|——|  /————————————————————-|
|   | /                  |—– start —|     |
|   V /                   |        |     |
|———| ———– create ———-> |———|<———/     |
| stopped |                | created |————|    |
|———| <——– delete(with kill)— |———|      |    |
^  ^                      |       |    |
|  |                      |       |   run
|  |————— delete(-f with kill) —| exec      |    |
delete(-f with kill)               |  |       |    |
|                      |  |       |    |
|           resume        |  V       |    |
|———| —————————–> |———-|      |    |
| paused |                | running |<———-|——-|
|———| <—————————- |———-|      |
^           pause       ^    |      |
|                    |    |      |
|                    |–exec–|      |
|                               |
|————————— pause —————————|

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/feilengcui008/article/details/53410708

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:docker 镜像加速CentOS7详细介绍

2023-4-20 17:09:01

建站知识

小知识:Docker 容器文件系统详细介绍(图文)

2023-4-20 17:31:01

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索