daemon.json不能直接配置容器级共享内存限制,因--shm-size是运行时参数,需在docker run或docker-compose.yml中显式指定,如--shm-size=512m或tmpfs挂载;daemon.json仅能通过memory-reservation等间接优化shm使用环境。daemon.json 本身不支持配置容器级共享内存限制。它面向 Docker 守护进程(dockerd)全局行为,而 `/dev/shm` 大小属于**单个容器的运行时参数**,必须在 `docker run` 或编排文件(如 docker-compose.yml)中显式指定。 但你可以通过 daemon.json 间接影响共享内存使用环境,同时必须配合运行时配置才能生效。以下是关键要点和实用做法:
为什么 daemon.json 不能直接设 --shm-size
因为 --shm-size 是容器启动时由客户端传给 dockerd 的运行时参数,不属于守护进程自身的配置项。daemon.json 中没有类似 "default-shm-size" 的字段,docker 官方也从未提供该能力。
真正有效的共享内存配置方式
你需要在启动容器时明确声明,两种主流写法:
-
命令行方式:使用
--shm-size指定大小,单位支持b/k/m/gdocker run -d --name app1 --shm-size=512m nginx:alpine -
挂载 tmpfs 方式:更灵活,可控制权限、模式等
docker run -d --name app2 --mount type=tmpfs,destination=/dev/shm,tmpfs-size=512m nginx:alpine
如何让多个容器共享同一块 shm 区域
仅靠 --shm-size 不行——它为每个容器创建独立的 tmpfs 实例。要实现跨容器共享,需挂载宿主机上同一个 tmpfs 目录:
- 先在宿主机创建共享目录并挂载 tmpfs:
mkdir -p /mnt/shared-shmmount -t tmpfs -o size=512m tmpfs /mnt/shared-shm - 再将该路径挂载进多个容器:
docker run -v /mnt/shared-shm:/dev/shm:rw ...docker run -v /mnt/shared-shm:/dev/shm:rw ...
这样它们就真正共享同一物理内存页,适用于 IPC、零拷贝通信等场景。
补充:daemon.json 可做的辅助配置
虽然不能设 shm,但以下 daemon.json 设置能提升共享内存使用的稳定性:
-
启用实验特性(部分高级 shm 行为依赖):
"experimental": true -
预留系统资源,防止 shm 占满导致 OOM:
"memory-reservation": "1g"(配合 systemd MemoryLimit 使用) -
统一日志与存储驱动,避免因底层异常干扰 shm 映射:
"log-driver": "json-file","storage-driver": "overlay2"











