数据卷管理
容器删除后数据会丢失,数据卷(Volume)用于持久化和共享数据。
为什么需要数据卷?
容器是临时的,删除容器会丢失所有数据:
# 运行 MySQL 容器docker run -d --name db mysql
# 删除容器docker rm -f db
# 数据丢失了!😱使用数据卷可以保留数据:
# 使用命名卷docker run -d --name db -v mysql-data:/var/lib/mysql mysql
# 删除容器docker rm -f db
# 数据还在!重新运行容器数据会恢复docker run -d --name db -v mysql-data:/var/lib/mysql mysql数据卷类型
命名卷(Named Volumes)
推荐使用,由 Docker 管理。
# 创建卷docker volume create my-data
# 使用卷docker run -d -v my-data:/app/data nginx
# 查看卷docker volume ls
# 查看卷详情docker volume inspect my-data绑定挂载(Bind Mounts)
直接挂载主机目录。
# 挂载当前目录docker run -d -v $(pwd):/app nginx
# 挂载特定目录docker run -d -v /host/path:/container/path nginx
# 只读挂载docker run -d -v /host/path:/container/path:ro nginx匿名卷(Anonymous Volumes)
# Docker 自动创建docker run -d -v /app/data nginx使用场景
数据库数据
docker run -d \ --name postgres \ -v postgres-data:/var/lib/postgresql/data \ postgres开发环境代码同步
docker run -d \ --name dev \ -v $(pwd)/src:/app/src \ -p 3000:3000 \ node-app配置文件
docker run -d \ --name nginx \ -v ./nginx.conf:/etc/nginx/nginx.conf:ro \ nginx日志文件
docker run -d \ --name app \ -v logs:/var/log/app \ myapp数据卷管理
基本操作
# 创建卷docker volume create my-volume
# 列出卷docker volume ls
# 查看卷详情docker volume inspect my-volume
# 删除卷docker volume rm my-volume
# 清理未使用的卷docker volume prune备份和恢复
备份
# 将卷数据备份到 tar 文件docker run --rm \ -v my-data:/data \ -v $(pwd):/backup \ ubuntu tar czf /backup/backup.tar.gz /data恢复
# 从 tar 文件恢复数据docker run --rm \ -v my-data:/data \ -v $(pwd):/backup \ ubuntu tar xzf /backup/backup.tar.gz -C /Docker Compose 中使用卷
services: db: image: postgres volumes: - postgres-data:/var/lib/postgresql/data
web: image: myapp volumes: - ./src:/app/src # 绑定挂载 - node-modules:/app/node_modules # 命名卷
volumes: postgres-data: node-modules:最佳实践
- ✅ 数据库使用命名卷
- ✅ 开发环境使用绑定挂载
- ✅ 配置文件使用只读挂载
- ✅ 定期备份重要数据
- ✅ 及时清理未使用的卷
常见问题
权限问题
# 以特定用户运行docker run -u $(id -u):$(id -g) -v $(pwd):/app myapp查看卷在主机上的位置
docker volume inspect my-volume --format '{{ .Mountpoint }}'下一步
- Docker Compose - 编排多容器应用
- 容器网络 - 容器间通信
- 数据备份策略 - 生产环境最佳实践