当前位置: 首页 > news >正文

第四部分-Docker网络与存储——20. 数据持久化

20. 数据持久化

1. 数据持久化概述

容器默认情况下数据是临时的,当容器删除时数据也会丢失。数据持久化是生产环境中必须解决的问题,Docker 提供了多种数据持久化方案。

┌─────────────────────────────────────────────────────────────┐ │ Docker 数据持久化方案 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Volume(推荐) │ │ │ │ - Docker 管理 │ │ │ │ - 独立于容器生命周期 │ │ │ │ - 支持多种驱动 │ │ │ │ - 适合生产环境 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Bind Mount(开发) │ │ │ │ - 宿主机任意路径 │ │ │ │ - 直接访问宿主机文件 │ │ │ │ - 适合开发环境 │ │ │ │ - 配置文件共享 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ tmpfs(内存) │ │ │ │ - 内存存储 │ │ │ │ - 速度最快 │ │ │ │ - 临时数据 │ │ │ │ - 敏感信息 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘

2. Volume(数据卷)

2.1 创建和管理

# 创建数据卷dockervolume create mydata# 列出数据卷dockervolumels# 查看数据卷详情dockervolume inspect mydata# 显示数据卷位置# Mountpoint: /var/lib/docker/volumes/mydata/_data# 删除数据卷dockervolumermmydata# 清理未使用的卷dockervolume prune# 强制清理所有未使用卷dockervolume prune-f

2.2 使用数据卷

# 使用命名卷dockerrun-d-vmydata:/app/data--nameapp nginx# 使用 --mount 语法(推荐)dockerrun-d--mountsource=mydata,target=/app/data nginx# 只读挂载dockerrun-d--mountsource=mydata,target=/app/data,readonly nginx# 使用匿名卷(不推荐)dockerrun-d-v/app/data nginx# 查看卷使用情况dockerinspect app|grep-A10Mounts

2.3 卷驱动

# 使用本地驱动(默认)dockervolume create--driverlocalmydata# 使用 NFS 驱动dockervolume create--driverlocal\--opttype=nfs\--optdevice=:/path/to/nfs\--opto=addr=nfs-server,rw,nfsvers=4\nfs-volume# 挂载 NFS 卷dockerrun-d-vnfs-volume:/data nginx# 使用第三方驱动(如 Flocker)# docker volume create --driver flocker mydata

3. Bind Mount

3.1 基础用法

# 基础语法dockerrun-d-v/host/data:/app/data nginx# 使用 --mount(推荐)dockerrun-d--mounttype=bind,source=/host/data,target=/app/data nginx# 相对路径dockerrun-d-v$(pwd)/data:/app/data nginx# 只读绑定dockerrun-d--mounttype=bind,source=/host/config,target=/app/config,readonly nginx# 绑定单个文件dockerrun-it--mounttype=bind,source=/host/config.json,target=/app/config.json alpinesh

3.2 权限管理

# 指定用户 IDdockerrun-d--user1000:1000-v/host/data:/app/data nginx# 修改宿主机目录权限sudochown-R1000:1000 /host/datasudochmod755/host/data# SELinux 标签(CentOS/RHEL)dockerrun-d-v/host/data:/app/data:Z nginx# 私有dockerrun-d-v/host/data:/app/data:z nginx# 共享

4. tmpfs 挂载

# 使用 tmpfsdockerrun-d--tmpfs/app/tmp:rw,noexec,nosuid,size=100m nginx# 使用 --mount 语法dockerrun-d--mounttype=tmpfs,destination=/app/tmp,tmpfs-size=100m nginx# 查看 tmpfs 使用dockerexeccontainer_namedf-h/app/tmp# 适用场景:# - 临时文件# - 缓存数据# - Session 存储# - 敏感信息(不落盘)

5. 数据备份与恢复

5.1 备份数据卷

