daemon.json 不支持配置 --shm-size,因其属容器运行时参数而非守护进程全局策略;正确方式为:1. docker run --shm-size;2. docker-compose 中设 shm_size;3. 用 --mount 挂载 tmpfs。
daemon.json 是 docker 守护进程的全局配置文件,它**不支持直接配置容器级共享内存大小(如 --shm-size)**。共享内存容量(/dev/shm)属于容器运行时参数,必须在启动容器时显式指定,不能通过 daemon.json 统一设置。
为什么 daemon.json 不能设 --shm-size?
Docker 设计上将 --shm-size 视为容器实例的运行时行为,而非守护进程的全局策略。daemon.json 主要管控:
- 镜像仓库镜像源(
registry-mirrors) - 日志驱动与轮转策略(
log-driver/log-opts) - 存储驱动与磁盘配额(
storage-driver,storage-opts) - 网络、cgroup、安全选项等基础设施层配置
而每个容器的 /dev/shm 大小可能因应用需求差异极大(例如:Chrome 容器需 2GB,轻量 API 可能只需 64MB),无法也不应由 daemon 全局强制统一。
正确配置容器共享内存的三种方式
1. 命令行启动时指定
最常用、最直接的方式:
docker run -d --name myapp --shm-size=512m nginx:alpine
或使用更精确单位:
-
--shm-size=1g(1 GiB) -
--shm-size=64000000(字节数,约 64MB)
2. Docker Compose 中声明
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
适用于多服务编排,配置清晰可维护:
version: '3.8'
services:
app:
image: python:3.11
shm_size: '512mb' # 注意:Compose 使用字符串格式,支持 mb/gb 等单位
3. 使用 mount 显式挂载 tmpfs(高级控制)
当需要自定义权限、模式或与其他容器共享同一 shm 实例时:
docker run -d \ --name worker-a \ --mount type=tmpfs,destination=/dev/shm,tmpfs-size=268435456,tmpfs-mode=1777 \ ubuntu:22.04 sleep infinity
其中 268435456 = 256 × 1024 × 1024 字节(即 256MB),tmpfs-mode=1777 确保所有容器内进程可读写。
补充:宿主机 /dev/shm 默认大小影响容器吗?
有间接影响。Docker 启动容器时,默认为 /dev/shm 分配 64MB tmpfs;这个行为基于宿主机内核对 tmpfs 的默认限制,但 Docker 会覆盖它 —— 即使宿主机 /dev/shm 只有 64MB,只要容器指定了 --shm-size=2g,Docker 仍会尝试挂载一个 2GB 的独立 tmpfs(前提:宿主机内存充足且未被 cgroup 限制)。
若遇到 “no space left on device” 错误,需检查:
- 宿主机是否开启内存 cgroup 且设置了过严的 memory.limit_in_bytes
- 是否在 systemd 启动 Docker 时加了
MemoryLimit约束 - 是否在 Kubernetes 中未给 emptyDir 设置
sizeLimit










