离线恢复DOCKER数据

DOCKER 在运行过程中可能出于某种原因而无法start, 在这种情况下读取里面的文件系统进行数据恢复就很重要了, 大体思路如下:

  1. 查看CONTAINER的dm设备号;
  2. 使用dmsetup 创建一个dm指向dm设备号;
  3. 使用mount挂载创建的dm;

示例如下

root@web00:~# docker stop test-mysql
test-mysql
root@web00:~# dmsetup table
docker-253:17-4194307-59d2e44cf4bdb7225b715363f67b2e197a2c930405bfb65676c09c0925b08c4c: 0 209715200 thin 252:0 61
docker-253:17-4194307-pool: 0 209715200 thin-pool 7:1 7:0 128 32768 1 skip_block_zeroing 
docker-253:17-4194307-3c42e2e52773fe3a348beea7ccb002579433589a619658555f2aab7db06eae22: 0 209715200 thin 252:0 25
qtest: 0 209715200 thin 252:0 49
docker-253:17-4194307-054d8c0cf9f8d207822d5b7b2301ad3b28f7113fa6333c42ae3e55426a9a784b: 0 209715200 thin 252:0 7
root@web00:~# cat /data/docker/devicemapper/metadata/77002a40fdf7f87371b848d4527edb04d2d072578128c173031c5a9c1827e801
{"device_id":68,"size":107374182400,"transaction_id":72,"initialized":false,"deleted":false}root@web00:~# dmsetup create qtest2 --table '0 209715200 thin 252:0 68'
root@web00:~# ls /dev/mapper/
control                                                                                 docker-253:17-4194307-3c42e2e52773fe3a348beea7ccb002579433589a619658555f2aab7db06eae22  docker-253:17-4194307-pool  qtest2
docker-253:17-4194307-054d8c0cf9f8d207822d5b7b2301ad3b28f7113fa6333c42ae3e55426a9a784b  docker-253:17-4194307-59d2e44cf4bdb7225b715363f67b2e197a2c930405bfb65676c09c0925b08c4c  qtest
root@web00:~# cd /tmp/
root@web00:/tmp# ls
agent_cmd.sock  ap_1002.pid  ap_1004.pid  ap_1007.pid  ap_1008.pid  ap_1014.pid  cvm_init.log  dm1  net_affinity.log  rabbitmq.tar  rpm_openssl.log  sagent.pid  setRps.log
root@web00:/tmp# mkdir dm2
root@web00:/tmp# mount /dev/mapper/qtest2 /tmp/dm2
root@web00:/tmp# cd /tmp/dm2
root@web00:/tmp/dm2# ls
id  lost+found  rootfs
root@web00:/tmp/dm2# cat id
1940afafd416fd86af6ed7cf8229b4b617490326fe9c0662220e72e5d46088b6root@web00:/tmp/dm2# cd rootfs/
root@web00:/tmp/dm2/rootfs# ls
bin  boot  dev  etc  home  init.sh  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@web00:/tmp/dm2/rootfs# cat init.sh 
dddddddddddddddddd
root@web00:/tmp/dm2/rootfs# cd tmp/
root@web00:/tmp/dm2/rootfs/tmp# ls
ssssssssssss
  • 写了个脚本, github地址: https://github.com/b01u/some-scripts/blob/master/docker_dm_mount.sh

最好的做法就是在docker run的时候或之前就把数据挂载出来, 即使docker 无法启动也可以获取重要的数据;

  1. docker run的时候进行重要目录的挂载;
  2. 在使用DOCKERFILE build镜像的时候可以使用VOLUME 挂载数据目录, 即使docker run的时候未挂载目录, docker 也会把这个目录进行文件分层, 挂载到VOLUME目录下
root@web00:/var/lib/docker/volumes# ls
1becdb63b9a967027c2beb8a990fc15fedf8f3b52f7c665af6dd5c467818071b  86c20230fbdcae19e2a8e147dbe192101d35e1efe2e4325ffde2c3e063e6c826
  1. 如果没有使用上述, 出现了状况, 可以尝试上述的恢复方法了。

你可能感兴趣的:(离线恢复DOCKER数据)