# 备份卷到 tar 文件dockerrun--rm\-vmydata:/source\-v$(pwd):/backup\alpine\tarczf /backup/mydata-backup.tar.gz-C/source.# 备份 bind mountdockerrun--rm\-v/host/data:/source\-v$(pwd):/backup\alpine\tarczf /backup/data-backup.tar.gz-C/source.# 备份多个卷dockerrun--rm\-vvolume1:/source1\-vvolume2:/source2\-v$(pwd):/backup\alpine\sh-c"tar czf /backup/backup.tar.gz /source1 /source2"

5.2 恢复数据卷

# 创建新卷dockervolume create newdata# 从备份恢复dockerrun--rm\-vnewdata:/target\-v$(pwd):/backup\alpine\tarxzf /backup/mydata-backup.tar.gz-C/target# 验证恢复dockerrun--rm-vnewdata:/data alpinels-la/data

5.3 容器迁移

# 导出容器数据CONTAINER_NAME=myappBACKUP_FILE=myapp-data.tar.gzdockerrun--rm\--volumes-from$CONTAINER_NAME\-v$(pwd):/backup\alpine\tarczf /backup/$BACKUP_FILE/data# 在新宿主机恢复dockercreate-v/data--name>dockerrun--rm\--volumes-from>\-v$(pwd):/backup\alpine\tarxzf /backup/$BACKUP_FILE-C/

6. 卷管理策略

6.1 命名规范

# 推荐命名格式# <project>-<environment>-<purpose># 示例dockervolume create myapp-prod-dbdockervolume create myapp-prod-logsdockervolume create myapp-prod-uploadsdockervolume create myapp-dev-db

6.2 卷标签

# 创建带标签的卷dockervolume create\--labelproject=myapp\--labelenvironment=production\--labelbackup=true\myapp-data# 过滤卷dockervolumels--filterlabel=project=myappdockervolumels--filterlabel=environment=production# 清理特定标签的卷dockervolume prune--filterlabel=project=temporary

6.3 卷清理策略

# 定期清理(crontab)# 0 2 * * * docker volume prune -f# 清理 24 小时前使用的卷dockervolume prune--filter"until=24h"# 查找并删除特定模式的卷dockervolumels-q--filtername=temp-|xargsdockervolumerm# 删除所有未使用卷dockervolume prune-a

7. 实战示例

7.1 MySQL 数据持久化

# 创建数据卷dockervolume create mysql-datadockervolume create mysql-logs# 运行 MySQL 容器dockerrun-d\--namemysql\-vmysql-data:/var/lib/mysql\-vmysql-logs:/var/log/mysql\-eMYSQL_ROOT_PASSWORD=root123\mysql:8.0# 测试数据持久化dockerexecmysql mysql-uroot-proot123-e"CREATE DATABASE testdb"dockerstop mysqldockerstart mysqldockerexecmysql mysql-uroot-proot123-e"SHOW DATABASES"

7.2 WordPress 持久化

# 创建卷dockervolume create wordpress-dbdockervolume create wordpress-files# MySQLdockerrun-d\--namewp-mysql\-vwordpress-db:/var/lib/mysql\-eMYSQL_ROOT_PASSWORD=root\-eMYSQL_DATABASE=wordpress\mysql:8.0# WordPressdockerrun-d\--namewordpress\-p8080:80\-vwordpress-files:/var/www/html\--linkwp-mysql:mysql\wordpress:latest# 备份dockerrun--rm\-vwordpress-db:/source\-vwordpress-files:/source-files\-v$(pwd):/backup\alpinesh-c"tar czf /backup/wordpress-backup.tar.gz /source /source-files"

7.3 开发环境热重载

# 使用 bind mount 实现代码热重载dockerrun-d\--namedev-app\-p3000:3000\-v$(pwd):/app\-v/app/node_modules\node:14\npmrun dev

8. 存储对比

特性VolumeBind Mounttmpfs
位置Docker 管理任意路径内存
持久性
容器删除保留保留删除
备份容易容易N/A
跨主机需要驱动需要共享N/A
性能最快
权限自动手动自动
适用生产数据开发配置临时数据

9. 监控与调试

# 查看卷使用情况dockersystemdf# 查看卷详情dockervolume inspect mydata# 查看卷中文件dockerrun--rm-vmydata:/data alpinels-la/data# 查看卷大小dockerrun--rm-vmydata:/data alpinedu-sh/data# 调试卷内容dockerrun--rm-it-vmydata:/data alpinesh

