这是一份 ECS 上维护 Docker Compose 基础服务的记录。场景是一个小型业务环境,使用 Compose 跑 app、mysql、redis 和反向代理。
维护目标:
- 固定数据库和缓存镜像版本。
- 确认 MySQL 数据卷位置。
- 做逻辑备份并恢复验证。
- 升级前预拉镜像,避免窗口期卡在拉取。
1. 检查最终配置
docker compose config
MySQL 服务建议明确写命名卷:
services:
mysql:
image: docker.1ms.run/mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: change-me
MYSQL_DATABASE: app
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
2. 检查 volume
docker volume ls
docker volume inspect 项目名_mysql-data
如果项目目录改过,需要特别注意 Compose 项目前缀是否变化。项目前缀变化后,新卷名字也会变化。
3. 备份 MySQL
docker compose exec mysql sh -c 'mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" app' > mysql-app.sql
恢复验证:
cat mysql-app.sql | docker compose exec -T mysql sh -c 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" app'
如果恢复失败,先处理用户、密码、数据库名、字符集和版本差异,不要进入升级步骤。
4. 检查 Redis
如果 Redis 只是缓存,重建影响有限。如果 Redis 承载队列或会话,需要挂载 /data 并确认持久化策略:
services:
redis:
image: docker.1ms.run/redis:7
command: ["redis-server", "--appendonly", "yes"]
volumes:
- redis-data:/data
云服务器上还要检查安全组和端口暴露,不要把 Redis 直接暴露到公网。
5. 预拉镜像
docker pull docker.1ms.run/mysql:8.4
docker pull docker.1ms.run/redis:7
docker pull docker.1ms.run/nginx:1.27-alpine
预拉通过后,再执行升级:
docker compose pull
docker compose up -d
6. 回滚准备
维护前记录:
- 旧镜像 tag。
- 当前
compose.yaml。 - 数据库备份文件。
- 关键 volume 名称。
- 恢复验证结果。
小结
ECS 上跑 Compose 服务时,镜像、容器、数据卷要分开处理。容器可以重建,镜像可以重拉,数据卷必须先备份并验证恢复。维护窗口里要解决的是升级,不应该临时排查备份能不能用。