docker
  • docker教程
  • advanced
    • Docker 构建缓存指南
    • Docker清理数据卷(volume prune)
    • Docker分配CPU资源
    • Dockerfile+Maven插件构建SpringBoot镜像(推荐)
    • Dockerfile构建SpringBoot镜像
    • docker-find-volume-container-mapping
    • idea配置docker
    • Docker inspect 检测所有容器挂载状态的脚本
    • Docker inspect 查看容器、镜像的高级用法
    • Docker Jenkins进阶配置
    • 基于jenkins容器部署SpringBoot应用构建镜像(基于Dockerfile+Maven插件构建)
    • Maven插件构建SpringBoot镜像(二)
    • 基于Maven插件为SpringBoot应用构建镜像并推送到远程_私人仓库(Docker Hub)
    • Maven插件构建SpringBoot镜像(一)
    • Docker MongoDB进阶配置
    • Docker 多阶段构建指南
    • Docker MySql进阶配置
    • Docker network进阶配置
    • Docker Nginx进阶配置
    • Docker清理悬空镜像(空(none)镜像)
    • Docker pip install --no-cache-dir
    • Docker redis进阶配置
    • Docker安全的清理匿名数据卷
    • Docker Bind Mount vs Volume 的区别
  • concepts
    • docker、docker engine和docker desktop区别
    • 架构
    • 什么是容器?
    • 什么是镜像?
    • 什么是Docker?
    • 什么是仓库?
  • docker-compose
    • Docker Compose 锚点的用法
    • docker-compose 编排多服务
    • docker-compose 常用命令
    • docker-compose 部署jenkins
    • docker-compose安装mySql
    • docker-compose网络配置
    • docker-compose安装nginx
    • docker-compose安装redis
    • docker Compose 示例1
  • docker-hub
    • Docker Hub账号服务说明
  • install
    • CentOS Docker 安装
    • Debian Docker 安装
    • Docker 安装 Apache
    • Docker 安装 CentOS
    • Docker 安装 Elasticsearch
    • Docker 安装 GitLab
    • Docker 安装 Jenkins
    • Docker 安装 MongoDB
    • Docker 安装 MySQL
    • Docker 安装 Nginx
    • Docker 安装 Node.js
    • Docker 安装 PHP
    • Docker 安装 Portainer
    • Docker Python 官方镜像使用说明(TAG说明)
    • Docker 安装 Python
    • Docker 安装 Redis
    • Docker 安装 Tomcat
    • Docker 安装 Ubuntu
    • Docker 安装 Wordpress
    • Docker 国内镜像加速
    • MacOS Docker 安装
    • Ubuntu Docker 安装
    • Windows Docker 安装
  • manual
    • Docker attach 命令
    • Docker build 命令
    • Docker 清理命令
    • Docker命令大全
    • Docker commit 命令
    • docker-compose-run-command
    • Docker cp 命令
    • Docker create 命令
    • Docker diff 命令
    • Docker rm 命令
    • Docker exec 命令
    • Docker export 命令
    • Docker history 命令
    • Docker images 命令
    • Docker import 命令
    • Docker info 命令
    • Docker inspect 命令
    • Docker kill 命令
    • Docker load 命令
    • Docker login/logout 命令
    • Docker logs 命令
    • Docker network 命令
    • Docker pause/unpause 命令
    • Docker port 命令
    • Docker 常见问题
    • Docker ps 命令
    • Docker pull 命令
    • Docker push 命令
    • Docker rename 命令
    • docker-resources
    • Docker rm 命令
    • Docker rm 命令
    • Docker run 命令
    • Docker save 命令
    • Docker search 命令
    • Docker start/stop/restart 命令
    • Docker stats 命令
    • Docker tag 命令
    • Docker top 命令
    • Docker version 命令
    • Docker version 命令
    • Docker wait 命令
    • diff
      • Docker Compose 和 docker-compose 区别
      • Docker import、export 与 save、load 命令 区别
  • usage
    • Docker docker-compose 使用
    • Docker 容器连接
    • Docker 容器使用
    • Docker Dockerfile Ptyhon实战配置-1
    • Docker Dockerfile Ptyhon实战配置之多阶段构建-2
    • Docker Dockerfile
    • Docker 镜像使用
    • Docker Machine
    • Docker 仓库管理
    • Swarm集群管理
  • assets
    • mysql
      • my.cnf
Powered by GitBook
On this page
  • Bind Mount(绑定挂载)
  • Volume(卷)
  • 主要区别对比
  • 使用场景
  • 实际示例
  • 1. 数据库持久化命令
  • 2. 多容器共享数据命令
  • 3. 关键区别与建议
  • 安全考虑
  • 最佳实践建议

Was this helpful?

  1. advanced

Docker Bind Mount vs Volume 的区别

Docker 中 Bind Mount 和 Volume 是两种不同的数据持久化方式,它们各有特点和适用场景。

Bind Mount(绑定挂载)

定义:将主机文件系统中的特定目录或文件直接挂载到容器内的指定路径。

