前言上一篇文章讲了容器的操作和启动:【Docker事】如何安全进入容器。
本文将延续上一篇,谈谈如何停止、删除和限制容器的资源。
1.停止和删除容器
停止容器工作。有时需要暂停容器,例如,拍摄容器文件系统的快照。Docker pause和docker pause命令可以用来暂停和激活容器,暂停的容器不会占用主机的CPU资源。
当不再需要该业务时,应该关闭容器,然后可以使用docker stop命令。在特殊情况下无法关闭容器时,也可以使用docker kill命令强制终止容器。
示例代码如下:
上面的例子使用docker kill命令强制终止容器。
企业往往有大量的集装箱要操作,一个操作就会浪费大量的人力和时间成本。在这种情况下,Docker命令可以结合正则表达式来实现对容器的批量操作。
首先,检查运行状态容器的ID号。示例代码如下:
然后根据运行容器的ID号使用正则表达式关闭运行容器。示例代码如下:
上面的例子使用docker stop命令和正则表达式来批量终止正在运行的容器。还有另一种方法来编写这个命令。示例代码如下:
此外,可以使用类似的方法批量删除和启动容器。
停靠站与停靠站的不同之处如下
当docker stop被执行时,它首先向容器发送一个TERM信号,使容器做一些退出前必须做的保护和安全操作,然后使容器自动停止运行。如果内部容器在一段时间内没有停止运行,就执行kill -9指令强制终止容器。执行docker kill时,不管容器是什么状态,运行什么程序,直接执行kill -9指令强制终止容器。
删除容器因其轻量级的特性而广受欢迎。通常有些容器使用后很快就会闲置,长期积累会导致不必要的资源浪费,所以需要及时清理无用的容器。
与docker rmi命令不同,docker rm命令用于删除容器。以下是一些删除容器的方法。
删除容器方法1首先,检查所有容器及其状态。示例代码如下:
从上面的例子可以看出,主机中目前有三个终止的容器和一个运行的容器。
然后,将正则化与docker rm命令结合起来,列出终止的容器并删除它们。示例代码如下:
上面的例子使用docker rm命令结合正则表达式批量删除容器,并回显删除的容器ID。
最后,检查并确认容器已被删除。示例代码如下:
从示例中可以看出,终止的容器已经被删除,但是运行的容器没有被删除。
删除容器方法2首先,检查所有容器及其状态。示例代码如下:
从上面的例子可以看出,主机中有三个终止的容器和一个运行的容器。
然后,使用docker rm命令结合正则表达式列出所有容器ID号并删除容器。示例代码如下:
从上面的例子可以看出,命令执行过程中出现了错误,表示无法删除正在运行的容器,可以使用-f参数强制执行。
然后,检查当前容器状态。示例代码如下:
从上面的例子可以看出,docker rm命令结合正则表达式删除了三个终止状态的容器,运行中的容器没有被删除。最后根据错误提示,在命令中添加一个-f参数,意思是强制删除。示例代码如下:
从上面的例子可以看出,处于运行状态的容器已经被删除了。
删除容器方法3首先,检查当前容器及其状态。示例代码如下:
然后,使用docker rm命令结合Docker PS -Q -F Status = existing naming筛选出终止的容器ID号,删除容器。
示例代码如下:
在上面的示例中,命令已经成功执行。
最后,检查容器是否已被删除。示例代码如下:
从上面的例子可以看出,所有终止的容器都被删除了。
删除容器的方法4从Docker版本1.13开始,用户可以使用docker container prune命令删除处于终止状态的容器。
首先,检查当前容器及其状态。示例代码如下:
然后,使用命令开始删除所有终止的容器。示例代码如下:
从上面的例子可以看出,docker容器prune命令执行后,系统会向用户发送警告信息,询问是否继续。
Docker容器清理将直接删除所有处于终止状态的容器。为了防止用户误操作,有用的容器会被删除。执行该命令时,会有警告消息和询问消息。
这时候如果确定要删除,可以输入& ldquo。y & rdquo否则,输入& ldquo。n & rdquo可以阻止命令执行。该示例删除所有处于终止状态的容器,并在成功执行命令后返回一个释放内存的值。
最后,检查当前容器及其状态。示例代码如下:
从上面的例子可以看出,终止的容器已经被删除,而运行的容器没有受到影响。
2.容器资源限制默认情况下,Docker不会限制容器的硬件资源。当使用Dcoker运行容器时,一台主机上可能会运行数百个容器。这些容器虽然相互隔离,但是在底层使用相同的CPU、内存、磁盘等资源。
如果容器使用的资源不受限制,容器对主机资源的消耗可能导致其他容器或进程无法正常运行,严重时可能导致服务完全不可用。
本节将描述如何为容器配置CPU、内存、块IO和其他资源的限制。
限制Linux服务器上的容器内存资源。如果内核检测到没有足够的内存来执行重要的系统功能,内核会提示OOME(内存不足错误),并开始终止进程来释放内存,这就是所谓的OOM操作。
任何进程都可以终止,包括Docker和其他重要的应用程序。如果系统的关键进程被终止,整个系统可能会瘫痪。
虽然限制内存限制可以保护主机,但也可能导致容器中的服务运行不佳。如果为服务设置的内存限制太小,服务正常工作时可能会耗尽资源;
如果设置太大,由于调度程序算法,内存将被浪费。因此,遵循以下原则是合理的。
对应用程序进行内存压力测试,了解正常业务需求下的内存使用情况,然后进入生产环境。限制容器的最大内存使用量。尽量保持主机资源充足。一旦通过监控发现资源不足,则扩展容量或迁移容器。内存足够的情况下,尽量不要用Swap(交换分区)。使用交换会使内存计算变得复杂,并给调度程序带来压力。下面介绍Docker启动参数中的内存限制参数。
-m,--内存
设置容器可以使用的最大内存,最小值为4MB。
--内存-交换
设置容器可以使用的最大内存+交换空间。
--内存-交换性
默认情况下,用户可以设置一个0~100的值,表示允许的内存与交换分区替换的比率。
--内存-预留
为内存使用设置一个软限制(非强制性限制)。如果Docker发现主机内存不足,就会执行OOM操作。该值必须小于& ndash由内存设置的值。
--内核1-内存
容器可以使用的内核内存量,最小为4MB。
--oom-kill-disable
设置在OOM运行时是否终止容器进程。当主机内存不足时,会随机关闭一些进程,这个参数会保护容器进程不被关闭。该参数只能通过设置-memory来限制容器的内存,否则容器会耗尽主机内存,导致主机应用程序终止。
注意:--内存-交换只有在设置了-内存的情况下才有意义。使用交换允许容器在所有可用内存耗尽时将多余的内存需求写入磁盘。它们之间的关系如下表所示。
以上两个参数的默认值是-1,即对于容器的内存和交换的使用没有限制。
下面的progrium/stress mirror用来描述如何为容器分配内存,可以模拟压力测试。
示例代码如下:
上面的例子运行一个容器,分配300MB的最大可用内存和100MB的可用交换空间。
其中& ndashVM参数1表示启动一个内存工作线程& ndashvm-bytes 280M参数表示每个线程分配280MB内存。可以看到系统一直在给容器分配内存,释放内存,一直在循环。由于使用的内存是380MB,容器在最大使用量(400MB)内正常运行。
以下测试内存使用超出了限制,示例代码如下:
从上面的例子可以看出,容器使用的内存超过了限制,容器中的进程被终止,其中信号9是终止进程的信号,最后容器退出。
如果在创建容器时只指定了-m参数,而没有设置-memory-swap参数,那么-memory-swap的默认值是-m的两倍,
示例代码如下:
在上面的例子中,容器使用了高达100MB的内存和100MB的交换空间。
限制容器CPU资源。主机上的进程将通过时间片机制使用CPU。用CPU频率量化,即每秒执行的运算次数。限制容器的CPU资源不是改变CPU的频率,而是改变每个容器可以使用的CPU时间片。
理想情况下,CPU应该一直处于运行状态,进程的计算量不会超过CPU的处理能力。
Docker允许用户为每个容器设置一个数字,代表容器的CPU份额。默认情况下,每个容器的共享值为1000。这个份额值是相对的,本身不代表任何确定的意义。当主机上运行多个容器时,每个容器占用CPU时间的比例就是其份额值在总量中的比例。
比如主机上有两个容器一直在使用CPU(为了方便理解,不考虑主机上运行的其他进程),它们的CPU份额都是1000,那么两个容器的CPU利用率都是50%;
如果其中一个容器的共享值设置为500,则两个容器的CPU使用率为2:1;如果删除共享值为1000的容器,剩余容器的CPU利用率将为100%。
Docker为容器设置CPU资源限制的参数是-c或& ndashCPU -股份,其值为整数。运行两个容器test01和test02,并设置CPU权重。
示例代码如下:
在上面的例子中,test01和test02的CPU份额分别设置为1000和2000。
然后,使用docker stats检查容器的CPU使用情况。示例代码如下:
从上面的例子可以看出,两个容器中CPU的使用比例约为2:1,与之前设置的份额值一致。
此时,暂停共享值为2000的test02容器,然后检查CPU使用情况。示例代码如下:
您也可以使用& ndash设置CPU资源限制。CPU use -CPU参数,可以指定容器使用的某个CPU。这里的CPU测试镜像Agile EK/CPU Test -Test是用来测试的,它的作用是用完CPU。
示例代码如下:
使用host top命令查看CPU使用情况,可以看到CPU1已经被占用,但是CPU0没有受到影响,如图:
限制容器块IOBlock IO意味着读写磁盘。Docker可以通过配置bps(每秒读写数据量)和iops(每秒读写次数)来限制容器读写磁盘的带宽。
下面描述了限制bps和iops的参数。
--设备-读取-bps
限制设备的bps。
--设备-写入-bps
限制设备的bps。
--设备-读取-iops
限制读取设备的iops。
--设备-写入-iops
限制写入设备的iops。
默认情况下,所有容器的磁盘读写带宽相同,可以通过配置-blkio-weight参数(10-1000)的值来指定容器块IO的优先级。& ndashblk io -权重类似于-CPU -份额,默认值为500。
下面两个容器test01和test02正在运行,其中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.3 MB/s。
3.总结这两篇文章,首先介绍如何获取Docker帮助手册;然后通过大量的实验,说明了操作Docker容器的方法,包括进入、停止、删除容器等。以及如何转换容器状态。最后介绍了Docker容器的资源限制,包括限制内存、CPU和块IO三种方法。
这就是这篇关于Docker如何安全地停止和删除容器的文章。关于Docker停止和删除容器内容的更多信息,请搜索主机频道zhujipindao之前的文章。或者继续浏览下面的相关文章。希望大家支持主机频道zhujipindao。以后多来com!
评论前必须登录!
注册