Docker持久化推荐使用命名卷(如myapp_data),由Docker自动管理存储路径与权限,支持docker run -v和docker-compose.yml声明,数据在容器删除后保留,备份恢复需临时容器操作,避免绑定挂载和匿名卷。

在 Docker 容器中配置持久化数据卷(Volumes),核心是让容器内产生的数据(如数据库文件、日志、上传的图片等)不随容器删除而丢失。Docker 提供了 Volumes 这一原生机制,专为持久化设计,比绑定挂载(bind mounts)更安全、可移植、易管理。
创建并使用命名卷(Named Volume)
命名卷由 Docker 管理,存储在宿主机的 /var/lib/docker/volumes/ 下,但你无需手动操作路径,Docker 自动处理权限和生命周期。
- 创建一个名为
myapp_data的卷:docker volume create myapp_data - 运行容器时挂载该卷到容器内指定路径(例如
/app/data):docker run -v myapp_data:/app/data -d --name myapp nginx - 验证是否挂载成功:
docker inspect myapp | grep -A 5 Mounts,查看Source字段指向 Docker 管理的路径
在 docker-compose.yml 中声明和使用 volumes
适合多容器协作场景(如 Web + MySQL),避免手动创建卷,提升可复用性。
- 在
docker-compose.yml中定义卷并挂载:
services:
db:
image: mysql:8.0
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: example
<p>volumes:
db_data: # 自动创建,无需提前 docker volume create</p>- 启动后执行
docker-compose up -d,Docker 会自动创建db_data卷并挂载 - 即使删掉容器或执行
docker-compose down,db_data卷及其数据默认保留
备份、恢复和清理 volume 数据
Volume 本身不自动备份,需借助临时容器操作宿主机上的卷数据。
-
备份:将
myapp_data卷打包成backup.tardocker run --rm -v myapp_data:/volume -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /volume . -
恢复:从
backup.tar解压回卷docker run --rm -v myapp_data:/volume -v $(pwd):/backup alpine tar xzf /backup/backup.tar.gz -C /volume -
清理无用卷(未被任何容器使用的卷):
docker volume prune(执行前建议先docker volume ls确认)
注意区分 volumes 和 bind mounts
别把 -v /host/path:/container/path(绑定挂载)误当作 volume 使用——它直接映射宿主机目录,权限、路径依赖强,不适合跨环境迁移。
- ✅ 推荐用于持久化:命名卷(
-v myvol:/path)或docker-compose.yml中定义的volumes:块 - ⚠️ 谨慎使用绑定挂载:仅适用于开发时共享源码、配置文件等,非生产数据持久化首选
- ❌ 避免匿名卷(
-v /data):无法直观识别和管理,容器删除后可能残留无名卷

