特点:

  • 直接使用主机的文件系统路径

  • 完全依赖主机的目录结构

  • 提供了主机和容器之间的直接文件访问

  • 性能通常更好,因为没有额外的抽象层

语法:

# 使用 -v 参数
docker run -v /host/path:/container/path image_name

# 使用 --mount 参数(推荐)
docker run --mount type=bind,source=/host/path,target=/container/path image_name

Volume(卷)

定义:由 Docker 管理的存储区域,完全由 Docker 引擎控制其生命周期。

特点:

  • 存储在 Docker 管理的位置(通常是 /var/lib/docker/volumes/)

  • 与主机文件系统解耦

  • 可以在多个容器间共享

  • 支持卷驱动程序,可以存储在远程主机或云端

语法:

# 创建命名卷
docker volume create my_volume

# 使用卷
docker run -v my_volume:/container/path image_name
docker run --mount source=my_volume,target=/container/path image_name

主要区别对比

特性
Bind Mount
Volume

管理方式

手动管理主机路径

Docker 自动管理

路径位置

主机任意路径

Docker 管理目录

可移植性

依赖主机路径结构

完全可移植

性能

直接访问,性能好

略有开销,但通常可忽略

备份

需要手动处理

可使用 Docker 工具

权限管理

继承主机权限

Docker 管理权限

跨平台

路径格式依赖操作系统

平台无关

使用场景

Bind Mount 适用于:

  • 开发环境中需要实时编辑代码

  • 需要访问主机特定配置文件

  • 日志文件需要直接写入主机目录

  • 需要与主机系统紧密集成

Volume 适用于:

  • 生产环境的数据持久化

  • 数据库存储

  • 多容器间数据共享

  • 需要备份和迁移的数据

  • 容器编排(如 Docker Compose、Kubernetes)

实际示例

Bind Mount 示例:

# 开发时挂载源代码目录
docker run -d \
  --mount type=bind,source="$(pwd)"/app,target=/usr/src/app \
  node:alpine

# 挂载配置文件
docker run -d \
  --mount type=bind,source=/etc/nginx/nginx.conf,target=/etc/nginx/nginx.conf,readonly \
  nginx

Volume 示例:

# 数据库持久化
docker run -d \
  --mount source=mysql_data,target=/var/lib/mysql \
  mysql:8.0

# 多容器共享数据
docker run -d --name app1 -v shared_data:/data alpine
docker run -d --name app2 -v shared_data:/data alpine

1. 数据库持久化命令

docker run -d --mount source=mysql_data,target=/var/lib/mysql mysql:8.0
  • 挂载类型: 未指定 type 时,Docker 默认使用 type=volume(即 ​​命名卷​​)。

  • 行为:

    • 若 mysql_data 卷不存在,Docker 会自动创建该命名卷,数据存储在 /var/lib/docker/volumes/mysql_data/_data。

    • 容器内的 /var/lib/mysql 目录会与命名卷关联,数据持久化且独立于容器生命周期。


2. 多容器共享数据命令

docker run -d --name app1 -v shared_data:/data alpine
docker run -d --name app2 -v shared_data:/data alpine
  • 挂载类型:-v 参数未指定宿主机路径时,默认行为与 --mount type=volume 相同,即 ​​命名卷​​(shared_data)。

  • 行为:

  • 多个容器共享同一命名卷 shared_data,数据在容器间同步。

  • 卷数据存储在 /var/lib/docker/volumes/shared_data/_data,即使容器删除,数据仍保留。


3. 关键区别与建议

参数
默认类型
数据位置
适用场景

--mount source=...

type=volume

/var/lib/docker/volumes/<卷名>

需要显式控制挂载选项时

-v 卷名:容器路径

type=volume

/var/lib/docker/volumes/<卷名>

快速创建命名卷

  • 显式声明类型更安全: 推荐补充 type=volume 以避免歧义,例如:

    docker run -d --mount type=volume,source=mysql_data,target=/var/lib/mysql mysql:8.0
  • 匿名卷与命名卷: 若省略卷名(如 -v /data),Docker 会创建匿名卷(随机ID),但不利于管理。

安全考虑

Bind Mount 的安全风险:

  • 容器可以访问和修改主机文件系统

  • 可能暴露敏感的主机信息

  • 权限控制相对复杂

Volume 的安全优势:

  • 隔离性更好

  • Docker 统一管理权限

  • 减少主机文件系统暴露

最佳实践建议

  1. 开发环境:使用 Bind Mount 方便调试和实时更新

  2. 生产环境:优先使用 Volume 确保数据安全和可移植性

  3. 配置文件:小型配置文件可用 Bind Mount,大型配置建议用 Volume

  4. 日志管理:根据日志收集策略选择合适方式

  5. 数据备份:Volume 配合 Docker 备份工具更方便

选择哪种方式主要取决于你的具体需求:是否需要直接访问主机文件系统、数据的可移植性要求、以及安全性考虑等因素。

PreviousDocker安全的清理匿名数据卷Nextconcepts

Last updated 2 days ago

Was this helpful?