解决服务器空间满/var/lib/docker/overlay2占用很大,千万慎用 docker system prune -a清理 mongodb等数据库容器及镜像可能被删,找回恢复数据
项目场景:提示:这里简述项目相关背景:例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)问题描述:提示:这里描述项目中遇到的问题:例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据APP 中接收数据代码:@Override public void run() { bytes = mmInStream.read(buffer
项目场景:
服务器空间满,想清理一下。发现是docker太大,/var/lib/docker/overlay2占用很大49G,网站也访问不了,mongodb前一天也停了。用这个清理docker system prune -a,结果把数据库的镜像及容器全删了。mysql等正常的容器及镜像都没影响,那些停了的没用的全删了。
千万慎用这个来清理 docker system prune -a,一定要先备份。
问题描述:
清理docker空间 docker system prune -a
清了7G左右,还误把mongodb等容器及镜像删除,数据也没备份。怎么找回并恢复数据?
还有好几个nodejs容器及镜像被删,这个好办有备份。

原因分析:
没想到空间满,会导致很多容器停止服务。
没想到清理时,会删一些有用的东西。
涉及删除,都有谨慎。一定要先备份,能恢复。
千万慎用这个来清理 docker system prune -a,一定要先备份。
恢复解决方案:
docker mongodb的数据和配置在宿主机上默认有挂载,所以数据没丢。找到并复制数据到新容器里重启就行。具体如下:
- 新建一个mongodb镜像及容器
docker pull mongo
docker run -itd --name mongo -p 27017:27017 mongo
docker inspect mongo
可以看到挂到宿主机上的两个目录
配置目录/data/configdb是空的
数据目录/data/db 数据存在这里, 对应挂到宿主机目录为
/var/lib/docker/volumes/4d77ddb447a42bf1242fb3acb7686a6e1f50f44a5c420d1a3a3370f0e0fc7c69/_data

进入目录,看到目录数据结构。因为是默认是匿名挂载,路径是一串字符,容器及镜像被删不好知道哪一个是要找的mongodb数据,找出特征,然后目录搜,搜到导入数据来试。
我觉得应该都带有mongod.lock这个文件

搜到了4个
可以看日期或目录大小(du -h --max-depth=1)大致判断是哪一个,也可以每个都导入然后用mongo客户端看。我是直接cp,重启容器,再mongodb客户端看。
#我是先在FTP里把新的的容器/var/lib/docker/volumes/481a5cd20939019e21d54d11479eeb5cf2c3d475fd6d030fe31c5b5d76ba7750/_data/下的文件先删了,再复制。
cp -rf /var/lib/docker/volumes/d703574b4a27ef7b32f5d0810aaa60e9ec19f7fb2f01a1dc7d711eecc1b5e096/_data/* /var/lib/docker/volumes/481a5cd20939019e21d54d11479eeb5cf2c3d475fd6d030fe31c5b5d76ba7750/_data/
#重启容器
docker restart mongo
#进入容器测试一下,看是否正常启动,显示welcome等
docker exec -it mongo mongo admin
#以下非必要操作
#进入mongodb容器后mongodb看数据库
show dbs
#mongodb创建用户
db.createUser({ user:'root',pwd:'root',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
进入 mongodb客户端,已经恢复成功。
把所有与mongdb相关的应用重启,看到有数据插入,界面能显示,系统恢复OK。
docker restart test_kjmon_1
docker restart kjapi
docker restart kjweb
docker restart test_kjapp_1
docker restart test_kjtcpserver_1

千万慎用这个来清理 docker system prune -a,一定要先备份。
全部指令
#------------------docker mongodb恢复
docker pull mongo:latest
docker stop mongo
docker rm mongo
docker run -itd --name mongo -p 27017:27017 mongo
docker exec -it mongo mongo admin
cd /var/lib/docker
find -name mongod.lock
#找到 原数据位置
/var/lib/docker/volumes/4d77ddb447a42bf1242fb3acb7686a6e1f50f44a5c420d1a3a3370f0e0fc7c69/_data
#运行mongo
docker run -itd --name mongo -p 27017:27017 mongo:latest
#查看信息
docker inspect mongo
#得到 新数据位置
/var/lib/docker/volumes/536c49ef1edc205778adb688460d6aaac2f9a768075ba83b621306f1e1ae96d4/_data
#先清空再复制
cp -rf /var/lib/docker/volumes/4d77ddb447a42bf1242fb3acb7686a6e1f50f44a5c420d1a3a3370f0e0fc7c69/_data/* /var/lib/docker/volumes/536c49ef1edc205778adb688460d6aaac2f9a768075ba83b621306f1e1ae96d4/_data/
#重启mongo
docker restart mongo
#检查正常后,重启应用
docker restart test_kjmon_1
docker restart kjapi
docker restart kjweb
docker restart test_kjapp_1
docker restart test_kjtcpserver_1
docker服务器空间满解决方案:??
57G / 根目录
36G /var/lib/docker/overlay2
8.8G /var/lib/docker/containers 容器
2.2G /var/lib/docker/volumes 使用卷 数据持久化挂载
看上去是/var/lib/docker/overlay2占用很大,你还没法直接删减这里的文件。这就要知道这个文件夹是干什么用的?

更多推荐
所有评论(0)