段章 發表於 2025-12-24 08:50:35

Docker资源(CPU/内存/磁盘IO)限制全解析

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">前言</a></li><li><a href="#_label1">一、CPU资源控制</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1.1 设置CPU使用率上限</a></li><li><a href="#_lab2_1_1">1.2 设置CPU占用比(权重 --cpu-shares)</a></li><li><a href="#_lab2_1_2">1.3 绑定指定CPU(--cpuset-cpus)</a></li><li><a href="#_lab2_1_3">1.4 压力测试与验证示例(CPU)</a></li><li><a href="#_lab2_1_4">1.5 注意事项(CPU)</a></li></ul><li><a href="#_label2">二、内存使用限制</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_5">2.1 --memory 与 --memory-swap 规则</a></li><li><a href="#_lab2_2_6">2.2 示例命令</a></li><li><a href="#_lab2_2_7">2.3 验证与观察</a></li><li><a href="#_lab2_2_8">2.4 建议与注意</a></li></ul><li><a href="#_label3">三、磁盘IO(blkio/io)控制</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_9">3.1 常用Docker参数(blkio)</a></li><li><a href="#_lab2_3_10">3.2 验证(用dd测试写速)</a></li><li><a href="#_lab2_3_11">3.3 注意事项(blkio)</a></li></ul><li><a href="#_label4">四、清理Docker占用的磁盘空间</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_12">4.1 一键清理无用资源</a></li><li><a href="#_lab2_4_13">4.2 针对性清理</a></li><li><a href="#_lab2_4_14">4.3 预防建议</a></li></ul><li><a href="#_label5">五、常见命令速查(快速摘录)</a></li><ul class="second_class_ul"><li><a href="#_lab2_5_15">5.1 资源限制命令</a></li><li><a href="#_lab2_5_16">5.2 资源查看命令</a></li><li><a href="#_lab2_5_17">5.3 资源清理命令</a></li></ul><li><a href="#_label6">六、常见陷阱与建议</a></li><ul class="second_class_ul"><li><a href="#_lab2_6_18">6.1 常见陷阱</a></li><li><a href="#_lab2_6_19">6.2 实用建议</a></li></ul><li><a href="#_label7">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>前言</h2>
<p>在Docker容器化部署中,资源隔离与限制是保障系统稳定性的关键。若不对容器资源进行约束,单个容器可能因资源滥用耗尽主机资源,导致其他容器或主机服务崩溃。本文将从CPU、内存、磁盘IO三大核心资源入手,详细讲解Docker资源限制的参数配置、实操验证、注意事项,同时补充空间清理、命令速查与避坑指南,助力开发者高效管控容器资源。</p>
<p class="maodian"><a name="_label1"></a></p><h2>一、CPU资源控制</h2>
<p>Docker通过多种方式对容器CPU资源进行管控,可根据实际需求设置使用率上限、资源占用权重、绑定指定CPU核心等,实现CPU资源的精细化分配。</p>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1.1 设置CPU使用率上限</h3>
<p>通过 <code>--cpus</code> 参数可直接限制容器能使用的CPU核心数(支持小数),本质是控制CPU使用率上限。该参数直观易懂,是日常使用中最常用的CPU限制方式。</p>
<p><strong>语法示例</strong>:</p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name cpu-demo --cpus 1 nginx
</pre></div>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name cpu-demo-0.5 --cpus 0.5 nginx
</pre></div>
<p>原理:Docker通过CGroup的CPU配额机制实现,<code>--cpus 1</code> 表示容器在每个CPU周期(默认100ms)内最多可使用100ms的CPU时间,对应1个核心的满负载;<code>--cpus 0.5</code> 则表示每个周期最多使用50ms,对应单核心50%的使用率。</p>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>1.2 设置CPU占用比(权重 --cpu-shares)</h3>
<p><code>--cpu-shares</code> 参数用于设置容器间的CPU资源竞争权重(默认值1024),仅在多个容器同时竞争CPU资源时生效,非绝对限制。权重值越高,容器在资源竞争中获得的CPU时间片越多。</p>
<p><strong>语法示例</strong>:</p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name cpu-high --cpu-shares 2048 nginx
docker run -d --name cpu-low --cpu-shares 1024 nginx</pre></div>
<p>验证效果:当主机CPU资源紧张时,<code>cpu-high</code> 容器获得的CPU时间片约为 <code>cpu-low</code> 的2倍;若主机CPU资源充足,两个容器均可使用空闲CPU资源,权重限制不生效。因此,该参数适合对不同优先级容器进行资源分配(如核心业务容器设置更高权重)。</p>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>1.3 绑定指定CPU(--cpuset-cpus)</h3>
<p>通过 <code>--cpuset-cpus</code> 参数可将容器绑定到主机指定的CPU核心上,避免容器在多个核心间切换,减少上下文切换开销,同时精准控制容器使用的CPU资源范围。</p>
<p><strong>语法示例</strong>:</p>
<pre><strong>绑定到离散的CPU核心(如第0、1个核心)</strong>
</pre>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name cpu-bind --cpuset-cpus 0,1 nginx
</pre></div>
<p><strong>绑定到连续的CPU核心范围(如第0至3个核心)</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name cpu-bind-range --cpuset-cpus 0-3 nginx
</pre></div>
<p>适用场景:对CPU性能敏感的业务(如计算密集型应用),绑定核心可提升运行稳定性和效率;同时可避免关键容器与其他容器争抢核心资源。</p>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>1.4 压力测试与验证示例(CPU)</h3>
<p>使用 <code>stress</code> 工具对容器进行CPU压力测试,验证资源限制效果。首先拉取stress镜像,再通过容器运行压力测试命令,结合 <code>docker stats</code> 观察资源使用情况。</p>
<p><strong>实操步骤</strong>:</p>
<p>拉取 stress 镜像</p>
<div class="jb51code"><pre class="brush:bash;">docker pull progrium/stress
</pre></div>
<p>运行容器并限制 CPU 核心</p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name cpu-stress --cpus 1 progrium/stress -c 2
</pre></div>
<p>查看容器 CPU 使用情况</p>
<div class="jb51code"><pre class="brush:bash;">docker stats cpu-stress
</pre></div>
<p>预期结果:<code>docker stats</code> 显示容器CPU使用率稳定在100%左右(对应1个核心满负载),而非200%,说明CPU限制生效。</p>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>1.5 注意事项(CPU)</h3>
<ul><li><code>--cpus</code> 参数在Docker 1.13及以上版本支持,低版本需通过 <code>--cpu-period</code> 和 <code>--cpu-quota</code> 组合实现(周期默认100000us,配额=核心数&times;周期)。</li><li>绑定CPU核心时,需确保主机存在对应核心(可通过 <code>lscpu</code> 查看主机CPU信息),否则容器无法启动。</li><li>权重值仅在资源竞争时生效,无法保障容器最低CPU资源,若需最低保障,可结合 <code>--cpus</code> 和资源调度策略使用。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>二、内存使用限制</h2>
<p>Docker对容器内存的限制主要通过 <code>--memory</code> 和 <code>--memory-swap</code> 参数实现,可控制容器使用的物理内存上限及虚拟内存(内存+交换分区)上限,避免内存溢出导致主机崩溃。</p>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>2.1 --memory 与 --memory-swap 规则</h3>
<p><code>--memory</code>(简写 <code>-m</code>):限制容器可使用的物理内存上限,支持单位为b、k、m、g(如1024m=1g)。</p>
<p><code>--memory-swap</code>:限制容器可使用的虚拟内存上限(物理内存+交换分区),规则如下:</p>
<ul><li>若不指定<code>--memory-swap</code>,则默认虚拟内存上限为 <code>--memory</code> 的2倍(如 <code>-m 1g</code> 对应虚拟内存上限2g)。</li><li>若 <code>--memory-swap</code> 与 <code>--memory</code> 数值相同,则容器无法使用交换分区(仅能使用物理内存)。</li><li>若 <code>--memory-swap</code> 设置为 <code>-1</code>,则容器可使用无限虚拟内存(受主机交换分区大小限制)。</li></ul>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>2.2 示例命令</h3>
<p>限制容器内存的Docker命令示例</p>
<p>以下示例展示了如何通过<code>docker run</code>命令限制容器的物理内存和虚拟内存:</p>
<p><strong>限制容器物理内存1G,虚拟内存2G(默认规则)</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name mem-demo -m 1g nginx
</pre></div>
<p><strong>限制容器物理内存1G,禁止使用交换分区(虚拟内存=物理内存)</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name mem-no-swap -m 1g --memory-swap 1g nginx
</pre></div>
<p><strong>限制容器物理内存1G,虚拟内存上限3G</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name mem-swap -m 1g --memory-swap 3g nginx
</pre></div>
<p><strong>限制物理内存1G,允许使用无限虚拟内存</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name mem-unlimited-swap -m 1g --memory-swap -1 nginx
</pre></div>
<p>参数说明</p>
<ul><li><code>-m</code>或<code>--memory</code>:限制容器可用的物理内存(如<code>1g</code>表示1GB)。</li><li><code>--memory-swap</code>:限制容器可用的虚拟内存总量(物理内存+交换分区)。<ul><li>未设置时默认值为物理内存的2倍。</li><li>设置为与<code>-m</code>相同值时禁用交换分区。</li><li>设置为<code>-1</code>时允许无限使用交换分区(需宿主机支持)。</li></ul></li></ul>
<p class="maodian"><a name="_lab2_2_7"></a></p><h3>2.3 验证与观察</h3>
<p>通过 <code>docker stats</code> 可实时观察容器内存使用情况,也可进入容器内部通过 <code>free</code> 命令查看内存分配。</p>
<p><strong>实操示例</strong>:</p>
<p><strong>运行内存压力测试容器</strong></p>
<p>限制物理内存512MB并禁用交换分区,运行内存压力测试容器:</p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name mem-stress -m 512m --memory-swap 512m progrium/stress -m 1 --vm-bytes 600m
</pre></div>
<p><strong>监控容器内存使用状态</strong></p>
<p>实时查看容器的内存使用情况和运行状态:</p>
<div class="jb51code"><pre class="brush:bash;">docker stats mem-stress
</pre></div>
<p><strong>检查容器终止状态</strong></p>
<p>验证容器是否因内存溢出被终止:</p>
<div class="jb51code"><pre class="brush:bash;">docker inspect --format '{{.State.Status}}' mem-stress
</pre></div>
<p><strong>完整测试流程说明</strong></p>
<p>执行上述命令后,系统会创建一个名为<code>mem-stress</code>的容器,该容器被限制只能使用512MB物理内存且无法使用交换空间。通过<code>progrium/stress</code>工具尝试分配600MB内存,这将触发内存限制机制。</p>
<p><code>docker stats</code>命令可以实时观察内存使用情况,当容器内存使用达到限制时会被OOM Killer终止。最后一条命令会显示容器状态,若显示<code>exited</code>则表明容器因内存不足被终止。</p>
<p class="maodian"><a name="_lab2_2_8"></a></p><h3>2.4 建议与注意</h3>
<ul><li>为容器设置内存限制时,需预留一定冗余(如业务正常使用500m内存,可设置 <code>-m 600m</code>),避免突发流量导致容器被终止。</li><li>若容器业务依赖交换分区,需合理设置 <code>--memory-swap</code> 数值,避免因禁止交换分区导致业务异常。</li><li>低版本Docker中,内存限制可能受主机内核参数影响,需确保内核支持CGroup内存管控(可通过 <code>cat /proc/cgroups | grep memory</code> 验证)。</li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>三、磁盘IO(blkio/io)控制</h2>
<p>Docker通过blkio子系统(块设备IO)对容器的磁盘读写速度进行限制,适用于避免单个容器大量读写磁盘影响其他容器IO性能的场景(如数据库容器、日志收集容器)。</p>
<p class="maodian"><a name="_lab2_3_9"></a></p><h3>3.1 常用Docker参数(blkio)</h3>
<p>Docker提供以下核心参数控制磁盘IO,支持对读、写速度分别限制:</p>
<ul><li><code>--blkio-weight</code>:设置容器磁盘IO权重(默认500,范围10-1000),类似CPU权重,仅在IO竞争时生效。</li><li><code>--blkio-weight-device</code>:对指定设备设置IO权重(格式:设备路径:权重,如 <code>/dev/sda:800</code>)。</li><li><code>--device-read-bps</code>:限制容器对指定设备的读速度(单位b、k、m、g,如 <code>/dev/sda:100m</code> 表示每秒最多读100MB)。</li><li><code>--device-write-bps</code>:限制容器对指定设备的写速度(格式同读速度限制)。</li><li><code>--device-read-iops</code>:限制容器对指定设备的读IOPS(每秒输入/输出操作数)。</li><li><code>--device-write-iops</code>:限制容器对指定设备的写IOPS。</li></ul>
<p><strong>常用示例</strong>:</p>
<p><strong>限制容器磁盘IO的Docker命令示例</strong></p>
<p><strong>限制容器对/dev/sda设备的写速度为50MB/s</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name blkio-demo --device-write-bps /dev/sda:50mb nginx
</pre></div>
<p><strong>设置容器磁盘IO权重为800(默认值为500)</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name blkio-weight --blkio-weight 800 nginx
</pre></div>
<p><strong>同时限制读速度100MB/s和写速度50MB/s</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name blkio-rw --device-read-bps /dev/sda:100mb --device-write-bps /dev/sda:50mb nginx
</pre></div>
<p><strong>参数说明</strong></p>
<ul><li><code>--device-write-bps</code>:限制指定设备的写入带宽,单位支持<code>kb</code>/<code>mb</code>/<code>gb</code></li><li><code>--device-read-bps</code>:限制指定设备的读取带宽</li><li><code>--blkio-weight</code>:设置IO相对权重(范围100-1000),值越高优先级越高</li><li>设备路径需替换为实际块设备(如<code>/dev/nvme0n1</code>等)</li></ul>
<p><strong>注意事项</strong></p>
<ul><li>需要主机内核支持CFQ调度器(查看<code>/sys/block/sda/queue/scheduler</code>)</li><li>权限要求:运行命令的用户需有<code>docker</code>组权限或<code>root</code>权限</li><li>单位缩写需小写(如<code>mb</code>而非<code>MB</code>)</li></ul>
<p class="maodian"><a name="_lab2_3_10"></a></p><h3>3.2 验证(用dd测试写速)</h3>
<p>使用 <code>dd</code> 命令在容器内进行磁盘写操作,验证IO限制效果。需先进入容器,再执行写测试命令。</p>
<p><strong>实操步骤</strong>:</p>
<p><strong>运行容器并限制磁盘写速度</strong></p>
<p>使用以下命令运行容器,限制 <code>/dev/sda</code> 的写速度为 50MB/s:</p>
<div class="jb51code"><pre class="brush:bash;">docker run -it --rm --name blkio-test --device-write-bps /dev/sda:50m ubuntu /bin/bash
</pre></div>
<p><strong>在容器内执行磁盘写测试</strong></p>
<p>进入容器后,执行以下 <code>dd</code> 命令生成 1GB 文件,块大小为 1MB,直接写入磁盘(绕过缓存):</p>
<div class="jb51code"><pre class="brush:bash;">dd if=/dev/zero of=/testfile bs=1M count=1024 oflag=direct
</pre></div>
<p><strong>参数说明</strong></p>
<ul><li><code>--device-write-bps /dev/sda:50m</code>:限制 <code>/dev/sda</code> 设备的写速度为 50MB/s。</li><li><code>oflag=direct</code>:确保写入操作直接作用于磁盘,避免缓存影响速度测试。</li><li><code>bs=1M count=1024</code>:指定每次写入 1MB 数据,共写入 1024 次,总计 1GB。</li></ul>
<p>预期结果:写操作速度稳定在50MB/s左右,耗时约20秒(1G&divide;50MB/s),说明写速度限制生效。若未设置限制,写速度会接近主机磁盘最大写速。</p>
<p class="maodian"><a name="_lab2_3_11"></a></p><h3>3.3 注意事项(blkio)</h3>
<ul><li>IO限制参数仅对块设备(如/dev/sda)生效,对临时文件系统(tmpfs)、网络存储等无效。</li><li><code>--blkio-weight</code> 仅在IO资源竞争时生效,若主机磁盘IO空闲,容器可使用满速IO。</li><li>IOPS限制与读写速度限制可同时设置,适用于对磁盘IO延迟敏感的业务(如数据库),需根据业务需求调整参数。</li><li>部分文件系统(如ext4、xfs)对IO限制支持更好,使用小众文件系统时需测试参数兼容性。</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>四、清理Docker占用的磁盘空间</h2>
<p>Docker运行过程中会产生镜像、容器、日志、缓存等文件,长期积累会占用大量磁盘空间,需定期清理无用资源。</p>
<p class="maodian"><a name="_lab2_4_12"></a></p><h3>4.1 一键清理无用资源</h3>
<p>Docker提供 <code>docker system prune</code> 命令,可一键清理停止的容器、无用的网络、悬空镜像(无标签镜像)、构建缓存等。</p>
<p>一键清理(需确认,会删除停止的容器、悬空镜像等)</p>
<div class="jb51code"><pre class="brush:bash;">docker system prune
</pre></div>
<p>强制清理(无需确认,同时删除未使用的镜像)</p>
<div class="jb51code"><pre class="brush:bash;">docker system prune -af
</pre></div>
<p>清理无用卷(卷需单独清理,避免误删有用数据)</p>
<div class="jb51code"><pre class="brush:bash;">docker volume prune -f
</pre></div>
<p>说明</p>
<ul><li><code>docker system prune</code> 默认会删除停止的容器、悬空镜像和悬空网络,但需要手动确认。</li><li><code>-a</code> 参数会删除所有未使用的镜像(不仅仅是悬空镜像)。</li><li><code>-f</code> 参数强制清理,无需确认。</li><li><code>docker volume prune</code> 专门清理未被容器引用的卷,需谨慎使用以避免数据丢失。</li></ul>
<p class="maodian"><a name="_lab2_4_13"></a></p><h3>4.2 针对性清理</h3>
<p>清理Docker资源的完整命令集</p>
<p>以下是一组用于清理Docker资源的实用命令,包括停止的容器、悬空镜像和日志文件:</p>
<p><strong>删除所有已停止的容器</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker rm $(docker ps -a -q -f status=exited)
</pre></div>
<p><strong>删除所有悬空镜像</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker rmi $(docker images -f "dangling=true" -q)
</pre></div>
<p><strong>删除指定镜像(通过ID或名称)</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker rmi [镜像ID或镜像名:标签]
</pre></div>
<p><strong>清理容器日志(无需停止容器)</strong></p>
<div class="jb51code"><pre class="brush:bash;">truncate -s 0 /var/lib/docker/containers/$(docker inspect --format '{{.Id}}' [容器名])/*-json.log
</pre></div>
<p><strong>批量清理所有容器的日志文件</strong></p>
<div class="jb51code"><pre class="brush:bash;">for container in $(docker ps -aq); do truncate -s 0 /var/lib/docker/containers/${container}/*-json.log; done
</pre></div>
<p>使用注意事项</p>
<p>执行删除操作前建议先查看要删除的对象:</p>
<div class="jb51code"><pre class="brush:bash;"># 查看所有已停止的容器
docker ps -a -f status=exited

# 查看所有悬空镜像
docker images -f "dangling=true"
</pre></div>
<p>对于生产环境,建议先备份重要数据再执行清理操作。批量删除命令会清除所有符合条件的资源,无法选择性保留。</p>
<p class="maodian"><a name="_lab2_4_14"></a></p><h3>4.3 预防建议</h3>
<ul><li>为容器日志设置滚动策略(如使用json-file驱动时,通过 <code>--log-opt max-size</code> 和 <code>--log-opt max-file</code> 限制日志大小)。</li><li>定期构建镜像,删除无用标签镜像,使用多阶段构建减小镜像体积。</li><li>对不需要持久化的数据,使用临时卷或tmpfs挂载,避免占用磁盘空间。</li></ul>
<p class="maodian"><a name="_label5"></a></p><h2>五、常见命令速查(快速摘录)</h2>
<p class="maodian"><a name="_lab2_5_15"></a></p><h3>5.1 资源限制命令</h3>
<p><strong>资源限制命令总结</strong></p>
<p>1.CPU限制</p>
<div class="jb51code"><pre class="brush:bash;">docker run -itd --name c1 --cpu-shares 512 centos:7</pre></div>
<p>通过<code>--cpu-shares</code>设置容器CPU权重,默认1024,数值越高优先级越高。</p>
<div class="jb51code"><pre class="brush:bash;">docker run -itd --name c2 --cpu-quota 50000 centos:7</pre></div>
<p>使用<code>--cpu-quota</code>限制容器在每个调度周期内最多使用的CPU时间(微秒),通常与<code>--cpu-period</code>配合使用。</p>
<div class="jb51code"><pre class="brush:bash;">docker run -itd --name c3 --cpuset-cpus "1,3" centos:7</pre></div>
<p>通过<code>--cpuset-cpus</code>绑定容器到指定CPU核心(例中为1号、3号核心)。</p>
<div class="jb51code"><pre class="brush:bash;">docker run -itd --name c4 --cpus="0.5" centos:7</pre></div>
<p>使用<code>--cpus</code>直接限制容器可用CPU核数(例中限制为0.5核)。</p>
<p>2.内存限制</p>
<div class="jb51code"><pre class="brush:bash;">docker run -itd --name memtest -m 512m centos:7</pre></div>
<p>通过<code>-m</code>或<code>--memory</code>限制容器最大物理内存使用量(例中512MB)。</p>
<pre><code>docker run -itd --name memtest2 -m 300m --memory-swap=1g centos:7
</code></pre>
<p>组合使用<code>-m</code>和<code>--memory-swap</code>限制物理内存和交换空间总量(例中300MB物理内存+700MB交换空间)。</p>
<p>3.磁盘I/O限制</p>
<div class="jb51code"><pre class="brush:bash;">docker run -it --name iotest --device-write-bps /dev/sda:1MB centos:7</pre></div>
<p>通过<code>--device-write-bps</code>限制设备写入速率(例中限制为1MB/s)。</p>
<p>4.监控与验证</p>
<div class="jb51code"><pre class="brush:bash;">docker stats</pre></div>
<p>实时监控容器资源使用情况。</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it &lt;container&gt; bash
cat /sys/fs/cgroup/cpu/docker/&lt;container-id&gt;/cpu.cfs_quota_us
cat /sys/fs/cgroup/memory/docker/&lt;container-id&gt;/memory.limit_in_bytes</pre></div>
<p>进入容器后查看cgroup文件验证CPU配额和内存限制的实际数值。</p>
<p>5.清理命令</p>
<div class="jb51code"><pre class="brush:bash;">docker system prune -a</pre></div>
<p>清理所有停止的容器、未使用的网络和悬空镜像。</p>
<p class="maodian"><a name="_lab2_5_16"></a></p><h3>5.2 资源查看命令</h3>
<p>以下是实现实时查看容器资源使用情况、检查容器资源限制配置以及查看主机CPU和磁盘信息的代码片段:</p>
<p>实时查看容器资源使用情况</p>
<div class="jb51code"><pre class="brush:bash;">docker stats 容器名/容器ID
</pre></div>
<p>查看容器资源限制配置</p>
<div class="jb51code"><pre class="brush:bash;">docker inspect --format '{{.HostConfig.Resources}}' 容器名/容器ID
</pre></div>
<p>查看主机CPU信息</p>
<div class="jb51code"><pre class="brush:bash;">lscpu
</pre></div>
<p>查看主机磁盘信息</p>
<div class="jb51code"><pre class="brush:bash;">lsblk
</pre></div>
<p>这些命令可以直接在终端中执行,用于监控和管理Docker容器以及主机的资源使用情况。</p>
<p class="maodian"><a name="_lab2_5_17"></a></p><h3>5.3 资源清理命令</h3>
<p>以下是实现一键清理Docker无用资源的代码片段,可直接复制执行:</p>
<p>清理无用资源</p>
<div class="jb51code"><pre class="brush:bash;">docker system prune -af
</pre></div>
<p>清理无用卷</p>
<div class="jb51code"><pre class="brush:bash;">docker volume prune -f
</pre></div>
<p>删除所有停止的容器</p>
<div class="jb51code"><pre class="brush:bash;">docker rm -f $(docker ps -a -q)
</pre></div>
<p>这三条命令的功能说明:</p>
<ul><li><code>docker system prune -af</code> 强制删除所有未使用的镜像、容器、网络和缓存</li><li><code>docker volume prune -f</code> 强制删除所有未被容器引用的数据卷</li><li><code>docker rm -f $(docker ps -a -q)</code> 强制删除所有已停止的容器(包括未运行的容器)</li></ul>
<p>注意事项:</p>
<ul><li>执行前确保没有重要数据依赖未运行的容器</li><li>生产环境建议先确认清理列表:<code>docker system prune --dry-run</code></li><li>该操作不可逆,会永久删除数据</li></ul>
<p class="maodian"><a name="_label6"></a></p><h2>六、常见陷阱与建议</h2>
<p class="maodian"><a name="_lab2_6_18"></a></p><h3>6.1 常见陷阱</h3>
<ul><li><strong>陷阱1:忽略虚拟内存配置</strong>:仅设置 <code>-m</code> 不设置 <code>--memory-swap</code>,容器可能因使用过多交换分区导致性能下降(交换分区速度远低于物理内存)。</li><li><strong>陷阱2:权重参数误当绝对限制</strong>:CPU、IO权重仅在资源竞争时生效,无法保障容器最低资源,若需固定资源上限,需结合 <code>--cpus</code>、<code>--device-write-bps</code> 等参数。</li><li><strong>陷阱3:容器日志无限制增长</strong>:默认日志驱动无大小限制,长期运行的容器日志会占满磁盘,需提前设置日志滚动策略。</li><li><strong>陷阱4:绑定不存在的CPU核心</strong>:核心编号从0开始,若绑定超出主机核心数的编号,容器无法启动,需通过 <code>lscpu</code> 确认主机核心信息。</li></ul>
<p class="maodian"><a name="_lab2_6_19"></a></p><h3>6.2 实用建议</h3>
<ul><li><strong>资源限制适度冗余</strong>:为容器预留10%-20%的资源冗余,应对突发流量,避免因资源不足导致容器被终止或业务异常。</li><li><strong>结合监控工具</strong>:使用Prometheus+Grafana、Docker Desktop自带监控等工具,实时监控容器资源使用情况,及时调整限制参数。</li><li><strong>多资源协同限制</strong>:核心业务容器需同时限制CPU、内存、IO资源,避免单一资源过载影响整体稳定性。</li><li><strong>镜像优化减少磁盘占用</strong>:使用多阶段构建、精简基础镜像(如alpine),减小镜像体积,降低磁盘占用。</li></ul>
<p class="maodian"><a name="_label7"></a></p><h2>总结</h2>
<p>Docker资源限制是容器化部署稳定性的核心保障,通过合理配置CPU、内存、磁盘IO参数,可实现资源的精细化分配,避免单个容器影响整体系统。同时,定期清理无用资源、规避常见陷阱、结合监控工具,能进一步提升容器集群的运维效率。</p>
<p>到此这篇关于Docker资源(CPU/内存/磁盘IO)限制全解析的文章就介绍到这了,更多相关Docker资源限制内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁: [1]
查看完整版本: Docker资源(CPU/内存/磁盘IO)限制全解析