Docker 那些事儿:如何安全地停止、删除容器?

fd6f9a00ba25ea5fa9c546fbf7666ecb.gif

作者 | 飞向星的客机

来源 | CSDN博客

🌟 前言

本篇文章将会讲讲如何停止、删除容器和对容器进行资源限制。

a0b395fd85a62690e7a58ce9673b4356.png

停止和删除容器

🍑 停止容器

在工作中,有时会需要将容器暂停,例如,要为容器文件系统做一个快照时。使用 docker pause 与 docker unpause 命令可以对容器进行暂停与激活操作,并且暂停状态的容器不会占用宿主机 CPU 资源。

当不再需要业务运行时,就要将容器关闭,这时可以使用 docker stop 命令。当遇到特殊情况而无法关闭容器时,还可以使用 docker kill 命令强制终止容器,示例代码如下:

3e94bd51ae044e5f8d297c57e4ccdc37.png

以上示例使用 docker kill 命令强制终止了容器。

企业中通常有大量的容器需要操作,一个一个操作会浪费大量的人力及时间成本。在这种情况下,可以将 Docker 命令与正则表达式结合起来,实现对容器的批量操作。

首先查看运行状态容器的 ID 号,示例代码如下:

3a0f5d28b42d34dbd933de7966a7ad9e.png

接着使用 正则表达式 根据运行状态容器的 ID 号关闭正在运行的容器,示例代码如下:

54943e50da8d260afc19afcee1855fd8.png

以上示例运用 docker stop 命令与正则表达式批量终止了运行中的容器,该命令还有另一种编写方式,示例代码如下:

7aff71e581ba53a4e3c8a880e8bbd897.png

另外,使用类似方法还可以对容器进行批量删除、启动等操作。

docker stop 与 docker kill 的区别如下👇

  • docker stop 执行时,首先给容器发送一个TERM信号,让容器做一些退出前必须做的保护性、安全性操作,然后让容器自动停止运行,如果在一段时间内容器没有停止运行,再执行 kill -9 指令,强制终止容器。

  • docker kill 执行时,不论容器是什么状态,在运行什么程序,直接执行 kill -9 指令,强制终止容器。

🍑 删除容器

容器以其轻量级的特点受人欢迎,通常一些容器使用不久就会闲置,长期积累会导致不必要的资源浪费,所以要及时清理无用的容器。

docker rmi 命令不同,docker rm 命令用于删除容器,下面将介绍删除容器的几种方法。

🍇 删除容器方法一

首先,查看所有容器及其状态,示例代码如下:

dbd45480eb860d73d59559297ef86fe8.png

从以上示例中可以看到,目前宿主机中有三个处于终止状态的容器,以及一个处于运行状态的容器。

然后,结合正则与 docker rm 命令列出处于终止状态的容器并进行删除,示例代码如下:

68eda859015b499101f89cbfea20cf80.png

以上示例使用 docker rm 命令结合正则表达式实现了批量删除容器,并回显删除的容器 ID。

最后,查看并确认容器已删除,示例代码如下:

4f7b026ae24a086506744ace5c2ae491.png

从示例中可以看到,处于终止状态的容器已经被删除,运行状态的容器并没有被删除。

🍇 删除容器方法二

首先,查看所有容器及其状态,示例代码如下:

e28705ae90393c8e45cf5b1419dec1ba.png

从以上示例中可以看到,宿主机中有三个处于终止状态的容器,以及一个处于运行状态的容器。

接着,使用 docker rm 命令结合正则表达式列出所有容器 ID 号并删除容器,示例代码如下:

b571c184dc1af070907c84dc8f7acb9e.png

从以上示例中可以看到,命令的执行时发生了报错,提示无法删除一个正在运行的容器,可以使用 -f 参数强制执行。

然后,查看当前容器状态,示例代码如下:

62e55554c401110d2b67f656246016a0.png

上述示例中可以看到,docker rm 命令结合正则表达式删除了三个终止状态的容器,运行中的容器没有被删除。

最后,根据报错提示在命令中添加一个 -f 参数,表示强制删除,示例代码如下:

6e3ae6f81db18f63c274341235e7721d.png

从以上示例中可以看到,处于运行状态中的容器已经被删除。

🍇 删除容器方法三

首先,查看当前容器及其状态,示例代码如下:

fd0d077067bcc3f26c3313bcb7813cf7.png

接着,使用 docker rm 命令结合 docker ps -q -f status=exited 命名筛选出处于终止状态的容器 ID 号,并删除容器,示例代码如下:

