DOCKER 在运行过程中可能出于某种原因而无法start, 在这种情况下读取里面的文件系统进行数据恢复就很重要了, 大体思路如下:
- 查看CONTAINER的dm设备号;
- 使用dmsetup 创建一个dm指向dm设备号;
- 使用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 无法启动也可以获取重要的数据;
- docker run的时候进行重要目录的挂载;
- 在使用DOCKERFILE build镜像的时候可以使用VOLUME 挂载数据目录, 即使docker run的时候未挂载目录, docker 也会把这个目录进行文件分层, 挂载到VOLUME目录下
root@web00:/var/lib/docker/volumes# ls
1becdb63b9a967027c2beb8a990fc15fedf8f3b52f7c665af6dd5c467818071b 86c20230fbdcae19e2a8e147dbe192101d35e1efe2e4325ffde2c3e063e6c826
- 如果没有使用上述, 出现了状况, 可以尝试上述的恢复方法了。