Docker Compose 数据卷备份恢复:MySQL/Postgres/Redis 升级前检查清单
本文记录一套 Docker Compose 基础服务升级前的检查流程适用于开发环境、小团队测试机、自托管服务和轻量业务系统。核心对象是 MySQL、Postgres、Redis 这类有状态服务。目标不是讲 Docker Compose 入门而是避免这类事故Compose 项目换目录后数据库像新装的一样。执行docker compose down -v后命名卷也被移除。旧环境用了匿名卷新环境没有挂回旧数据。MySQL/Postgres 有备份文件但没有恢复演练。Redis 默认当缓存用实际业务却依赖它的状态。1. 先分清三类对象对象典型命令升级时怎么处理镜像docker pull固定 tag提前预拉容器docker compose up -d可重建检查环境变量和端口数据卷docker volume inspect先备份再恢复验证数据库容器最重要的不是容器 ID而是数据目录背后的 volume。2. down 和 down -v 的区别docker compose down会停止并移除容器、网络等资源但默认不会删除命名卷。带上-v后会移除 Compose 文件中声明的命名卷和匿名卷。建议维护脚本里不要随手写dockercompose down-v除非你确认这是一次彻底销毁环境并且数据已经备份、恢复也验证过。3. 推荐写稳定命名卷Postgres 示例services:db:image:docker.1ms.run/postgres:16environment:POSTGRES_USER:appPOSTGRES_PASSWORD:change-mePOSTGRES_DB:appvolumes:-db-data:/var/lib/postgresql/datavolumes:db-data:MySQL 示例services:mysql:image:docker.1ms.run/mysql:8.4environment:MYSQL_ROOT_PASSWORD:change-meMYSQL_DATABASE:appvolumes:-mysql-data:/var/lib/mysqlvolumes:mysql-data:Redis 示例services:redis:image:docker.1ms.run/redis:7command:[redis-server,--appendonly,yes]volumes:-redis-data:/datavolumes:redis-data:这里的重点是数据库目录必须挂到稳定的命名卷或明确路径不要靠匿名卷碰运气。4. 升级前检查命令查看最终配置dockercompose config查看当前卷dockervolumels查看卷详情dockervolume inspect 项目名_db-data查看服务使用的挂载dockerinspect 容器名--format{{json .Mounts}}如果看到数据库写在匿名卷里先停下来处理迁移不要直接升级。5. MySQL 备份和恢复备份dockercomposeexecdbsh-cmysqldump -uroot -p$MYSQL_ROOT_PASSWORD appmysql-app.sql恢复验证catmysql-app.sql|dockercomposeexec-Tdbsh-cmysql -uroot -p$MYSQL_ROOT_PASSWORD app注意点不要只备份 volume tar 包就结束。逻辑备份更容易跨环境验证。大版本升级前先在临时环境导入一次。6. Postgres 备份和恢复备份dockercomposeexec-Tdb pg_dump-Uapp apppg-app.sql恢复验证catpg-app.sql|dockercomposeexec-Tdb psql-Uapp app注意点POSTGRES_USER、POSTGRES_DB、POSTGRES_PASSWORD要和恢复命令一致。跨大版本升级时先看官方镜像关于PGDATA和数据目录的说明。生产大库需要更严肃的备份方案本文只覆盖 Compose 小环境和轻量维护。7. Redis 要先判断是不是状态服务Redis 如果只是缓存重建影响可能可控。如果承载队列、会话、任务状态就要明确持久化策略。建议检查dockercomposeexecredis redis-cli CONFIG GET appendonlydockercomposeexecredis redis-cli CONFIG GETdir需要持久化时至少确认/data已挂载到稳定卷。RDB 或 AOF 策略符合业务预期。没有把无密码 Redis 暴露到公网。8. 镜像预检放在恢复演练之后维护窗口前可以先拉固定版本镜像dockerpull docker.1ms.run/postgres:16dockerpull docker.1ms.run/mysql:8.4dockerpull docker.1ms.run/redis:7dockerpull docker.1ms.run/adminer:latest毫秒镜像1ms.run在这里解决的是镜像预检问题数据库镜像、管理工具镜像和业务基础镜像别到维护窗口才开始拉。它不替代备份也不替代恢复验证。9. 最终检查表步骤检查项通过标准1docker compose config卷、端口、环境变量清楚2docker volume ls关键数据卷有稳定名字3docker volume inspect挂载点和项目标签确认4逻辑备份MySQL/Postgres 有可迁移备份5恢复演练临时环境能导入6Redis 策略明确缓存还是状态服务7镜像预拉固定 tag 能拉取8回滚记录旧镜像 tag 和旧备份可用总结Docker Compose 让容器重建变得很轻但有状态服务不能按无状态服务处理。升级前先确认数据卷、备份、恢复演练再处理镜像预检和服务重启。这个顺序不复杂但能避开很多低级事故。