Docker如何安全地停止和删除容器

目录
  • 前言
  • 1. 停止和删除容器
    • 停止容器
    • 删除容器
      • 删除容器方法一
      • 删除容器方法二
      • 删除容器方法三
      • 删除容器方法四
  • 2. 容器资源限制
    • 限制容器内存资源
    • 限制容器CPU资源
    • 限制容器 Block IO
  • 3. 总结

前言

上一篇文章讲了容器的运行启动:【Docker 那些事儿】如何安全地进入到容器内部

本篇文章将继续承接上一篇,讲讲如何 停止、删除容器对容器进行资源限制

1. 停止和删除容器

停止容器

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

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

示例代码如下:

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

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

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

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

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

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

docker stop 与 docker kill 的区别如下

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

删除容器

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

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

删除容器方法一

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

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

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

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

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

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

删除容器方法二

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

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

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

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

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

上述示例中可以看到,docker rm 命令结合正则表达式删除了三个终止状态的容器,运行中的容器没有被删除。
最后,根据报错提示在命令中添加一个 -f 参数,表示强制删除,示例代码如下:

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

删除容器方法三

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

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

示例代码如下:

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

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

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

删除容器方法四

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

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

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

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

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

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

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

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

2. 容器资源限制

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

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

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

限制容器内存资源

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

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

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

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

  • 为应用做内存压力测试,了解正常业务需求下内存的使用情况,然后再进入生产环境。
  • 限制容器的内存使用上限。
  • 尽量保持主机的资源充足,一旦通过监控发现资源不足,就进行扩容或者对容器进行迁移。
  • 内存资源充足的情况下,尽量不要使用 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 允许容器在耗尽所有可用的内存时,将多余的内存需求写入磁盘。两者的关系如表所示。

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

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

示例代码如下:

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

其中,–vm 1 参数表示启动一个内存工作线程
–vm-bytes 280M 参数表示每个线程分配 280MB 内存。
可以看到系统不断地给容器分配内存、释放内存,一直循环。由于使用的内存 380MB,在最大使用量(400MB)之内,容器正常运行。

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

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

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

示例代码如下:

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

限制容器CPU资源

主机上的进程会通过时间分片机制使用 CPUCPU 用频率来量化,也就是每秒执行的运算次数。为容器限制 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,其值是一个整数。运行两个容器 test01test02,并设置 CPU 权重,

示例代码如下:

以上示例中分别为 test01test02 设置 CPU share10002000

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

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

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

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

示例代码如下:

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

限制容器 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

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

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

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

示例代码如下:

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

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

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

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

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

3. 总结

这两篇文章,首先介绍了如何获取 Docker 帮助手册;然后通过大量的实验讲解了操作 Docker 容器的方法,包括进入、停止、删除容器等,以及容器各种状态之间如何转换;
最后介绍了 Docker 容器的资源限制,包括 限制内存CPUBLOCK IO 三种方法。