10. 最佳实践

✅ 推荐做法

  1. 生产环境使用 Volume
  2. 开发环境使用 Bind Mount
  3. 敏感数据使用 Volume 或 tmpfs
  4. 为卷设置标签便于管理
  5. 定期备份重要数据卷
  6. 使用命名卷而非匿名卷

❌ 避免事项

  • 在容器可写层存储持久数据
  • 在生产环境使用 Bind Mount 存储应用数据
  • 忽视卷的备份策略
  • 删除容器后忘记清理卷

11. 常见问题

Q1: 容器删除后数据还在吗?

Volume 数据还在,Bind Mount 数据还在,容器层数据丢失。

Q2: 多个容器可以共享同一个卷吗?

可以,支持多容器读写同一个卷。

Q3: 如何迁移卷到另一台主机?

使用docker volume inspect定位卷位置,复制 _data 目录到新主机。

12. 小结

  • Volume:生产环境推荐,Docker 管理
  • Bind Mount:开发环境,直接访问宿主机
  • tmpfs:内存存储,临时数据
  • 备份恢复:使用 Docker 容器配合 tar
  • 卷管理:标签、清理策略
  • 根据场景选择合适的存储方案
  • 定期备份重要数据

http://www.jsqmd.com/news/791953/

相关文章:

  • 对比直接使用厂商API,通过Taotoken调用大模型的延迟体感差异
  • Umi-OCR终极指南:免费开源离线文字识别工具全解析
  • 跨平台流媒体下载技术解析:如何用现代架构解决DRM内容获取难题
  • Vivado里用OSERDESE2+OBUFDS实现LVDS输出,一个完整可复用的Verilog模块(含XDC约束)
  • 如何快速提取Unity游戏素材:AssetStudio完整使用指南
  • 面试官与谢飞机的三轮灵魂拷问:从Spring Boot启动到分布式事务
  • 第四部分-Docker网络与存储——21. 高级存储
  • 3分钟搞定Jable视频下载:终极免费解决方案完整指南
  • 品牌打造的低成本高回报之路
  • Unity UGUI点击事件避坑指南:为什么你的Image点了没反应?
  • 为什么92%的企业LLMOps平台在Q3失效?SITS 2026披露4个被忽略的合规性断点与2小时热修复路径
  • Windows和Office终极激活指南:告别烦恼的智能解决方案
  • 2025届学术党必备的五大AI辅助论文平台推荐
  • ECharts地图可视化踩坑实录:从GeoJSON数据获取到本地开发跨域问题的全链路解决
  • 09-扩展知识——08. timedelta 类
  • 赔偿出炉了,N+3/N+4!
  • 终极视频加速神器:如何用Video Speed Controller提升300%学习效率
  • 2025届最火的六大AI论文网站解析与推荐
  • 告别虚拟机卡顿:在Windows 11的WSL2里为树莓派4B编译Automotive Grade Linux镜像
  • SITS 2026正式实施倒计时18个月,你的需求团队还在手写PRD?揭秘头部金融科技公司已上线的NL2REQ生产环境架构
  • PostgreSQL 9.2 + PostGIS 2.1 安装后必做的三件事:验证、避坑与第一个空间查询
  • Anylogic建模效率翻倍秘诀:活用‘智能体类型’实现模块化设计与复用
  • C语言程序设计核心详解 函数和预编译命令
  • 一帧贴图片
  • 程序员转大模型,这8个必备框架,新手也能快速落地项目
  • 视频水印怎么去掉?手机电脑去除视频水印教程,2026免费安全方法全汇总 - 科技热点发布
  • 水下压力传感器哪家好 优质源头生产厂家品牌排行榜 - WHSENSORS
  • 应对高并发场景,Taotoken API稳定性架构设计参考
  • 镜像复刻现实 智慧驱动孪生
  • 【管理科学】【财务领域】第四十九篇 企业资本通过金融工具获取资本与通过制造舆论冲突吸引注意力01