docker守护进程(dockerd)自身内存限制需通过systemd的memorylimit参数实现,如写入/etc/systemd/system/docker.service.d/memory-limit.conf中设置memorylimit=1g,再重载并重启服务;该方法依赖cgroups v2,不支持--memory-swap等容器级参数。

Docker 守护进程(dockerd)本身是宿主机上的一个系统服务进程,不能通过 --memory 这类容器级参数来限制它自己的内存使用——那些参数只作用于容器,不适用于 dockerd 本身。
但你可以通过 Linux 系统级手段 来限制 dockerd 的内存上限,核心方法是利用 systemd 对服务进程的资源约束(基于 cgroups v2),这是生产环境中最可靠、推荐的方式。
✅ 正确做法:用 systemd 限制 dockerd 内存
CentOS(以及大多数现代 Linux 发行版)使用 systemd 管理 dockerd 服务。你只需修改其 service 单元配置,添加内存限制即可。
步骤如下:
-
创建或编辑 drop-in 配置文件
不要直接修改/usr/lib/systemd/system/docker.service(会被更新覆盖),而是用 systemd 推荐的 override 方式:sudo mkdir -p /etc/systemd/system/docker.service.d sudo nano /etc/systemd/system/docker.service.d/memory-limit.conf
-
写入内存限制配置(例如限制 dockerd 最多使用 1GB 内存):
[Service] MemoryLimit=1G
✅ 支持单位:
B,K,M,G,T(大小写均可)
❌ 不支持--memory-swap或软限制(MemoryReservation在 systemd 中不可靠,不建议设) -
重载 systemd 配置并重启 Docker
sudo systemctl daemon-reload sudo systemctl restart docker
-
验证是否生效
# 查看 dockerd 进程的 cgroup 内存限制 cat /proc/$(pgrep dockerd)/cgroup | grep memory # 查看实际内存上限(字节) cat /sys/fs/cgroup/system.slice/docker.service/memory.max
若输出类似
1073741824,说明 1G 限制已生效。
⚠️ 注意事项
不要改
/etc/docker/daemon.json来“限制 dockerd”
该文件只控制 Docker 引擎的默认行为(比如所有新容器的默认内存限制),对 dockerd 自身内存无影响。避免设置过低
dockerd 需要管理容器生命周期、网络、镜像、日志等,建议最低不低于 512M;高负载集群建议 1.5G~2G 起步。OOM 行为
若 dockerd 内存超限,systemd 会触发 OOM killer —— 可能终止 dockerd 自身,导致所有容器停运。因此务必留足余量,并配合监控(如systemctl show docker --property=MemoryCurrent)。cgroups 版本要求
此方法依赖 cgroups v2(CentOS 8+/RHEL 8+ 默认启用;CentOS 7 默认 cgroups v1,需手动启用 v2 或改用其他方案,如 ulimit + 外部监控)。
? 替代方案(仅限 CentOS 7 / cgroups v1 环境)
若无法启用 cgroups v2,可临时用 ulimit 限制 dockerd 启动时的虚拟内存(效果有限,不推荐生产使用):
# 编辑 /etc/sysconfig/docker,追加: ulimit -v 1048576 # 限制 virtual memory ≈ 1GB(单位 KB)
然后重启 docker,但注意:ulimit -v 对现代 Go 程序(如 dockerd)效果不稳定,且不控制 RSS 内存,仅作兜底参考。
本质上,限制 dockerd 内存不是 Docker 自身功能,而是操作系统层面的资源管控。用 systemd MemoryLimit 是当前最标准、可审计、可持久化的方式。











