15.5.2 数据卷创建、挂载与生命周期管理
数据卷创建、挂载与生命周期管理#
数据卷决定容器数据是否持久、是否可共享。本节通过原理草图、完整命令示例、排错与练习,帮助你掌握卷的创建、挂载与生命周期管理。
原理草图:卷与容器的关系#
1. 数据卷创建与查看(含命令解释)#
示例:创建具名卷并查看详细信息
# 1) 创建具名卷
docker volume create app_data
# 2) 查看所有卷
docker volume ls
# 3) 查看卷的挂载点与元数据
docker volume inspect app_data
命令解释:
- docker volume create app_data:创建具名卷,便于长期管理与复用。
- docker volume ls:列出所有卷,快速清点。
- docker volume inspect app_data:查看卷的真实存储路径(Mountpoint)与驱动类型。
2. 挂载数据卷(完整可执行示例)#
场景:MySQL 数据持久化
# 1) 拉取镜像
docker pull mysql:8.0
# 2) 使用具名卷挂载
docker run -d --name mysql01 \
-e MYSQL_ROOT_PASSWORD=Root@123 \
--mount source=app_data,target=/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
# 3) 验证容器运行
docker ps
# 4) 在容器内写入测试数据
docker exec -it mysql01 mysql -uroot -pRoot@123 -e "CREATE DATABASE testdb;"
预期效果:
- 重建容器后 testdb 仍存在。
- app_data 卷不随容器删除而删除。
绑定挂载示例:适合配置文件热更新
# 1) 准备宿主机目录
mkdir -p /data/nginx/conf
# 2) 绑定挂载到容器
docker run -d --name web01 \
-v /data/nginx/conf:/etc/nginx/conf.d \
-p 8080:80 \
nginx:1.24
3. 生命周期管理(创建、删除、清理)#
# 查看卷状态
docker volume ls
# 删除指定卷(需确保未被容器使用)
docker volume rm app_data
# 清理所有未被使用的卷
docker volume prune
说明:
- 具名卷独立于容器生命周期,删除容器不会删除卷。
- 匿名卷可能在容器删除后残留,需通过 volume prune 清理。
4. 多容器共享卷(读写共享示例)#
# 1) 启动容器A写入文件
docker run -d --name app1 \
-v app_data:/data \
busybox sh -c "echo hello_from_app1 > /data/info.txt; sleep 3600"
# 2) 启动容器B读取文件
docker run --rm --name app2 \
-v app_data:/data \
busybox cat /data/info.txt
预期输出:
hello_from_app1
5. 常见问题与排错(含具体命令)#
问题1:删除卷失败,提示“volume is in use”
# 查看使用该卷的容器
docker ps -a --filter volume=app_data
# 停止并删除容器后再删除卷
docker rm -f <container_id>
docker volume rm app_data
问题2:容器内写入失败(权限问题)
# 查看卷在宿主机的真实路径
docker volume inspect app_data | grep Mountpoint
# 修正属主与权限(示例:UID 999)
chown -R 999:999 /var/lib/docker/volumes/app_data/_data
问题3:绑定挂载路径不存在
# 宿主机路径不存在会被自动创建为空目录
# 建议先手动创建并放入配置文件
mkdir -p /data/nginx/conf
6. 练习(动手验证)#
- 创建具名卷
lab_data,启动 MySQL 容器挂载并创建数据库labdb。 - 删除容器后重建,验证
labdb仍存在。 - 用
docker volume inspect找到挂载点,在宿主机直接查看数据目录。 - 尝试共享卷给两个 busybox 容器,完成读写验证。