前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker 的生命周期

Docker 的生命周期

作者头像
博文视点Broadview
发布2020-06-11 14:52:43
1.5K0
发布2020-06-11 14:52:43
举报

在 Docker 体系结构中,最重要的组件有三个,分别是

  • Docker Daemon
  • Docker Image(镜像)
  • Docker Container(容器)

这三个组件中

Docker Daemon 是负责维护Docker 运行的守护进程,担负着资源管理、任务调度等多项功能。

Docker Image 则属于静态文件系统。

Docker Container 是基于Image真正提供应用服务的计算单元。

因此这三者的关系可以说是

Container 基于Image 被Daemon 创建和管理,来实现提供服务的功能。

也正因为Container 负责提供服务,所以处于核心位置。

因而当我们谈论到Docker 生命周期时,更多的指的是Docker Container 的生命周期。

下图展示了Docker Container 从创建到销毁的完整的生命周期。

Docker Container 的生命周期以创建为起点。Docker 创建一个容器有两种途径:Create 和Run。

这两个命令都会创建一个容器,但从图10-1 中可以看出,这两个命令最终的效果有所不同。使用Create 创建的容器状态为Stopped,而使用Run 创建的容器状态为Running。这是因为Create 命令只会创建此容器所需要的文件系统,而不会给其分配运行资源,也就是不会分配CPU、Memory、Network 和Process。只有在明确对此容器调用Start 命令之后,Docker Daemon 才会按照配置参数给其分配相应的运行资源,而这时此容器就会处于Running 状态。

Run 命令会连续调用Create 和Start 命令,对目标容器创建文件系统和分配运行资源。

从上图中也可以看出,容器会从Running 状态转换到Stopped 状态。此种状态转移分为两种情况:正常关闭和异常关闭。

正常关闭指的是用户调用Kill 命令或者Stop 命令,通过Docker Daemon 对正在运行的容器进行资源回收。经过Docker Daemon 的资源回收之后,此容器所有内存中的数据都会被销毁,但其文件系统仍然存在。此时的状态与使用Create 命令之后的效果相比,只是文件系统多了一部分数据。此后仍然可以通过Start 再度启动,将状态转换至Running 状态。

异常关闭发生的原因有很多,在实际运行当中主要有以下两种情况。

1

OOM(内存溢出)

为了保持主机环境和Docker 中各个容器的运行稳定性,Docker 在处理OOM 事件时采取了“熔断器”和“耐压舱”的处理机制。

如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发OOM 事件。例如,在容器当中,部署了一个python 脚本来统计文本中单词出现的频率。假设主机分配给此容器的内存上限为500MB,当脚本申请的内存大于500MB 时,此容器就会触发OOM 事件。而在这种情况下,此容器将会被强制关闭。

但需要注意的是,此时关闭容器的并非是Docker Daemon,而是宿主机操作系统。因为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核OOM 事件,因此最终是由宿主机内核来关闭这些进程,这就是“熔断器”机制。只要目标达到一个阀值就销毁它,以免情况恶化。

如果用户不想关闭这个容器,那么可以选择--oom-kill-disable 来禁用OOM-Killer。使用此参数时,仍需要注意,如果使用-m 设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于hung 状态,这种机制就是“耐压舱”。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。

如果用户使用了--oom-kill-disable,但也没有使用-m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大。

2

进程意外退出

每个容器内部都存在一个Init 进程,容器中其他所有进程都是此进程的子进程。一个容器运行不退出,表现在主机系统上面就是容器当中的Init 进程和其子进程处于运行状态。

如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至Init 进程也退出。当Init 进程退出时,也就代表着此容器被关闭。

与 OOM 不同,Docker 目前没有任何机制可以监测到此时的进程退出属于正常退出还是异常退出。

但无论是正常关闭还是异常关闭,此容器的状态都会转换到Stopped。当出现容器关闭情况时,Docker Daemon 会尝试再次重新将此容器由Stopped 状态转为Running 状态。当然不是所有的容器出现关闭时,都会有此待遇。只有设置了--restart 参数的容器,Docker Daemon 才会特别留意。

而在 Docker 容器的生命周期中,除了Running 态和Stopped 态之外,还有另外一种状态:Paused状态。处于此种状态的容器,看似存在却无法做任何事情。究其原因,是 Docker“剥夺”了此容器的CPU 资源。而其他资源,如Memory 资源、Network 资源等还保留未动。如此一来,失去了CPU资源的进程,是不会被主机内核系统所调度的,所以此容器就处于“冰封”状态。而为其解封的方式非常容易,重新赋予其CPU 资源就可以。

因此,一个容器完整的生命周期就是在Running→Paused→Stopped 三种状态之间相互转换。而是否具有运行资源就是区分容器状态的唯一标准。

归根结底,Docker 管理容器的过程就是Docker 重新分配主机资源的过程,而主掌资源分配大权的角色就是Docker Daemon。

相 关 图 书 《Docker全攻略》

一本作者多年使用Docker的经验集合

并提供了许多极具实战价值和深度的内容

张涛 编著2016年4月出版

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 博文视点Broadview 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档