被删库勒索了,怎么使用docker进行MySQL容器的管理?

博主因云服务器MySQL密码简单被入侵删库勒索,重视服务器端应用密码设置。使用docker启动MySQL时,发现MYSQL_ROOT_PASSWORD不生效,经测试发现是数据库文件映射到宿主机,初始化后不再执行该密码设置,删除宿主机文件重启容器可解决,最后附上启动脚本。

大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn


起因:云服务器MySQL密码设置的太简单了,导致到被入侵删库后被勒索比特币了,幸好只是一个练习项目,所以没什么影响。

以下数据库已被删除:keyauth。 我们有完整的备份。 要恢复它,您必须向我们的比特币地址bc1qeezukfupskw05my46rfucy3ffddd02dzq0wask支付0.015比特币(BTC)。 如果您需要证明,请通过以下电子邮件与我们联系。 duan00192@proton.me 。 任何与付款无关的邮件都将被忽略!

另外发现数据库的’root’@’%’这条记录被删除,导致远程连接不上

在这里插入图片描述

这个问题一般新数据库不会出现,但发生后也有解决方法:

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'PASSWORD';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

但也引起了我对服务器端应用密码设置的重视

平常使用docker启动我的MySQL服务器,重建docker容器后,发现我设置的MYSQL_ROOT_PASSWORD不生效,重新启动后发现还是需要使用原密码才可以登录。 这就让我感到很奇怪了啊。MYSQL_ROOT_PASSWORD的不就是设置root账户的默认登录密码的吗?

经过反复的测试,删除容器,重启启动,删除镜像重新拉取,最后都是没有效果。 然后我想看看我的数据库文件存放的位置,发现了一个小问题。

因为数据库文件是放在宿主机的,映射到容器内部。导致每次容器启动的时候,会去判断数据库文件是否被初始化。 我发现,如果文件被初始化后,就不会去执行MYSQL_ROOT_PASSWORD设置的密码。

删除宿主机文件,重启容器后发现

mysql | 2021-04-12 17:08:31+08:00 [Note] [Entrypoint]: Initializing database files

在容器启动过程中,我发现了初始化数据库文件的执行记录,容器启动后,我发现密码确实是我设置的MYSQL_ROOT_PASSWORD的密码。

最后,附上自己的MySQL启动脚本

mkdir ~/mysql
cd ~/mysql

docker run -id \
-p 3306:3306 \
--name=mysql \
--restart always \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=yourmysqlpassword \
mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--default-time_zone='+8:00'

docker exec –it c_mysql /bin/bash

2023年1月27日更

大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn


