Docker数据管理,防止删库跑路?
1️⃣数据管理的目的
1.容器退出后会处于终止 (exited)状态,此时可以通过docker ps -a
查看,其中数据不会丢失,还可以通过docker start来启动,只有删除容器才会清除数据。
2.容器有一个专门的读写层,会保存操作的记录。就算是docker commit
保存的镜像也没有真正修改文件系统。
3.为了保证容器删除后信息一定能够保存(特别是对于数据库的容器),方便后续恢复,我们可以将容器内的数据信息拷贝到宿主机上保存一份。
2️⃣数据卷
1.容器存放数据的目录,也就是数据卷,一般在Dockerfile中有所定义(不是所有的都定义了)。以PSQL为例子,在Dockerfile中可以看到,所以在我们使用此镜像生成容器的时候,不用再手动指定。
2.使用inspect查看psql的容器,可以看到如下信息。其中设置的容器内的目录的内容被映射到了宿主机上随机产生的目录上。
3.进入容器向宿主机映射的目录,可以看到如下容器内映射出来数据信息:
4.相关命令:
-
docker volume ls
:查看宿主机上容器所有数据卷挂载出来的信息。
-
docker volume rm xxxx
(数据卷名称):删除指定的数据卷挂载信息。
-
docker volume inspect xxxx
(数据卷名称):查看卷的信息信息。
3️⃣匿名挂载
定义:据卷挂载出来路径自动产生,其中名称为随机产生的ID。
命令:
docker run -it -v /路径 --name xxx(容器名) yyy(镜像名称)
。其中 /路径为容器内数据卷的位置。
举例:
docker run -it -v /Data/prin --name prin/centos centos
。将容器内数据数据卷/Data/prin
,挂载到宿主机/var/lib/docker/volume/<id>/_data
下。
4️⃣具名挂载
定义:
数据卷挂载出来的名称或者绝对路径由由创建者指定。
情况1:给出容器的名称而代替随机产生的ID。
概述:宿主机映射出来的目录中本来为随机的,现在替换为具体的名称。
命令:
docker run -it -v xxx(名称):/路径 --name xxx(容器名) yyy(镜像名称)
。
举例:
docker run -it -v prin_centos:/Data/prin --name prin/centos centos
。将容器内数据数据卷/Data/prin
,挂载到宿主机/var/lib/docker/volume/prin_centos/_data
下。
情况2:给出映射的绝对路径。
概述:将数据卷内的信息挂载到给出的绝对路径下。
命令:
docker run -it -v /路径1:/路径2 --name xxx(容器名) yyy(镜像名称)
。
举例:
docker run -it -v /Docker_data/centos:/Data/prin --name prin/centos centos
。将容器内数据数据卷/Data/prin
,挂载到宿主机/Docker_data/centos
下。
5️⃣权限控制
概述:可以设置容器对数据卷为只读(默认是读写),宿主机为读写。
命令:
docker run -it -v /Docker_data/Centos(具体路径):/Date/prin:ro(仅读) --name prin/centos(容器名) centos
。其中容器内为只读目录,宿主机为读写目录。
6️⃣同步卷
概述:将多个容器的数据卷和宿主机的同一个目录进行同步。
方法一:
原理:在容器run的时候,设置挂载为同一个目录。
容器1:docker run -it -v /Docker_data/Centos/:/Data/prin --name prin_centos-1 centos
容器2:docker run -it -v /Docker_data/Centos/:/Data/prin --name prin_centos-2 centos
方法二:
原理:使用–volume-from同步卷。
命令:
docker run it --name prin-centos-1 --volumes-from prin-centos centos
。prin-centos-1容器直接使用prin-centos的数据卷。
7️⃣容器恢复
当容器被删除后,其数据还保存在宿主机挂载的目录下,后续重新通过镜像生成容器的时候,再将数据卷挂载在这个目录下即可。
8️⃣可以这样理解
卷:容器的持久化和同步操作,实现容器间数据共享,通过卷将dockers中的数据同步到本地,容器内将目录自动同步到Linux中——双向绑定。防止删除docker导致数据丢失。
我有话说: