容器删了数据就没了?Docker卷的备份恢复,别等出事才想起来

来源:互联网 时间:2026-08-31

用Docker跑MySQL的站长,最该问自己的一个问题:数据库文件现在能被备份脚本摸到吗?数据在卷(volume)里,如果卷是匿名卷、或者备份脚本只tar了网站目录,那数据库其实处于裸奔状态,容器一坏就只能恢复到上次手动导出的时点。

先搞清楚自己的数据在哪。Docker存数据两种方式:bind mount直接挂宿主机目录(docker-compose.yml里写 ./mysql:/var/lib/mysql这种),数据就在明面上,好办;named volume(只写个名字),实际存放在/var/lib/docker/volumes/下面,路径深还得root权限,很多备份脚本就是在这里漏掉的。

# 恢复:先起个空库容器
docker run -d --name mysql-restore -e MYSQL_ROOT_PASSWORD=test \
-v ./restore:/docker-entrypoint-initdb.d mysql:5.7
gunzip < all.sql.gz > ./restore/init.sql
# 容器首次启动会自动执行init目录里的sql,起来即恢复

MySQL这种数据库直接tar目录有个隐患:备份时数据库还在写,tar出来的文件可能前后不一致,恢复时启动报错。正规做法是mysqldump导出逻辑备份,容器化环境下用docker exec执行。

# 每日备份脚本(cron凌晨3点)
#!/bin/bash
BACKUP=/backup/mysql/$(date +%F)
mkdir -p $BACKUP

docker exec mysql容器名 \
mysqldump -uroot -p密码 --all-databases --single-transaction \
| gzip > $BACKUP/all.sql.gz

# 备份完顺手传异地
rsync -az $BACKUP/ backup@备机:/backup/mysql/

# 保留30天
find /backup/mysql -mtime +30 -delete

恢复演练必须做,没恢复过的备份等于没有备份。找个测试容器,把sql.gz灌回去,起来之后抽查几张表的数据。

# 恢复:先起个空库容器
docker run -d --name mysql-restore -e MYSQL_ROOT_PASSWORD=test \
-v ./restore:/docker-entrypoint-initdb.d mysql:5.7
gunzip < all.sql.gz > ./restore/init.sql
# 容器首次启动会自动执行init目录里的sql,起来即恢复

网站文件这类静态数据不用这么讲究,直接tar挂载目录就行。建议一套完整的备份清单:网站目录、MySQL逻辑备份、docker-compose.yml和所有配置文件、SSL证书。最后一样最容易被忘,证书丢了重新签发要时间,中间域名验证还可能卡住。

数据来源:Docker官方文档 

相关文章

标签:

A5创业网 版权所有