mcpField
D
docker-storage

docker-storage

github.com/full-stack-skills云与 DevOps3106 次安装4 周前更新
代码仓库

关于 docker-storage

docker-storage 是面向开发者和运维人员的 Docker 数据持久化指导技能,涵盖 Volume、绑定挂载、tmpfs、数据库存储、备份及存储驱动,并提供命令示例与常见问题说明。

主要功能

  1. 01比较 Volume、绑定挂载和 tmpfs
  2. 02创建并检查命名 Volume
  3. 03配置数据库持久化
  4. 04备份和恢复 Volume 数据
  5. 05选择并检查存储驱动
  6. 06排查常见存储问题

适用场景

  1. 01持久保存数据库容器的数据
  2. 02开发时将应用代码同步到容器
  3. 03将临时或敏感数据保存在内存
  4. 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.yaml
examples/
01-mysql-volume-persistence.md
02-backup-restore.md
references/
01-volume-decision-guide.md
02-volume-management.md
03-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 存储https://docs.docker.com/storage/
Volumeshttps://docs.docker.com/storage/volumes/
Bind Mountshttps://docs.docker.com/storage/bind-mounts/
tmpfshttps://docs.docker.com/storage/tmpfs/
存储驱动https://docs.docker.com/storage/storagedriver/
docker volume 命令https://docs.docker.com/reference/cli/docker/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: 支持中文文档和中文注释,详见国内适配章节。

评论

支持 Markdown