共享内存需显式配置docker compose的ipc和shm_size参数才能实现容器间共享;必须指定一个服务为ipc主体(ipc: "shareable"),其余服务通过ipc: "container:xxx"加入其命名空间,并统一设置shm_size(如'2gb'),同时挂载/dev/shm确保生效。

共享内存不是默认开启的,得手动配
Docker Compose 默认为每个服务创建独立的 IPC 命名空间,/dev/shm 也仅限 64MB,且彼此隔离。这意味着两个服务即使在同一网络里,也无法直接通过 POSIX 或 System V 共享内存通信——除非显式配置。关键参数就两个:--shm-size 控制容量,--ipc 控制命名空间归属。
用 shm_size 和 ipc 配合实现容器间共享
要让多个服务真正共享同一块 /dev/shm 区域,必须让它们共用 IPC 命名空间。只调大 shm_size 不够,因为各自仍处于 private IPC 空间中,内存区域物理隔离。
- 推荐方式:指定一个服务为“IPC 主体”,其他服务通过
ipc: "container:xxx"加入它的命名空间 - 示例中,
producer设为 IPC 主体,consumer显式加入其 IPC 空间 - 同时统一设置
shm_size: '2gb',确保共享区域足够大(如 Chrome、TensorFlow 等常需 1–4GB)
docker-compose.yml 实战写法
以下是一个可直接运行的双容器共享内存配置:
version: '3.8'
services:
producer:
image: ubuntu:22.04
ipc: "shareable"
shm_size: '2gb'
command: >
sh -c "
echo 'data from producer' > /dev/shm/message.txt &&
sleep infinity
"
volumes:
- /dev/shm:/dev/shm
<p>consumer:
image: ubuntu:22.04
ipc: "container:producer"
shm_size: '2gb'
command: >
sh -c "
while [ ! -f /dev/shm/message.txt ]; do sleep 0.1; done &&
cat /dev/shm/message.txt &&
sleep infinity
"
volumes:</p>
- /dev/shm:/dev/shm
注意:
ipc: "shareable"是 producer 被其他容器挂载的前提;consumer 必须用container:producer才能真正映射到同一 shm 区域。volumes 挂载 /dev/shm 是冗余但保险的做法,避免某些镜像启动时未自动挂载。
验证是否真共享成功
启动后执行检查,确认两容器看到的是同一内存实例:
- 进 producer:
docker exec -it <producer_id> ls -l /dev/shm</producer_id>,记下 message.txt 的 inode 号 - 进 consumer:
docker exec -it <consumer_id> ls -l /dev/shm</consumer_id>,对比 inode 是否完全一致 - 修改 producer 中文件内容,consumer 内立即
cat可见更新——说明是同一内存映射,非拷贝 - 若出现
No such file or directory或内容不刷新,大概率是 ipc 配置没对齐,或未设 shareable











