从 Docker 的信号机制看容器的优雅停止

cbf9cc46b17af13f57691b7f9a645e1b.gif

作者 | Addo Zhang

来源 | 云原生指北


有太多的文章介绍如何运行容器,然而如何停止容器的文章相对少很多。

根据运行的应用类型,应用的停止过程非常重要。如果应用要写文件,停止前要保证正确刷新数据并关闭文件;如果是 HTTP 服务,要确保停止前处理所有未完成的请求。

信号

信号是 Linux 内核与进程以及进程间通信的一种方式。针对每个信号进程都有个默认的动作,不过进程可以通过定义信号处理程序来覆盖默认的动作,除了 SIGSTOP 和 SIGKILL。二者都不能被捕获或重写,前者用来将进程暂停在当前状态,而后者则是从内核层面立即杀掉进程。

有两个比较重要的进程 SIGTERM 和 SIGKILLSIGTERM 是优雅地关闭命令,SIGKILL 则是暴力的关闭命令。比如 Docker,容器会先收到 SIGTERM 信号,10s 后会收到 SIGKILL 信号。

还有很多其他的信号,只是限定于特定的上下文。

中断

硬件的中断就像操作系统的信号。通常发生在硬件想要向操作系统注册事件时。操作系统必须立即停止运行,并处理中断。

比较常见的中断例子就是键盘中断,比如按下 ctrl+z 或者 ctrl+c。Linux 将其分别转换成 SIGTSTP 和 SIGINT。硬件中断过去通常用来处理键盘和鼠标输入,但如今被用作操作系统软件驱动层面的信号轮训。

Docker

前面说了这么多终于来到 Docker,容器的独特之处在于通常只运行一个进程。即使是单进程,容器内 PID 为 1 的进程也具有 init 系统的特殊规则和职责。

PID 1 在 Linux 中非常重要,通常是 init 进程。通常进程在收到 SIGTERM 信号后,假如不对信号进程处理,会快速退出。但 PID 1 的进程收到 SIGTERM 之后假如不对信号进行处理则什么都不会做

容器内 PID 1 通常有两种情况:shell 进程 PID 为 1 和你的进程 PID 为 1。分别对应着 shell 和 exec 格式的命令。

shell 格式

Dockerfile 有个特点,就是如果不使用 JSON 格式[1] 来指定容器命令,会通过 shell 以 fork 的形式来执行命令,也就是 /bin/sh -c

docker run(宿主机上)•/bin/sh -c(PID 1,容器内)•/loop.sh (PID 2,容器内)

这种格式的命令特点是不会向业务进程发送信号。比如发送给 shell 的 SIGTERM 信号不会转发给子进程,而是等待子进程的退出。唯一杀死容器的方式就是发送 SIGKILL 信号,或者碰巧子进程自己崩溃。

所以应该尽量避免使用这种方式,

exec 格式

这个就是 Dockerfile 的推荐语法了,你的进程会立即启动并作为容器的初始化进程,然后就有了下面的进程树:

docker run(宿主机上)•/loop.sh(PID 1,容器内)

说了这么多,很多人觉得不够直观。我们会用示例应用来进行说明,但在这之前简单说下如何发送信号来停止容器。

发送信号

有几种方式来停止容器。

docker stop

默认情况下 docker stop 命令会向容器发送 SIGTERM 信号,然后等待 10s,如果容器没停止再发送 SIGKILL 信号。

在 Dockerfile 中,可以通过 STOPSIGNAL 指令来设置默认的退出信号,比如 STOPSIGNAL SIGKILL 将退出信号设置为 SIGKILL。或者在 docker run 是通过 --stop-signal 参数来覆盖镜像中的 STOPSIGNAL 设置。

docker kill

默认情况下 docker kill 会直接杀死容器,不给容器任何机会进行优雅停止,这里发出的就是 SIGKILL 信号。

当然 docker kill 可以通过 --signal 来指定要发送的信号,类似 Linux 的 kill 命令:

docker kill ----signal=SIGTERM foo

docker rm -f

通常情况下 docker rm 用来删除已经停止的容器,但是加上 --force(简写 -f)会强制删除正在运行的容器。同样,也不会给容器任何优化停止的机会。

信号处理

我们使用一个简单的应用对 shell 和 exec 两种格式做下对比。在这个应用中,对 SIGTERM 进行处理:收到信号后退出。

#!/usr/bin/env sh
trap 'exit 0' SIGTERM
whiletrue;do:;done

接下来我们使用两种不同格式的 CMD 来构建镜像。

shell 格式

使用下面的 Dockerfile 来构建镜像 term。

FROM alpine:3.15.0
COPY loop.sh /
CMD /loop.sh