0623a8ab38ebab35c96b7ad9daca3285.png

上述示例中,命令已经执行成功。

最后,查看容器是否被删除,示例代码如下。

88543ce43ec8f76cc710abccf1557e01.png

上述示例中可以看到,处于终止状态的容器都已经被删除。

🍇 删除容器方法四

从 Docker1.13 版本开始,用户可以使用 docker container prune 命令删除处于终止状态的容器。

首先,查看当前容器及其状态,示例代码如下:

f25b3fcf1880e8078f9d914a5f97f88c.png

接着,使用命令开始删除所有处于终止状态的容器,示例代码如下:

d74294f6b06b77ddf7b8d54a019dd00d.png

从以上示例中可以看到,当 docker container prune 命令执行之后,系统会向用户发出警告信息,并询问是否要继续。

docker container prune 会直接删除所有处于终止状态的容器,为了防止用户的误操作,将有用的容器删除,命令执行时会有警告信息与询问信息。

这时,如果确认要删除,可输入 “y” ,否则,输入 “n” 即可阻止命令执行。示例删除了所有处于终止状态的容器,命令执行成功之后返回一个释放内存的值。

最后,查看当前容器及其状态,示例代码如下:

5cad7129b608ae2b060379553ac7f420.png

从以上示例中可以看到,处于终止状态的容器已经被删除,而处于运行状态的容器并没有受到影响。

fa24c00986615a29aacf3acf2881bc41.png

容器资源限制

在默认情况下,Docker 没有对容器进行硬件资源的限制。使用 Dcoker 运行容器时,一台主机上可能会运行成百上千个容器,这些容器虽然相互隔离,但是在底层使用着相同的 CPU、内存和 磁盘 等资源。

如果不对容器使用的资源进行限制,那么容器对宿主机资源的消耗可能导致其他容器或进程不能够正常运行,严重时可能导致服务完全不可用。

本节将介绍如何对容器配置 CPU、内存、Block IO 等资源的限制。

🍑 限制容器内存资源

在 Linux 服务器上,如果内核检测到没有足够的内存(Memory)来执行重要的系统功能,内核会提示OOME(Out of Memory Error,内存溢出)并开始终止进程以释放内存,这称为 OOM 操作。

任何进程都有可能被终止,包括 Docker 和其他重要的应用程序。如果终止了系统关键进程,可能导致整个系统瘫痪。

设置限制内存上限虽然能保护主机,但是也可能会导致容器里的服务运行不畅。如果为服务设置的内存上限太小,服务在正常工作时可能出现资源不足;

如果设置过大,则会因为调度器算法浪费内存。因此,合理的做法是遵循以下原则。

  1. 为应用做内存压力测试,了解正常业务需求下内存的使用情况,然后再进入生产环境。

  2. 限制容器的内存使用上限。

  3. 尽量保持主机的资源充足,一旦通过监控发现资源不足,就进行扩容或者对容器进行迁移。

  4. 内存资源充足的情况下,尽量不要使用 Swap(交换分区),Swap 的使用会导致内存计算变得复杂,对调度器造成压力。

下面介绍Docker启动参数中的内存限制参数。

  • -m,--memory

设置容器可使用的最大内存,最小值是4MB。

  • --memory-swap

设置容器可使用内存+Swap的最大值。

  • --memory-swapiness

默认情况下,用户可以设置一个0~100的值,代表允许内存与交换分区置换的比例。

  • --memory-reservation

设置一个内存使用的 soft limit(非强制性限制),如果 Docker 发现主机内存不足,会执行 OOM 操作。这个值必须小于 –memory 设置的值。

  • --kernel-memory

容器能够使用的内核内存的大小,最小值为 4MB。

  • --oom-kill-disable

设置是否在运行 OOM 时候终止容器进程。

宿主机会在内存不足时,随机关闭一些进程,而该参数会保护容器进程不被关闭。只有通过设置 -memory 限制容器内存,才可以使用该参数,否则容器会耗尽主机内存,而且导致主机应用被终止。

❗注:--memory-swap 只有在设置了 -memory 时才有意义。

使用 Swap 允许容器在耗尽所有可用的内存时,将多余的内存需求写入磁盘。两者的关系如表所示。

ae25a0e90be2ccddebeb7073f4d599c8.png

以上两个参数默认值都为 -1,即对容器使用 内存 和 Swap 没有限制。

下面使用 progrium/stress 镜像来介绍如何为容器分配内存,该容器可以模拟进行压力测试。示例代码如下:

