Docker 实战:如何限制容器的内存使用大小

一、为什么要限制容器内存?

在使用 Docker 部署服务时,如果不加限制,某个容器可能因为内存泄漏或负载过高,导致主机内存被耗尽,拖垮其他容器甚至整个系统。

因此,在生产环境中,限制容器内存使用量(Memory Limit) 是一项关键的资源控制措施。


二、Docker 中的内存限制参数

Docker 基于 Linux 的 cgroups(控制组) 机制实现资源隔离。

和内存相关的主要参数如下:

参数 说明
--memory-m 限制容器最大可使用的物理内存
--memory-swap 限制容器可使用的总内存(物理内存 + swap)
--oom-kill-disable 是否禁用 OOM Killer(不建议在生产中关闭)

三、基础用法示例

1. 限制容器最大内存为 512MB

bash 复制代码
docker run -d --name myapp -m 512m nginx

此命令表示容器最多使用 512MB 内存。超过限制时,系统会触发 OOM 机制终止容器。


2. 同时限制内存与 swap

bash 复制代码
docker run -d --name myapp -m 512m --memory-swap 1g nginx

说明:

  • 物理内存上限:512MB
  • 总内存(含 swap)上限:1GB
  • 超出时系统自动使用 swap 空间

⚠️ 若 --memory-swap--memory 值相同,表示禁止使用 swap


四、查看容器的内存使用情况

使用以下命令可实时查看容器的资源使用:

bash 复制代码
docker stats

输出示例:

复制代码
CONTAINER ID   NAME     MEM USAGE / LIMIT
a1b2c3d4e5f6   myapp    120.5MiB / 512MiB

也可通过以下命令查看详细配置:

bash 复制代码
docker inspect myapp | grep Memory

五、容器 OOM(内存不足)行为

当容器内存达到限制时,Docker 会触发 OOM Killer(Out Of Memory Killer),强制终止进程。

此时容器的退出码为 137

bash 复制代码
docker ps -a

输出示例:

复制代码
Exited (137) 10 seconds ago

表示该容器因内存超限被系统杀死。


六、在 Docker Compose 中限制内存

如果使用 docker-compose.yml 启动容器,可以这样定义:

yaml 复制代码
version: '3.8'
services:
  web:
    image: nginx
    deploy:
      resources:
        limits:
          memory: 512M

💡 注意:deploy.resources.limits 仅在 Docker Swarm 模式 下生效。

普通 Compose 可使用旧语法:

yaml 复制代码
services:
  web:
    image: nginx
    mem_limit: 512m

七、最佳实践建议

  1. 所有生产容器都应设置内存限制,防止资源耗尽。
  2. 根据服务特性预留一定内存冗余,避免频繁触发 OOM。
  3. 内存敏感型服务(如 Redis、Java)应重点监控。
  4. 配合 docker stats 做长期资源趋势分析。
  5. 结合 --cpus 参数同时控制 CPU 资源,更均衡。

八、总结对照表

目标 命令或配置示例
限制最大内存 -m 512m
限制总内存(含 swap) --memory-swap 1g
禁止使用 swap --memory-swap=512m
查看运行状态 docker stats
Compose 配置 mem_limit: 512m

合理配置容器内存限制,是 Docker 运维中保障稳定性与资源隔离性 的关键。

建议在上线前就设置好各服务的资源边界,让系统运行更安全、更高效。

相关推荐
之歆5 小时前
Spring AI入门到实战到原理源码-MCP
java·人工智能·spring
yangminlei5 小时前
Spring Boot3集成LiteFlow!轻松实现业务流程编排
java·spring boot·后端
qq_318121595 小时前
互联网大厂Java面试故事:从Spring Boot到微服务架构的技术挑战与解答
java·spring boot·redis·spring cloud·微服务·面试·内容社区
计算机毕设VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue医院设备管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
J_liaty5 小时前
Spring Boot整合Nacos:从入门到精通
java·spring boot·后端·nacos
Mr__Miss5 小时前
保持redis和数据库一致性(双写一致性)
数据库·redis·spring
阿蒙Amon6 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
daidaidaiyu6 小时前
Spring IOC 源码学习 一文学习完整的加载流程
java·spring
黎陌MLing6 小时前
docker安装管理TDengine
docker·容器·tdengine
Knight_AL7 小时前
Spring 事务传播行为 + 事务失效原因 + 传播行为为什么不用其他模式
数据库·sql·spring