执行下面的命令构建镜像、启动容器、停止容器。

docker build -t term .
docker run --name term -d term
docker stop term

此时你会发现容器并没有立刻停止,而是大约 10s 之后才被停止。可以通过命令查看容器的退出状态:

docker inspect -f '{{.State.ExitCode}}' term
137

137 = 128 + 9 说明容器的退出信号是 SIGKILL

exec 格式

调整下 Dockerfile,将 CMD 修改为推荐的 JSON 格式:

FROM ubuntu:trusty
COPY loop.sh /
CMD ["/loop.sh"]

执行下面的命令构建镜像、启动容器、停止容器。(需要先执行 docker rm term 删除之前停止的容器)

docker build -t term .
docker run --name term -d term
docker stop term

此时容器会立刻退出。查看容器的退出状态:

docker inspect -f '{{.State.ExitCode}}' term
0

总结

docker rm -f 和 docker kill 干掉容器很容器,但是为了实现容器的优雅退出,应该使用 docker stop 命令,同时 Dockerfile 中应尽量避免使用 shell 格式设置 ENTRYPONT 或者 CMD

引用链接

[1] JSON 格式: https://docs.docker.com/engine/reference/builder/#run

2da8ca75ba63eebfc7d86ed697cc138c.gif

e7636af3bbd2f3eb7f444f79e7f1438a.png

往期推荐

云计算到底是谁发明的?

低代码发展专访系列之二:两年内会出现“现象级”地带吗产品吗?

低代码发展专访系列之一:低代码平台产品的使用者都是谁?

内容整理志愿者招募了!

51017e2deffe6aae7f1d9ab4d6b9f07c.gif

点分享

d7e34c8841812311f4830669b8698a37.gif

点收藏

8215a5774a9def0d90e6a7db11e5e8f0.gif

点点赞

34d3f9ef5ee7ee32517b44ef9dcc1875.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Arthas 排查开源 Excel 组件问题

简介: 有了实际的使用之后,不免会想到,Arthas 是如何做到在程序运行时,动态监测我们的代码的呢?带着这样的问题,我们一起来看下 Java Agent 技术实现原理。 背景介绍 ​ 项目中有使用到 com.github.dream…

如何选择python书籍_关于 Python 的经典入门书籍有哪些?

展开全部 关于Python,是最近最火最的编程语言e68a843231313335323631343130323136353331333365643631,挺多人都在学习的,关于它的入门书籍,我大概推荐以下几本: 首先我介绍的是《Python基础教程(第2版修订版)》&#x…

“融合、智能、绿色”施耐德电气线上工博以全生命周期解决方案助推数字化

原定于12月1-5日在上海举办的第23届中国国际工业博览会因为疫情再次延期。不必翘首等待,施耐德电气将以线上云展厅的形式如期与您见面,为工业用户呈现一场以“绿色智能制造,共塑可持续未来”为主题的云端盛宴。凭借在绿色智能制造领域的丰富实…

运维更简单、更智能,让运维人不再 “拼命”

简介: 云原生智能运维解决方案,利用大数据为企业日常运维服务,通过可观测数据,融合智能告警与响应中枢,结合机器学习的方法进一步解决自动化运维所未解决的问题,让运维更简单、更智能。 在90%的科幻片中 万…

python全栈马哥_马哥Python全栈+爬虫+高端自动化,资源教程下载

资源名称 马哥Python全栈爬虫高端自动化,资源教程下载 资源介绍 这套课程最后是有项目实战的,如项目四-多人博客开发、项目五CMDB资产管理、项目七-运维流程系统。 资源目录 01Python开班仪式及职业指导 02linux基础-1 03linux基础-2 04linux基础-3 05li…

从操作系统层面分析Java IO演进之路

