关于 docker-storage
docker-storage 是面向开发者和运维人员的 Docker 数据持久化指导技能,涵盖 Volume、绑定挂载、tmpfs、数据库存储、备份及存储驱动,并提供命令示例与常见问题说明。
主要功能
- 01比较 Volume、绑定挂载和 tmpfs
- 02创建并检查命名 Volume
- 03配置数据库持久化
- 04备份和恢复 Volume 数据
- 05选择并检查存储驱动
- 06排查常见存储问题
适用场景
- 01持久保存数据库容器的数据
- 02开发时将应用代码同步到容器
- 03将临时或敏感数据保存在内存
- 04备份或恢复 Docker Volume
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ full-stack-skills/ docker-skills --skill docker-storage安装后在 Claude Code 中输入/docker-storage确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlexamples/01-mysql-volume-persistence.md02-backup-restore.mdreferences/01-volume-decision-guide.md02-volume-management.md03-storage-drivers.md详细介绍
Docker 存储 — 存储与数据持久化
关于在 Docker 中管理持久化数据的全面指南。
适用场景
用户提到以下内容时,始终使用此技能:
- “docker volume”“数据卷”“数据持久化”
- “bind mount”“tmpfs”
- “容器数据怎么保存”“数据不丢失”
- “数据库容器怎么持久化”
- “备份恢复”“存储驱动”
存储类型对比
| 类型 | 持久性 | 性能 | 用途 |
|---|---|---|---|
| Volume | ✅(由 Docker 管理) | 高(原生) | 生产数据库、共享数据 |
| Bind Mount | ✅(主机文件系统) | 高 | 开发(实时同步代码)、配置文件 |
| Tmpfs | ❌(仅内存) | 最高 | 密钥、临时文件、敏感数据 |
可视化对比
Volume: Bind Mount: Tmpfs:
Container Container Container
│ │ │
Docker-managed /host/path Memory only
/var/lib/docker/volumes/ ↕ (no disk)
↕ Container sees: ↕
Container sees: /container/path Container sees:
/data = host files /tmp (in RAM)
Volume 管理
# Create & inspect
docker volume create mydata
docker volume ls
docker volume inspect mydata
# Use in container
docker run -v mydata:/var/lib/mysql mysql:8
docker run --mount source=mydata,target=/var/lib/mysql mysql:8 # explicit syntax (recommended)
# Cleanup
docker volume prune # Remove unused volumes
docker volume rm mydata # Remove specific volume
命名 Volume 与匿名 Volume
-v mydata:/data → Named volume (mydata) — survives container removal ✅
-v /data → Anonymous volume — hard to identify later ❌
Bind Mount
# Read-write bind mount
docker run -v $(pwd)/app:/app nginx
# Read-only (protect host files)
docker run -v $(pwd)/config:/etc/nginx:ro nginx
# Explicit syntax
docker run --mount type=bind,source=$(pwd)/app,target=/app nginx
Tmpfs(内存)
# Ephemeral data, never touches disk
docker run --tmpfs /tmp:rw,noexec,nosuid,size=64m nginx
docker run --mount type=tmpfs,destination=/tmp,tmpfs-size=64m nginx
数据库持久化模式
PostgreSQL
docker volume create pgdata
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=secret \
-v pgdata:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:16-alpine
MySQL
docker volume create mysqldata
docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-v mysqldata:/var/lib/mysql \
-v $(pwd)/my.cnf:/etc/mysql/conf.d/my.cnf:ro \
-p 3306:3306 \
mysql:8.4
Redis(持久化)
docker volume create redisdata
docker run -d \
--name redis \
-v redisdata:/data \
-p 6379:6379 \
redis:7-alpine redis-server --appendonly yes
备份与恢复
# Backup (using a temporary container)
docker run --rm \
-v mysqldata:/source \
-v $(pwd):/backup \
alpine tar czf /backup/mysqldata-backup.tar.gz -C /source .
# Restore
docker run --rm \
-v mysqldata:/target \
-v $(pwd):/backup \
alpine tar xzf /backup/mysqldata-backup.tar.gz -C /target
存储驱动
| 驱动 | 状态 | 说明 |
|---|---|---|
| overlay2 | ✅ 默认 | 适用于大多数场景;写时复制 |
| devicemapper | 已弃用 | - |
| aufs | 已弃用 | - |
| btrfs/zfs | 小众 | 文件系统匹配时使用 |
docker info | grep "Storage Driver" # Check current
工作流 — 推荐配置流程
步骤 1:确定存储类型:持久化数据 → Volume;开发热加载 → Bind Mount;临时缓存 → tmpfs
步骤 2:创建 Volume:docker volume create db_data
步骤 3:挂载到容器:docker run -v db_data:/var/lib/mysql mysql
步骤 4:验证:docker volume inspect db_data + docker exec mysql ls /var/lib/mysql
步骤 5:备份:docker run --rm -v db_data:/source -v $(pwd):/backup alpine tar czf /backup/db.tar.gz -C /source .
注意事项 — 常见问题
- 匿名 Volume 会不断累积:每次使用
-v /data(没有名称)都会创建一个新的匿名 Volume。→ 解决方法:docker volume prune会清理所有未使用的 Volume;使用命名 Volume:-v mydata:/data。 - Bind Mount 路径:必须是绝对路径。→ 解决方法:对于 docker run,使用
-v $(pwd)/app:/app;只有在 Compose 中,-v ./app:/app才有效。 - Bind Mount 权限问题:容器 UID 与主机 UID 不同 → 权限被拒绝。→ 解决方法:使用
--user $(id -u):$(id -g),或在 Dockerfile 入口点中使用RUN chown 1000:1000 /data。 - 移除容器时数据丢失:不使用
-v时,移除容器会丢失数据。--rm标志会让情况更糟。→ 解决方法:始终使用命名 Volume:docker run -v db_data:/var/lib/mysql。 - macOS Bind Mount 性能:Docker Desktop Mac 上的 Bind Mount 速度较慢。→ 解决方法:使用
:cached或:delegated挂载选项,或使用命名 Volume 改善 I/O 性能。
边界 — 能力边界(适用与不适用场景)
| 分类 | 场景 | 说明 |
|---|---|---|
| ✅ 能做 | 数据持久化配置(Volume/Bind Mount/tmpfs) | 三类存储的创建、挂载、管理 |
| ✅ 能做 | 备份与恢复 | 使用 tar + --volumes-from 备份恢复 |
| ✅ 能做 | 存储驱动选型 | 对比 overlay2/btrfs/zfs |
| ⚠️ 需条件 | NFS/云存储 Volume 驱动 | 需安装相应驱动插件 |
| ⚠️ 需条件 | macOS 下 Bind Mount 性能 | 使用 :cached/:delegated 或命名 Volume |
| ❌ 超范围 | K8s PersistentVolume/PVC | 使用 docker-production + K8s 文档 |
| ❌ 超范围 | 分布式文件系统(Ceph/GlusterFS) | 属于系统管理员范畴 |
| ❌ 超范围 | 数据库性能优化 | 属于 DBA 专业领域 |
不适用此技能的场景
| ❌ 跳过 | ✅ 改用 |
|---|---|
| 运行容器(不涉及数据问题) | docker-run |
| 多容器编排 | docker-compose |
| Kubernetes 存储(PV/PVC) | K8s 文档 |
| Docker 基础知识 | docker-basics |
安全与稳定性
- 对容器不应修改的配置文件使用
:ro。 - 未了解安全影响前,切勿绑定挂载 Docker 套接字(
/var/run/docker.sock)。 - 定期备份 Volume,尤其是数据库 Volume。
- 不包含可执行脚本。仅提供指导。
📚 官方文档参考
🧭 Docker Skills Journey
📍 You are here:
docker-storage— 数据持久化
← Previous: docker-run / docker-networking
→ Next: docker-compose / docker-security
FAQ
Q1: 如何快速上手此技能? A: 参考上方的快速开始章节,按步骤操作即可。
Q2: 遇到版本不兼容问题怎么办? A: 检查依赖版本,使用 lock 文件锁定,参考常见陷阱章节。
Q3: 如何在生产环境使用? A: 参考最佳实践章节,确保配置正确,做好监控和日志。
Q4: 性能如何优化? A: 参考性能优化相关文档,使用缓存、索引等手段。
Q5: 如何贡献或反馈问题? A: 在 GitHub 仓库提交 Issue 或 Pull Request。
Q6: 是否支持中文? A: 支持中文文档和中文注释,详见国内适配章节。