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
2
$ df -h | grep shm
tmpfs 64M 0 64M 0% /dev/shm

这表示默认共享内存大小是 64MB。


在 docker-compose 中的写法

1
2
3
4
services:
myapp:
image: postgres:16
shm_size: 8g # 设置 /dev/shm 大小为 8GB

或者在 docker run 时等价写法:

1
docker run --shm-size=8g postgres:16

举例说明

假设你跑 PostgreSQL 容器:

1
2
3
4
services:
db:
image: postgres:15
shm_size: 2g

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 足够。