到此这篇关于Docker如何安全地停止和删除容器的文章就介绍到这了,更多相关Docker 停止删除容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker stop停止/remove删除所有容器

    本文主要介绍了Docker stop停止/remove删除所有容器,分享给大家,具体如下: $ docker ps // 查看所有正在运行容器 $ docker stop containerId // containerId 是容器的ID $ docker ps -a // 查看所有容器 $ docker ps -a -q // 查看所有容器ID $ docker stop $(docker ps -a -q) // stop停止所有容器 $ docker rm $(docker ps -a -

  • Docker 无法停止或删除容器服务问题的解决方案

    前言 今天有开发同学给我反馈说有一个容器服务无法 stop.rm(docker rm -f)和 kill 等操作,也就是说这个容器服务无法终止- 操作步骤 (1)执行删除命令无法删除docker的目录: # ll /var/lib/docker/containers | grep caf8ef20f3c1 # cd /var/lib/docker/containers # rm -rf caf8ef20f3c1c78f03a5844ee23abc1d7e44246f242292040f1ef28

  • 删除docker里建立容器的操作方法

    怎么删除docker里建立的容器 1.首先使用docker -s -a命令列出所有容器 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f2582758af13 ubuntu "/bin/bash" 2 hours ago Up 2 hours first_ubuntu 6b5b5a969241 centos "/bin/bash" 2 days ago Exited (0)

  • Docker容器无法停止删除的解决方案

    查找运行的容器id docker ps 查找上面容器的物理位置 cd /var/lib/docker/container ls -a #此处会显示所有容器的id,找出上面那个无法停止删除的id(8位) 先停止docker服务 service docker stop 删除物理容器 rm -rf /var/lib/docker/container/{上面找到的id} 重启docker服务 service docker start 补充:Docker 退出容器不停止容器运行 并重新进入正在运行的容器

  • Docker 技巧之删除Docker容器和镜像

    公司业务在生产环境100多台服务器上用了docker,已经有大半年了,可是最近发现,每个服务器上的各种镜像好多好乱,就想批量删除镜像,需要的来看一下把. 删除所有未运行 Docker 容器 docker rm $(docker ps -a -q) 删除所有 Docker 镜像 删除所有未打 tag 的镜像 docker rmi $(docker images -q | awk '/^<none>/ { print $3 }') 删除所有镜像 docker rmi $(docker images

  • Linux上创建、列出、删除Docker容器方法总结

    1.启动Docker容器 使用下面的命令启动新的Docker容器.这将启动一个新的容器,并为你提供使用/bin/bash shell访问该容器的权限. # docker run [OPTIONS] <IMAGE NAME> [COMMAND] [ARG...] 例如,下面的命令将使用名为"ubuntu"的图像创建新的docker容器.要列出所有可用图像,请使用docker images命令. # docker run -i -t ubuntu /bin/bash 要退出Do

  • Docker学习笔记之容器查看启动终止删除的方法

    本文介绍了Docker学习笔记之容器查看启动终止删除的方法,分享给大家,具体如下: 查看 docker ps 主要有些参数要说一下 1. 不加参数,表示查看当前正在运行的容器 2. -a,查看所有容器包括停止状态的容器 3. -l,查看最新创建的容器 4. -n=x,查看最后创建的x个容器 列一下docker ps的结果 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 这些分别代表什么 CONTAINER ID:容器ID,唯一标识容器

  • 如何批量删除Docker中已经停止的容器的几种方法

    目录 方法一: 方法二: 方法三: 方法四: 附图: 方法一: #显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID, sudo docker ps -a|grep Exited|awk '{print $1}' #查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器 sudo docker rm `docker ps -a|grep Exited|awk '{print $1}'` 方法二: #删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)

  • Docker如何安全地停止和删除容器

    目录 前言 1. 停止和删除容器 停止容器 删除容器 删除容器方法一 删除容器方法二 删除容器方法三 删除容器方法四 2. 容器资源限制 限制容器内存资源 限制容器CPU资源 限制容器 Block IO 3. 总结 前言 上一篇文章讲了容器的运行启动:[Docker 那些事儿]如何安全地进入到容器内部 本篇文章将继续承接上一篇,讲讲如何 停止.删除容器 和 对容器进行资源限制 1. 停止和删除容器 停止容器 在工作中,有时会需要将容器暂停,例如,要为容器文件系统做一个快照时.使用 docker

  • 使用 Docker Compose 构建复杂的多容器 App的方法

    目录 1 为什么需要 Docker Compose 2 什么是 Docker Compose 3 Docker Compose 的使用 3.1 启动容器 3.2 停止并删除容器 1 为什么需要 Docker Compose 在构建容器过程中,一般需要重复运行一些命令, 如 docker build ,docker run 等等,这些命令有时冗长而复杂,逐个重复运行这些命令十分繁琐,对于多容器的复杂应用尤其如此.使用 Docker Compose 工具能极大地简化容器的创建.管理和维护. 2 什么

  • Docker如何安全地进入到容器内部

    目录 前言 1. 容器运行 自动重启的容器 自定义名称的容器 开启端口的容器 与宿主机共享目录的容器 2. 进入容器 2.1 容器的三种状态 2.2 docker attach与docker exec 前言 镜像是构建容器的蓝图,Docker 以镜像为模板,构建出容器. 容器在镜像的基础上被构建,也在镜像的基础上运行,容器依赖于镜像. 本文将对 容器的运行 及相关内容进行详细讲解. 1. 容器运行 在 Docker 官方网站可以查询与 Docker 相关的资料以及帮助手册,但是内容都是英文的,可

  • docker多容器操作与强制删除容器的方法步骤

    目录 简介: 1.创建多个容器 2.停止多个容器 3.删除多个容器 4.强制删除容器 总结 简介: 这是一篇有关[doker的多容器操作和强制删除容器的方法]的文章,用最精简的语言去表达给前端读者们. 1.创建多个容器 在WIndows环境下我们来作这个,先打开三个PowerShell窗口,然后在每个窗口中输入创建容器的命令,这里以Nginx镜像为例 docker container run nginx 然后再重新打开一个PowerShell窗口,输入查看命令,查看已经开启的容器. docker

  • docker连接spring boot和mysql容器方法介绍

    在之前使用docker部署运行了Spring Boot的小例子,但是没有使用数据库.在这一篇中,介绍docker如何启动mysql容器,以及如何将Spring Boot容器与mysql容器连接起来运行. docker基本命令 首先熟悉一下在操作过程中常用的docker基本命令: docker images:列出所有docker镜像 docker ps:列出所有运行中的容器,-a参数可以列出所有容器,包括停止的 docker stop container_id:停止容器 docker start

  • Docker部署Mysql,.Net6,Sqlserver等容器

    Centos8安装Docker 1.更新一下yum [root@VM-24-9-centos ~]# yum -y update 2.安装containerd.io # centos8默认使用podman代替docker,所以需要containerd.io [root@VM-24-9-centos ~]# yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2

  • 使用docker创建和运行跨平台的容器化mssql数据库

    目录 1.开启虚拟化服务 2.安装Docker desktop 3.部署本地mssql数据库 3.另外也能在Docker Desktop-Container查看刚刚创建的容器 4.使用VS验证 我们一般启用sql server数据库要么选择安装SQL Server实例和管理工具(SSMS),要么用vs自带的数据库.如今net跨平台成为趋势,今天给大家介绍另一种我最近在玩的方式,即使用docker创建并启用sql数据库. 本章介绍了在window10专业版下如何利用docker创建mssql数据库

随机推荐