67ad91f281773ebcda00c8a9a0eb3697.png

以上示例运行了一个容器,分配可用最大内存为 300MB,可用 Swap 为 100MB。

其中,–vm 1 参数表示启动一个内存工作线程

–vm-bytes 280M 参数表示每个线程分配 280MB 内存。

可以看到系统不断地给容器分配内存、释放内存,一直循环。由于使用的内存 380MB,在最大使用量(400MB)之内,容器正常运行。

下面测试内存使用超出限额的情况,实例代码如下:

83da26b4a19331d6c6dcf5e870c57449.png

从以上示例中可以看到,容器使用的内存超过了限额,容器里的进程被终止掉了,其中,signal 9 就是终止进程信号,最后容器退出。

如果在创建容器时仅指定 -m 参数,不设置 -memory-swap 参数,那么 -memory-swap 默认是 -m 的两倍,示例代码如下:

1b9ed14ae5200ca408a85dff449fa35f.png

在以上示例中,容器最多使用 100MB 内存和 100MB Swap。

🍑 限制容器CPU资源

主机上的进程会通过时间分片机制使用 CPU。CPU 用频率来量化,也就是每秒执行的运算次数。为容器限制 CPU 资源并不是改变 CPU 的频率,而是改变每个容器能使用的 CPU 时间片。

理想状态下,CPU 应该一直处于运算状态,并且进程的计算量不会超过 CPU 的处理能力。

Docker 允许用户为每个容器设置一个数字,代表容器的 CPU share(共享),默认情况下每个容器的 share 值是 1000。这个 share 值是相对的,本身并不能代表任何确定的意义。当主机上有多个容器运行时,每个容器占用的 CPU 时间比例为它的 share 值在总额中的比例。

例如,主机上有两个一直使用 CPU 的容器(为了方便理解,不考虑主机上运行的其他进程),其 CPU share 都为 1000,那么两个容器 CPU 使用率都是 50%;

如果把其中一个容器的 share 值设置为 500,那么两者 CPU 的使用比为 2:1;如果删除 share 值为 1000 的容器,剩下来容器的 CPU 使用率将会是 100%。

Docker 为容器设置 CPU 资源限制的参数是 -c 或 –cpu-shares,其值是一个整数。运行两个容器 test01 与 test02,并设置 CPU 权重,示例代码如下:

df80c2fa87da9917f5fc98a380ff75bd.png

以上示例中分别为 test01 与 test02 设置 CPU share 为 1000 与 2000。

接着,使用 docker stats 查看容器占用 CPU 情况,示例代码如下:

eef6629fc0fdb22e28ba69e2ffc130d2.png

从以上示例中可以看到,两个容器 CPU 的使用占比约为 2:1,与先前设置的 share 值相吻合。

此时将 share 值为 2000 的 test02 容器暂停,再来查看 CPU 使用情况,示例代码如下:

99241998d7b105d0a963aee3c0779645.png

设置 CPU 资源限制还可以使用 –cpuset-cpus 参数,它能够指定容器使用某一颗 CPU。这里使用 CPU 测试镜像 agileek/cpuset-test 进行测试,其功能是将 CPU 用满,示例代码如下:

e7286d633da6925e48b6e2d3bdb2784c.png

使用宿主机 top 命令查看 CPU 使用情况,可以看到 CPU1 已经被占满,而 CPU0 没有受到影响,如图所示:

960e1c0b0b4d6626f84b6d362bef0a32.png

🍑 限制容器 Block IO

Block IO 表示磁盘的读写,Docker 可以用配置 bps(每秒读写的数据量)和 iops(每秒读写的次数)的方式限制容器对磁盘读写的带宽。

下面介绍限制 bps 与 iops 的参数。

  • --device-read-bps

限制读某个设备的bps。

  • --device-write-bps

限制写某个设备的bps。

  • --device-read-iops

限制读某个设备的iops。

  • --device-write-iops

限制写某个设备的iops。

默认情况下,所有容器对磁盘读写的带宽是相同的,通过配置 -blkio-weight 参数的值(10-1000)可以指定容器 Block IO 的优先级。–blkio-weight 与 -cpu-shares 类似,默认值都是 500。

下面运行的两个容器 test01 与 test02,其中,test01 读写磁盘的带宽是 test02 的两倍。

999270abcea5f0690942e744ef99bd28.png

从以上示例中可以看到,容器 test01 的相对权重值是 800,而 test02 的相对权重值是 400,故 test01 读写磁盘的带宽是 test02 的两倍。

