前言:
现时各位老铁们对“docker commit 数据持久化”大体比较关心,姐妹们都想要学习一些“docker commit 数据持久化”的相关内容。那么小编也在网摘上网罗了一些对于“docker commit 数据持久化””的相关资讯,希望你们能喜欢,大家快快来学习一下吧!Volume数据卷的由来:
Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。
为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。
简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。
特点:
one、数据卷可以在容器间共享和重用数据。
two、数据卷可以在宿主和容器间共享数据。
three、数据卷数据可以直接修改。
four、数据卷是持续性的,直到没有容器使用它们。
等等。
补充:
容器在运行期间产生的数据是不会写在镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。
关于Docker数据持久化:
one、Docker提供数据卷或者数据容器卷。
two、通过commit提交一个新的镜像来保存产生的数据。
1、创建数据卷
1.1、在家目录Dokcer下创建目录volume/data
mkdir volume/data -p
以centos的image为例:
1.2、启动容器
docker run -it -v /home/odysee/Docker/volume/data centos bash
-it:
-i: 以交互模式运行容器,通常与-t同时使用。
-t: 为容器重新分配一个伪输入终端,通常与-i同时使用。
/home/odysee/Docker/volume/data:容器会自动创建该目录
1.3、在容器内data下touch一个文件
echo 'call me volume!' > volFile
1.4、在查看宿主机查看数据卷对应的目录
新开一个终端
docker ps:查看运行的容器。
docker inspect containerid:获取容器的元数据。
查找Mounts 对象的JSON数据
"Source": "/var/lib/docker/volumes/cc7b696a836c284bf3941a58eb53168c86b2a9697c7cafa82693c922ed510459/_data"
这就是对应我们宿主机的目录
1.5在宿主机内查看volFile文件
在下面追加一行
1.6、到容器中查看volFile文件
如下图,已经更新
2、 挂载宿主机文件/目录到容器数据卷
可以直接挂载宿主机文件或目录到容器里,可以理解为目录映射,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据。
注意:
one:-v后面的映射关系是<宿主机文件/目录:容器里对应的文件/目录>。
two:宿主机上的文件/目录是要提前存在的,容器里对应的文件/目录会自动创建。
2.1、创建挂载目录
在家目录的Dokcer下创建目录tmp/vol/tmpFile文件
echo 'I am a file!'>tmpFile
2.2、启动容器
docker run -it -v /home/odysee/Docker/tmp/vol:/tmp/vol centos bash
在容器内查看tmpFile文件
在tmpFile文件中追加一行
2.3、在宿主机中查看tmpFile文件
3、 创建数据卷容器
3.1、创建数据卷目录volume
3.2、启动容器A_Container
docker run -it -v /tmp/volume --name A_Container centos bash
-it:
-i: 以交互模式运行容器,通常与-t同时使用。
-t: 为容器重新分配一个伪输入终端,通常与-i同时使用。
--name:为容器指定一个名称。
/tmp/volume:容器会自动创建该目录。
在volume中创建一个文件
3.3、查看宿主机上与数据卷对应的目录路径
新开一个终端
docker ps:查看运行容器id。
docker inspect containerid:获取容器的元数据。
查找Mounts 对象的JSON数据
"Source": "/var/lib/docker/volumes/30021380d4b6ebdfb92fcce1b7478528a43ac9796056252a78ff79df5935d4f9/_data"
这就是对应我们宿主机的目录
查看一下宿主机中文件
3.4、创建B_Container容器,挂载A_Container容器中的数据卷
docker run -it --volumes-from A_Container --name B_Container centos bash
-it:
-i: 以交互模式运行容器,通常与-t同时使用。
-t: 为容器重新分配一个伪输入终端,通常与-i同时使用。
--volumes-from:挂载A_Container容器中的数据卷。
--name:为容器指定一个名称。
建议多开几个终端
如下图
B_Container容器已经挂载了A_Container容器中的数据卷
docker ps
3.5、创建C_Container容器,挂载A_Container/B_Container[皆可]容器中的数据卷
docker run -it --volumes-from A_Container --name C_Container centos bash
docker ps
3.6、补充
删除了初始的数据卷容器A_Container,或是删除了B_Container等等其它容器。
只要是有容器使用该数据卷,那么它里面的数据就不会丢失。
4、 删除数据卷
/var/lib/docker/volumes目录中存在数据卷的遗留目录。
删除方法:
One:docker rm -v
remove容器时添加了-v选项。
Two:
docker run --rm
运行容器时添加了--rm选项。
4.1、测试方法one[方法two不做操作]
启动一个容器
docker run -d -v tmp/volume centos bash
查看容器volume的name
docker inspect 3e3c71453ea497
找到Mounts
"Name": "16289588bf94e8aa53d0ff0a138380d34ee87e42f54926cfbb0762a82827e59a"
查看volume:
docker volume ls
发现了刚刚挂载的volume的name
如下图:宿主机中有很多容器volume遗留的产物
删除数据卷:
docker rm -vf 3e3c71453ea4
-f:通过SIGKILL信号强制删除一个运行中的容器。
-v:删除与容器关联的卷。
16289588bf94e8aa53d0ff0a138380d34ee87e42f54926cfbb0762a82827e59a:
在宿主机中此volume已经被delete
5、备份数据卷
docker run -it --rm --volumes-from one_Container
-v $(pwd):/backup centos
tar cvf /backup/backup.tar /var/volume
命令解释:
1、启动一个新的容器从one_Container容器中挂载数据卷
2、挂载当前目录[$(pwd)]到容器中的backup
3、备份/var/volume卷中所有的数据为backup.tar
4、执行完成之后删除容器数据卷
5、备份就在当前的目录[$(pwd)]下,名为backup.tar
注意:后面的/var/volume是数据卷的目录路径。
案例:
5.1、创建一个容器one_Container并且创建一个数据卷/var/volume
docker run -it -v /var/volume --name one_Container centos bash
在容器内volume/创建一个文件volumeFile
5.2、备份容器one_Container数据卷/var/volume
docker run -it --rm --volumes-from one_Container
-v $(pwd):/backup centos
tar cvf /backup/backup.tar /var/volume
如下图:
备份成功
解压并查看volumeFile文件
测试完成。
欢迎大家给予宝贵的意见或者建议。
欢迎大家补充或者共享一些其他的方法。
感谢支持。