Docker Runc容器生命周期详细介绍

 更新时间:2016年12月02日 15:33:58   作者:feilengcui008  
这篇文章主要介绍了Docker Runc容器生命周期详细介绍的相关资料,文章分析runc的容器生命周期的抽象、内部实现以及状态转换图。理解了runc的容器状态转换再对比理解docker client提供的容器操作命令的语义会更容易些

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状态
   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 ---------------------------|

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

相关文章

  • 让非root用户构建Docker镜像的三种方法

    让非root用户构建Docker镜像的三种方法

    在默认情况下,Docker 需要 root 权限或 sudo 才能运行,这对于日常开发和 CI/CD 流水线可能不够方便,那么,如何让 非 root 用户 也能构建和运行 Docker 容器呢?本篇文章将介绍 三种方法 来实现这一目标,需要的朋友可以参考下
    2025-04-04
  • Docker容器简单部署nginx过程解析

    Docker容器简单部署nginx过程解析

    这篇文章主要介绍了Docker容器简单部署nginx过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • docker镜像无法上传的解决方法

    docker镜像无法上传的解决方法

    大家都知道创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个。但是工作中却发现docker镜像怎么都无法上传,通过在网上查找资料终于解决了,下面将方法分享给大家,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-11-11
  • 如何修改docker容器中MySQL的用户密码

    如何修改docker容器中MySQL的用户密码

    本文主要介绍了如何修改docker容器中MySQL的用户密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Docker 镜像加速访问的几种方法

    Docker 镜像加速访问的几种方法

    本文介绍了DockerHub访问速度慢或不稳定时的替代方案,包括配置国内镜像源、使用一键脚本拉取镜像以及镜像导出与导入,感兴趣的可以了解一下
    2024-12-12
  • docker部署ES集群的实现

    docker部署ES集群的实现

    本文介绍了如何在Ubuntu20.04.2 LTS环境下通过Docker部署Elasticsearch7.10.1集群,详细步骤包括从Docker镜像仓库拉取Elasticsearch镜像,创建文件映射目录,运行Docker容器,配置Elasticsearch的端口和权限,以及集群的相关设置,感兴趣的可以了解一下
    2024-10-10
  • Docker安装Nacos容器并根据Nginx实现负载均衡

    Docker安装Nacos容器并根据Nginx实现负载均衡

    本文主要介绍了Docker安装Nacos容器并根据Nginx实现负载均衡,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • docker运行nginx绑定配置文件失败原因以及问题解决

    docker运行nginx绑定配置文件失败原因以及问题解决

    最近工作中在使用docker运行nginx的时候遇到了些问题,下面分享给大家,这篇文章主要给大家介绍了关于docker运行nginx绑定配置文件失败原因以及问题解决的相关资料,需要的朋友可以参考下
    2023-02-02
  • 使用Jenkins+docker打包部署后端服务的实现

    使用Jenkins+docker打包部署后端服务的实现

    本文主要介绍了使用Jenkins+docker打包部署后端服务的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Docker Memcached 容器化部署的实现

    Docker Memcached 容器化部署的实现

    memcached是一套分布式的高速缓存系统,本文主要介绍了Docker Memcached 容器化部署的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03

最新评论