下面运行一个容器,限制其对 /dev/sda 写入的速率不高于 20MB/s。因为容器文件系统在宿主机的 /dev/sda 上,在容器中写文件相当于对宿主机的 /dev/sda 进行写入操作。

示例代码如下:

50c7a2e50d76a3fa38c010651af982d3.png

以上示例运行了一个 CentOS 容器,并限制其写 /dev/sda 的速率为 20MB/s。

下面通过命令查看该容器的写入速率,示例代码如下:

e9ff76f77083d24bc5dbc204c0ae8170.png

从以上示例中可以看到,设置了写入限制的容器,写入速率为 19.4MB/s,没有超过写入限制的 20MB/s。

作为对比,下面运行一个不限制写入速率的容器,示例代码如下:

b1947069e847e04f9531d9b86b499f50.png

以上示例中,一个不限制读写速率的容器,写入速率是 61.3MB/s。

其他参数使用方法与之类似,大家可以自己尝试做一下🤗。

4ac8d9bee6f4c64bca85b770f132dbfe.png

总结

这两篇文章通过大量的实验讲解了操作 Docker 容器的方法,包括进入、停止、删除容器等,以及容器各种状态之间如何转换;

最后介绍了 Docker 容器的资源限制,包括 限制内存、CPU、BLOCK IO 三种方法。

e7e5745f9796407aaa9411e17c879939.gif

往期推荐

在 Kubernetes 上执行 GitHub Actions 流水线作业

使用 nginx 轻松管理 kubernetes 资源文件

Redis 内存满了怎么办?这样置才正确!

实战 Kubectl 创建 Deployment 部署应用

56d3447bba2b1ea60db92d04e351bed7.gif

点分享

179ac0f5acc64ddbfacdd5925ff94f52.gif

点收藏

328f20854438f69c93a90b9475bcc93f.gif

点点赞

5a1e67d3cf553839a6397bda8dca7e28.gif

点在看

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

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

相关文章

独家专访阿里云存储负责人吴结生:我经历的三个重大决策

简介:云原生正在重新定义存储,而存储只是基础软件领域中的一环。本期 C 位面对面,我们有幸邀请到了阿里巴巴高级研究员,阿里云智能存储负责人吴结生(Jason Wu),他亲历了阿里云存储技术高速发展的…

梦想加:联合办公智能化之路

2018年梦想加携手阿里云,通过云服务器ECS进行弹性的资源调度,通过弹性伸缩从容应对突发性流量洪流,灵活启停应用环境降低资源成本。 创始人介绍 ​梦想加创始人兼CEO王晓鲁,1982年生于北京,连续创业者,200…

自己虚拟服务器都用json可以吗,vue+webpack项目中使用dev-server搭建虚拟服务器,请求json文件数据,实现前后台分离开发...

在项目开发中,前后台分离,做了假数据,项目使用vue2.0重构,后台也推到重来了,为了不耽误开发进程,我做了虚拟的数据请求,使用vue-cli脚手架搭建的项目文件中dev-server搭建虚拟api请求&#xff0…

如何检查 Linux 服务器的运行时间

作者 | 刘光录来源 | TIAPLinux 中的 uptime 用于查看系统启动后的运行时间。它是一个比较简单的 Linux 命令,可以不带参数直接运行:uptime这将显示一行输出,显示当前时间、正常运行时间(以天和小时为单位)、当前登录到…

宜创科技:低代码技术赋能企业数字化

数字科技的魅力就在于用技术赋能企业,助力企业成长,在阿里云创新中心平台上,也孵化出了一批低代码创业公司,宜创科技就是其中一家。 使命和愿景 宜创无代码的使命是,无代码技术赋能每一个企业数字化;愿景…

Apsara Stack 技术百科 | 边缘场景智能云化,让云无处不在

简介:在过去十年间,随着计算技术的发展和移动互联网的广泛普及,各行业对数据本地计算和智能分析的需求与日俱增,越来越多的应用场景被接入了终端设备,导致终端侧的数据陡然增长,中心节点的处理算力不堪重负…

大数据时代下,App数据隐私安全你真的了解么?

简介:你是否有过这样的经历:你和朋友聊天表达你近期想要购买某件商品,第二天当你打开某购物软件时,平台向你推送的商品正是你想要购买的;或者,你是否接到过陌生来电,他们准确的报出了你的名字和…

为什么数据流转是混合云的核心能力?

