github编辑

VOLUME 定义匿名卷

基本语法

VOLUME ["/路径1", "/路径2"]
VOLUME /路径

VOLUME 指令创建挂载点,并标记为外部挂载的卷。


为什么使用 VOLUME

核心原则:容器存储层应该保持无状态,任何运行时数据都应该存储在卷中。

没有 VOLUME:                    使用 VOLUME:
┌─────────────────────┐         ┌─────────────────────┐
│     容器存储层       │         │     容器存储层       │
│   ┌─────────────┐   │         │   (只读/无状态)    │
│   │  数据库文件  │←─问题      │                     │
│   │  日志文件    │   │         └──────────┬──────────┘
│   │  上传文件    │   │                    │
│   └─────────────┘   │         ┌──────────▼──────────┐
└─────────────────────┘         │      数据卷         │
容器删除 = 数据丢失              │   ┌─────────────┐   │
                                │   │  持久化数据  │←─安全
                                │   └─────────────┘   │
                                └─────────────────────┘
                                容器删除,数据保留

基本用法

定义单个卷

定义多个卷


VOLUME 的行为

1. 自动创建匿名卷

如果运行时未指定挂载,Docker 会自动创建匿名卷:

2. 可被命名卷覆盖

3. 可被 Bind Mount 覆盖


VOLUME 在构建时的特殊行为

⚠️ 重要:VOLUME 之后对该目录的修改会被丢弃!

原因:VOLUME 指令之后,Docker 将该目录视为外部挂载点,不再记录对它的修改。

正确做法


常见使用场景

数据库持久化

日志目录

上传文件目录


查看 VOLUME 定义


VOLUME vs docker run -v

特性
Dockerfile VOLUME
docker run -v

定义时机

镜像构建时

容器运行时

默认行为

创建匿名卷

可指定命名卷或路径

灵活性

低(固定路径)

高(可任意指定)

适用场景

定义必须持久化的路径

灵活的数据管理


在 Compose 中


安全注意事项

匿名卷可能导致数据丢失

解决:始终使用命名卷


最佳实践

1. 定义必须持久化的路径

2. 不要在 VOLUME 后修改目录

3. 文档中说明 VOLUME 用途


本章小结

要点
说明

作用

创建挂载点,标记为外部卷

语法

VOLUME /path

默认行为

自动创建匿名卷

覆盖方式

docker run -v name:/path

注意

VOLUME 之后的修改会丢失

延伸阅读

最后更新于