前言
使用 docker 自带的 volume 机制进行数据的持久化,docker会在宿主机的特定位置(/var/lib/docker/volumes)维护各个volumes,
面对容器删除的问题,有如下几个结论:
- 容器启动(docker run)时,即使没有显示的指定-v -mount参数,容器的相关数据已经被作为volumes持久化存储了,比如在/var/lib/docker/volumes下面,所以数据是在的。
- 但如果 docker run时,显示指定使用了tmpfs的mount类型,删除容器时才会被清理。
- 或者如果docker rm时指显示定了-v参数,也会连带删除容器依赖的volumes数据。
所以,只要没有手残强制使用了临时存储或者删除时强制指定了删除数据,数据还是在的。
如何恢复
-
- 找到删除容器对应的volumes
-
- 基于一样的镜像启动新的容器
-
- 将之前的volumes迁移/挂载到新的容器上
怎么找到删除容器的volumes
通过ls或者du等命令来观察目录的创建时间和大小,来推断删除容器的volumes是哪(几)个。比如mysql的容器,那么大小一般比较大
注: 找到volume后先进行备份
启动新的容器
基于之前的镜像,直接启动容器,通过inspect命令查看新容器的volume名称。
docker inspect 容器ID
如果对于镜像的使用比较了解了,则可以直接在启动时,将找到的volumes挂载到正确的位置即可略过第3步骤:将之前的volumes迁移/挂载到新的容器上
将之前的volume迁移/挂载到新的容器上
- 执行docker stop 新容器停止新容器。
- 使用mv命令,在/var/lib/docker/volumes中将步骤1获取的目录的名称修改为步骤2获取的新容器的目录名称:mv 旧的volume名称 新的volume名称。
- 执行docker start 新容器再次启动新容器。