简介: 本文从操作系统实际调用角度(以CentOS Linux release 7.5操作系统为示例),力求追根溯源看IO的每一步操作到底发生了什么。 作者 | 道坚 来源 | 阿里技术公众号 前言 本文从操作系统实际调用角度(以CentOS Linu…

教程系列——用模板快速上线一个HR 服务中心

简介: 【开箱即用的模板使用系列教程】将会手把手教给大家如何快速启用钉钉宜搭提供各类模板。今天第一讲,介绍《HR 服务中心》的模板启用。 【开箱即用的模板使用系列教程】将会手把手教给大家如何快速启用钉钉宜搭提供各类模板。今天第1讲,…

数字化“团险”黑科技,保险极客技术升级背后心经

作者 | 宋慧 出品 | CSDN 云计算 疫情之后,一切都在“内卷”,HR 也逃不过。初创公司想要招到优秀人才,除了对市场和未来发展的预期和潜力,提供补充医疗险也是对人才重要的保障。另外,现在补充医疗也是知名大企业高福利…

powershell快捷键_借助Windows Terminal搞一个花里胡哨的PowerShell终端

一提起PowerShell,命令提示符等等,想到的就是丑、难用,非常丑!各位可以先感受一下。不过,现在我们可以对它做一个美化,美化后的效果如下,各位也可以感受下(本人不提供背景图)下面做简单记录1、必…

【详谈 Delta Lake 】系列技术专题 之 特性(Features)

简介: 本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章。众所周知,Databricks 主导着开源大数据社区 Apache Spark、Delta Lake 以及 ML Flow 等众多热门技术,而 Delta Lake 作为数据湖核心存储引擎方案给企业带来…

深度解读畅捷通云原生架构转型实战历程

简介: 畅捷通公司是用友集团旗下的成员企业,专注于服务国内小微企业的财务和管理服务。一方面,畅捷通将自己的产品、业务、技术架构互联网化;另一方面,畅捷通推出了畅捷通一站式云服务平台,面向小微企业提供…

Apache Dubbo 3.0.0 正式发布 - 全面拥抱云原生

简介: 一个新的里程碑! 一、背景 自从 Apache Dubbo 在 2011 年开源以来,在一众大规模互联网、IT公司的实践中积累了大量经验后,Dubbo 凭借对 Java 用户友好、功能丰富、治理能力强等优点在过去取得了很大的成功,成为…

python关键字中文意思_python 字符串只保留汉字的方法

如下所示&#xff1a; def is_chinese(uchar): """判断一个unicode是否是汉字""" if uchar > u\u4e00 and uchar < u\u9fa5: return True else: return False def is_number(uchar): """判断一个unicode是否是数字"&q…

启明星辰集团DT总部落地杭州 数据绿洲版图驱动未来发展

12月1日&#xff0c;启明星辰集团DT&#xff08;数据时代&#xff09;总部正式落地于杭州高新区&#xff08;滨江&#xff09;&#xff0c;与北京IT总部形成南北两个总部基地新格局&#xff0c;并发布数据安全新版图--数据绿洲&#xff0c;将结合杭州领先的数字应用的场景&…

Quick BI的可视分析之路

简介&#xff1a; Quick BI是专为云上用户量身打造的智能数据分析和可视化BI产品&#xff0c;帮助企业快速完成从传统的数据分析到数据云化分析云化的转变&#xff0c;将企业的业务数据产出后以最快的速度被推送到各组织侧消费使用。本篇着重介绍Quick BI在可视化分析上的能力与…

火山引擎进军云市场,计划未来三年服务十万客户

12月2日&#xff0c;火山引擎在升级为字节跳动企业级技术服务业务板块之后&#xff0c;首次亮相就正式发布全系云产品&#xff0c;包括云基础、视频及内容分发、数据中台、开发中台、人工智能等五大类、共计78项服务。 火山引擎云产品是字节跳动“敏捷开发”技术实践的对外输出…

win7计算机右键属性桌面进程重启,win7计算机右键属性打不开怎么办

有用户在鼠标右击win7桌面计算机选择属性的时候却发现打不开属性窗口&#xff0c;出现这样的情况可能是只要修复一下注册表就可以解决了&#xff0c;那么要如何操作呢?下面是学习啦小编给大家整理的一些有关win7计算机右键属性打不开的解决方法&#xff0c;希望对大家有帮助!w…

看Quick Audience 如何有效提升营销活动管理效率

简介&#xff1a; 营销活动为Quick Audience&#xff08;QA&#xff09;用户洞察下的一个功能模块&#xff0c;通过这个模块&#xff0c;可以将QA侧生成的受众以及营销渠道全部关联起来&#xff0c;从营销活动的视角&#xff0c;一站式完成活动目标制定、活动计划制定到活动任务…

【产品动态】一文详细解读智能数据构建产品Dataphin的“规划”功能

简介&#xff1a; 数据中台是传统的数据仓库的一种升级, 是数据采集、建设、管理与使用的一整套体系&#xff0c;Dataphin是一个构建数据中台的强大工具, 核心优势是在数据的建设与管理上引入了阿里巴巴多年来数据中台建设沉淀出的OneModel方法论。 前言 数据中台是当下大数据…

库克“一语成谶”:又有 30 万台安卓设备被“感染”了!| 文末福利

整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;各家应用商店中的恶意软件总是层出不穷&#xff0c;哪怕是一向以“安全”著称的苹果&#xff0c;也不能完全杜绝 App Store 中恶意软件的乱入。但在这之中&#xff0c;作为“围墙花园”的苹果自认还是高…