Docker 数据卷挂载


数据卷(Volume)的概念

  • 数据卷是一个虚拟目录,用于建立容器内目录宿主机目录之间的映射关系。
  • 作用:实现容器与宿主机之间的数据共享和持久化存储。

为什么需要数据卷?

  1. 持久化数据
    容器默认是临时(ephemeral)的,删除后内部数据丢失。数据卷可将数据存储在宿主机,避免丢失。
  2. 跨容器共享数据
    多个容器可挂载同一数据卷,实现数据共享(如微服务场景)。
  3. 开发便捷性
    绑定挂载支持实时同步宿主机的文件改动到容器内,提升开发效率。

数据卷的类型

类型 特点 适用场景
命名卷 用户自定义名称,通过 docker volume create 创建,易于管理。 生产环境、需要持久化的数据
匿名卷 由 Docker 自动生成随机名称,生命周期与容器绑定。 临时数据存储
绑定挂载 直接映射宿主机指定目录到容器,路径需手动指定。 开发调试、配置文件动态更新

常用命令

  1. 创建命名卷
    1
    docker volume create my-volume
  2. 启动容器并挂载卷
    • 挂载命名卷:
      1
      docker run -v my-volume:/container/path image_name
    • 绑定挂载宿主机目录:
      1
      docker run -v /host/path:/container/path image_name
  3. 查看所有卷
    1
    docker volume ls
  4. 删除卷
    1
    2
    3
    docker volume rm my-volume
    # 清理未使用的卷
    docker volume prune

关键注意事项

  1. 权限问题
    • 容器内进程需有权限访问挂载目录(如避免 root 用户写入导致宿主机权限冲突)。
    • 可通过 chmod 调整宿主机目录权限,或在容器启动时指定用户(-u 参数)。
  2. 性能差异
    • 绑定挂载直接操作宿主机文件系统,性能较高;
    • 命名卷由 Docker 管理,适合跨容器共享。
  3. 匿名卷的生命周期
  • 若未显式删除,匿名卷可能在容器删除后残留,需定期清理。

最佳实践

  • 开发环境:优先使用绑定挂载,实时同步代码变更。
  • 生产环境:使用命名卷,确保数据持久化和易管理。
  • 数据备份:通过备份宿主机上数据卷目录(如 /var/lib/docker/volumes/)实现数据迁移。

示例场景

1
2
3
4
5
6
# 开发时挂载本地代码到容器
docker run -v $(pwd)/src:/app/src my-app

# 生产环境使用命名卷
docker volume create app-data
docker run -v app-data:/data my-db

通过数据卷挂载,Docker 实现了灵活的数据管理,平衡了开发便捷性与生产环境的稳定性需求。