docker-compose.yml中shm_size: 8g 是限制什么?
shm_size: 8g 并不是限制容器的总内存,而是指定容器中 /dev/shm(共享内存,shared memory) 的大小。默认情况下,Docker 容器的 /dev/shm 只有 64MB,通过 shm_size 可以调整这个值。
/dev/shm 是什么?
/dev/shm 是 Linux 的 内存共享区域(shared memory segment),通常用于:
- 多进程之间共享数据;
- 一些数据库(如 PostgreSQL、Oracle)用于共享缓存;
- 浏览器(Chromium、Chrome、Firefox)共享渲染数据;
- 科学计算或多进程应用共享内存块。
在宿主机上你可以看到:
1 | $ df -h | grep shm |
这表示默认共享内存大小是 64MB。
在 docker-compose 中的写法
1 | services: |
或者在 docker run 时等价写法:
1 | docker run --shm-size=8g postgres:16 |
举例说明
假设你跑 PostgreSQL 容器:
1 | services: |
PostgreSQL 使用 /dev/shm 作为共享缓冲区,如果默认 64MB 不够,可能会报:
FATAL: could not create shared memory segment
设置为 2G 后,这类问题就消失。
对比表
| 参数 | 含义 | 是否影响 /dev/shm |
|---|---|---|
mem_limit |
限制容器可用的最大内存(堆+栈+cache+共享) | ✅ 影响整体内存 |
shm_size |
指定 /dev/shm 的大小 |
❌ 仅影响共享内存部分 |
mem_reservation |
软限制(提示 Docker 尽量给这个内存) | ❌ |
建议实践
- 数据库类容器(PostgreSQL、Oracle):建议
shm_size: 1g~8g - 机器学习容器(PyTorch/TensorFlow):建议
shm_size: 8g或更高 - Web 应用容器:通常默认 64M 足够。