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. 练习(动手验证)#

  1. 创建具名卷 lab_data,启动 MySQL 容器挂载并创建数据库 labdb
  2. 删除容器后重建,验证 labdb 仍存在。
  3. docker volume inspect 找到挂载点,在宿主机直接查看数据目录。
  4. 尝试共享卷给两个 busybox 容器,完成读写验证。