“数据”作为重要的企业“新资产”,如何在云时代下挖掘创新甚至创造利润,是企业数字化转型中需要思考和探索的问题。 数据流转能力让企业的数据在混合云中流动起来,为后续的创新提供了基础和保障。 作者 | 万博智云CTO 孙琦 自进入2010之后&a…

幻璃镜服务器维护中,【公告】丨幻璃镜6月1日维护更新说明

原标题:【公告】丨幻璃镜6月1日维护更新说明更新公告【幻璃镜】六一维护更新说明各位亲爱的小伙伴们有没有很期待六一的更新呢?小缃特别为大家整理了更新内容预告驭灵[芙谣]登场~因爱生恨的赤鱬族痴情少女你是否才是那个她真正应当追随侍奉的对象&#x…

慢sql治理经典案例分享

简介:菜鸟供应链金融慢sql治理已经有一段时间,自己负责的应用持续很长时间没有慢sql告警,现阶段在推进组内其他成员治理应用慢sql。这里把治理过程中的一些实践拿出来分享下。 作者 | 如期 来源 | 阿里技术公众号 菜鸟供应链金融慢sql治理已…

2022,你的团队距离持续部署还有多远?

简介:2022,你的团队距离持续部署还有多远?持续部署这个词我们经常听到,可是到底怎样才是做到了持续部署?如何才能做到持续部署?本文将为你逐层拆解持续部署的内涵和实施路径。 编者按:持续部署…

云原生时代,开发者应具备这5大能力

【CSDN 编者按】十年前,Netscape创始人、硅谷著名投资人马克安德森(Marc Andreessen)预言“软件正在吞噬世界”;数年后,软件里90%以上的代码都是开源代码,“开源正在吞噬软件”;如今&#xff0c…

庚顿数据:实时数据库赋能工业互联网

本期《看见新力量》采访了2021中国(湘潭)工业软件产业创新创业大赛全国总决赛季军——北京庚顿数据科技有限公司的总经理姚羽,一起来看看他们的实时数据库产品如何赋能工业互联网。 客户故事 自2007年8月成立以来,庚顿数据一直从事…

基因大数据:一面是科技,一面是责任

基因大数据,一面是科技,一面是责任。以基因科技为核心,为行业提供“存、传、算、用”全栈式解决方案,用数据智慧为精准医疗保驾护航。 客户故事 人和未来从创业初期到现在,阿里云一直伴随其成长,人和借助阿…

用数据库修改服务器的时间格式,如何查询数据库服务器的时间格式

如何查询数据库服务器的时间格式 内容精选换一换CDM支持文件类数据到表的迁移,本章节以OBS-->MySQL为例,介绍如何通过CDM将文件类数据迁移到表中。流程如下:创建CDM集群并绑定EIP创建MySQL连接创建OBS连接创建迁移作业已获取OBS的访问域名…

一条 shell 命令的阻塞与唤醒

作者 | 闪客来源 | CSDN博客新建一个非常简单的 info.txt 文件。name:flash age:28 language:java在命令行输入一条十分简单的命令。[rootlinux0.11] cat info.txt | wc -l 3这条命令的意思是读取刚刚的 info.txt 文件,输出它的行数。我们之前分析了一下 shell 进程…

21克:仅需3天,我们就用Quick BI搭建起数据驾驶舱

简介:数智化并不仅仅是大型企业才需要去思考的课题,而是摆在所有企业面前的一个可选项。借助Quick BI搭建的数据分析体系,21克实现了销售、财务、供应链等多部门业务的数据化支撑,从一份份本地化的Excel文件,到清晰美观…

新监管形势下的数据流通合规技术解最新探究 (连载一)

简介:新监管形式下,数据的合规合理应用和数据安全是大家密切关注和探讨的话题点,而DataTrust隐私增强计算平台,能在保障数据隐私及安全前提下完成多方数据联合分析、联合训练、联合预测,实现数据价值流通,本…

查看系统是否安装了ftp服务器上,linux查看是否安装了ftp服务器上

linux查看是否安装了ftp服务器上 内容精选换一换安装Tomcat时启动失败。请按如下步骤查找原因并处理:对于已安装Tools的Linux弹性云服务器,升级内核前,需先卸载Tools,否则存在如下风险:升级内核后,Linux弹性…

掌握 Dowanward API 的妙用,轻松拿捏 kubernetes 环境变量

作者 | 江小南来源 | 江小南和他的小伙伴们引言前两天,公司有个新同事愁眉苦脸,看起来心事重重,我去问他怎么回事,原来是有个需求犯了难:一次部署起四个pod,每个pod名称还不一样,怎么判断是哪个…