<think>好的,用户想了解Docker数据备份和快速恢复的最佳实践。首先,我需要回顾之前的对话,用户之前询问了Grafana的多联合查询,而我的回答涉及了Docker备份的相关引用,现在用户明确转向Docker的数据管理。 用户提到的引用1到5涉及Docker数据卷备份、MySQL备份、安全实践、整体迁移以及MongoDB备份。需要整合这些信息,但可能用户主要关注的是Docker的数据卷和容器备份恢复的最佳方法,而不是特定数据库MySQL或MongoDB,不过这些例子可以作为参考。 用户的需求是“最佳实践”,意味着他们可能希望得到步骤清晰、高效且安全的方法。需要分步骤说明,涵盖备份和恢复,同时考虑数据卷、容器配置、镜像等方面。 首先,数据卷备份是关键,因为这是Docker持久化数据的主要方式。引用1提到使用docker volume inspect找到数据卷路径进行备份,这是一个方法。另外,引用4中的docker commit和docker save可以备份镜像,但用户需要注意镜像和容器数据的区分。 其次,恢复步骤需要安全,比如停止容器删除旧数据卷,再恢复,如引用2中的MySQL恢复步骤。需要提醒用户谨慎操作,避免数据丢失。 另外,最佳实践部分需要考虑自动化备份,如使用脚本或cron作业,以及监控和验证备份的有效性,如引用2提到的自动化备份和引用3的安全措施,如更新Docker和最小权限原则。 需要注意用户可能混淆容器和数据卷的备份,需明确区分。同时,可能提到使用docker-compose或编排工具来管理,便于恢复环境,如引用3中的编排工具。 最后,确保回答结构清晰,步骤详细,并包含注意事项,如权限、测试备份等,参考引用中的安全建议。需要综合各个引用中的有效方法,整理出系统性的最佳实践。</think>### Docker数据备份与快速恢复最佳实践 --- #### 一、核心备份对象 1. **数据卷(Volumes)** Docker数据持久化的核心载体,存储数据库、配置文件等重要数据[^1]。 2. **容器配置(docker-compose.yml/容器参数)** 定义容器运行环境的元数据。 3. **镜像(Images)** 用于快速重建容器环境的基础组件[^4]。 --- #### 二、数据备份方案(分场景) --- ##### 场景1:**数据卷备份** **适用场景**:MySQL、Redis等数据库或应用持久化数据 **步骤**: 1. **定位数据卷路径** ```bash docker volume inspect <volume_name> | grep "Mountpoint" ``` 输出示例:`/var/lib/docker/volumes/mysql_data/_data`[^1] 2. **直接备份宿主机文件** ```bash # 压缩备份(示例备份MySQL数据卷) tar -czvf mysql_backup_$(date +%Y%m%d).tar.gz -C /var/lib/docker/volumes/mysql_data/_data . ``` 3. **验证备份完整性** ```bash tar -tf mysql_backup_20231001.tar.gz | head -n 5 ``` --- ##### 场景2:**容器全量快照** **适用场景**:需要完整保存容器状态(数据+配置) **步骤**: 1. **提交容器为镜像** ```bash docker commit <container_id> myapp_backup:20231001 ``` 2. **导出镜像为压缩包** ```bash docker save myapp_backup:20231001 > myapp_backup_20231001.tar ``` 3. **同步备份到远程存储** ```bash rsync -avz myapp_backup_20231001.tar user@backup-server:/backup/ ``` [^4] --- ##### 场景3:**数据库专用备份** **适用场景**:MySQL、MongoDB等需要事务一致性的数据库 **方法**: ```bash # MySQL逻辑备份(推荐) docker exec mysql-container mysqldump -u root -p"password" --all-databases > full_dump.sql # MongoDB时间点恢复(oplog回放) mongodump --host <replica_set> --oplog --out /backup/mongodb/ mongorestore --oplogReplay --oplogLimit "<timestamp>" /backup/mongodb/ [^5] ``` --- #### 三、快速恢复方案 --- ##### 恢复类型1:**数据卷恢复** **步骤**: 1. **停止相关容器** ```bash docker stop mysql-container && docker rm mysql-container ``` 2. **清空旧数据卷(谨慎操作!)** ```bash docker volume rm mysql_data ``` 3. **创建新数据卷并还原** ```bash docker volume create mysql_data tar -xzvf mysql_backup_20231001.tar.gz -C $(docker volume inspect mysql_data --format '{{.Mountpoint}}') ``` 4. **重启容器** ```bash docker run -d --name mysql-new -v mysql_data:/var/lib/mysql mysql:8.0 ``` [^2] --- ##### 恢复类型2:**镜像级恢复** **步骤**: ```bash # 加载备份镜像 docker load < myapp_backup_20231001.tar # 重新运行容器(保持与原环境参数一致) docker run -d --name myapp-restored -v app_data:/data myapp_backup:20231001 ``` --- #### 四、最佳实践与注意事项 1. **自动化备份** - 使用`cron`定时任务执行备份脚本 - 集成到CI/CD流水线(如Jenkins Pipeline) ```bash # 示例每日凌晨备份 0 2 * * * /opt/scripts/docker_backup.sh ``` [^2] 2. **3-2-1备份原则** - 至少保存3份备份 - 使用2种不同介质(如本地磁盘+云存储) - 1份离线存储(防勒索软件)[^3] 3. **安全防护** - 备份文件加密(如使用`openssl enc`) - 限制备份目录权限:`chmod 600 /backups` - 定期轮换备份密钥[^3] 4. **验证与演练** - 每月执行一次恢复测试 - 使用`diff`对比恢复后数据哈希值 ```bash sha256sum /var/lib/docker/volumes/mysql_data/_data/* > checksum.txt ``` --- #### 五、工具推荐 | 工具 | 用途 | 特点 | |--------------------|-----------------------------|-------------------------| | **Docker Compose** | 定义备份/恢复环境 | 版本控制容器配置 | | **BorgBackup** | 去重加密备份 | 节省存储空间,支持增量备份 | | **Rclone** | 同步到云存储(S3/MinIO等) | 多协议支持,加密传输 | --- ### 总结 Docker数据备份需根据**数据类型**(结构化/非结构化)和**恢复目标**(全量/增量)选择策略。关键原则:**定期验证备份可恢复性**,并遵循最小权限原则保障备份安全。对于生产环境,建议结合逻辑备份(如`mysqldump`)与物理备份(数据卷快照)实现双重保障。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值