数据卷管理
一. 实验目的:
1.
熟悉数据卷的基本工作原理;
2.
掌握数据卷操作的常用命令;
3.
熟悉数据卷容器的基本工作原理;
4.
掌握数据卷容器操作的常用命令;
二. 实验环境:
Ubuntu16.04+Docker
三. 实验内容:
练习使用数据卷和数据卷容器操作的常用命令
四.实验练习
(一) 创建数据卷
1.新建一个以ubuntu14.04为镜像,名叫web1的交互式容器,并且设置数据卷/html1。
docker create --name web1 -it -v /html1 ubuntu:14.04
![](https://i-blog.csdnimg.cn/blog_migrate/2372f7e55e13181e095150fc6f7e6a4a.png)
2. 启动容器web1: docker start -i start web1
3. 向数据卷web1中新建一个文件夹123,内容也是123.使用ctrl+P+Q 暂时退出docker容器,
但是保持容器一直运行.
![](https://i-blog.csdnimg.cn/blog_migrate/717dcecdc51b6b0f740a9c2c6b118c62.png)
4.在宿主机上,使用docker inspect 来查看一下上面的那个数据卷的目录路径:
docker inspect web1|grep /var/lib/docker/volumes
![](https://i-blog.csdnimg.cn/blog_migrate/09abf0c3b5bffd9651a60560d4038923.png)
5.并在宿主机上查看本地数据卷文件的内容
cat /var/lib/docker/volumes/273e6d1723ddb58baf3f9a925c932423e514e2ac996d85ca5793f778d73a1ab4/_data/123
![](https://i-blog.csdnimg.cn/blog_migrate/39a44719546ed96be67748f28eff3c2b.png)
6.向文件123中,添加新的内容test
echo "test" >>/var/lib/docker/volumes/273e6d1723ddb58baf3f9a925c932423e514e2ac996d85ca5793f778d73a1ab4/_data/123
![](https://i-blog.csdnimg.cn/blog_migrate/85fffbe89da3864c33661410e248a77c.png)
7.再次进入刚刚创建的容器web1 并且进入/html1目录查看文件123的值是否发生变化?
![](https://i-blog.csdnimg.cn/blog_migrate/744e744512786a53652d71fd5f36c6df.png)
8.利用docker CLI中专有命令来创建数据库,数据卷名称为html3并且查看数据卷的详细信息
docker vollume create --name html3
docker inspect html3
![](https://i-blog.csdnimg.cn/blog_migrate/bcf8b27eb740886bc2bb4068ab74d915.png)
(二)挂载数据卷
①
挂载宿主机文件到容器上。
在宿主机上创建一个目录/html,并在目录中创建一个新文件web.list,内容为192.168.1.1
![](https://i-blog.csdnimg.cn/blog_migrate/bd51ab8aac54833497fd585442e02e2a.png)
以ubuntu:14.04为模板,创建一个容器web4,挂载宿主机文件/html4/web.list到容器/html4/web.list中,并且挂载共享的数据设置为只读。
进入容器之后,用echo命令往/html4/web.list中写数据,是否可以写入,为什么?
![](https://i-blog.csdnimg.cn/blog_migrate/902c82e2a5a86069d0166d6d9f4907eb.png)
用ctrl+p+q退出容器,但是不关闭容器,发现在宿主机中可以修改数据卷的内容。
![](https://i-blog.csdnimg.cn/blog_migrate/dd80def037fa566a9698872b3b516ff5.png)
②
挂载宿主机目录到容器上
在宿主机上创建一个目录/var/spp,并在目录中新建两个文件test1和test2,内容为test1和test2。以ubuntu:14.04为模板,创建一个容器web6,挂载宿主机文件/var/spp到容器/var/spp中。
![](https://i-blog.csdnimg.cn/blog_migrate/5a1ab47011b984dfcda6f9cfcabe23dc.png)
(3)挂载多个目录到容器上
在宿主机中新建两个目录/var/spp1和/var/spp2,在/var/spp1中新建文件test1,内容为123456,在/var/spp2中新建文件test2,内容为qwert。以ubuntu:14.04为模板,新建一个容器web7,并且挂载两个目录/var/spp1和/var/spp2,并且把/var/spp2目录设置为只读。在容器内,查看/var/spp1/test1内容,并且向/var/spp2/test2中添加数据asdfg,请问是否能够添加成功,为什么?
![](https://i-blog.csdnimg.cn/blog_migrate/c10f12539398079ba1da76e67343b645.png)
(三)删除数据卷
① 直接删除数据卷
我们可以通过docker提供的数据卷管理命令,查看宿主机中所有的数据卷,并且删除它。
Docker volume list //列出宿主机中的所有数据卷
Docker volume rm volumeID //直接删除,但是这样会误删
![](https://i-blog.csdnimg.cn/blog_migrate/754aaaa1419e882cd107be1896e42a45.png)
② 随着容器删除数据卷
Volume 只有在下列情况下才能被删除:
1)docker rm -v删除容器时添加了-v选项,只有无人使用该数据卷时候,才会被真正删除!
2)docker run --rm运行容器时添加了--rm选项
可以使用 docker rm -v 命令在删除容器时删除该容器的卷。示例如下:
![](https://i-blog.csdnimg.cn/blog_migrate/1b2d6c83bf3bce4edbe16093f8f911e2.png)
(四) 设置数据卷的VOLUME指令
VOLUME指令可以向镜像创建的容器中添加数据卷,数据卷可以在容器之间共享和重用。数据卷的修改是立即生效的。volume格式:
VOLUME [“/data”,”/data2”]
VOLUME /data
举例:
FROM ubuntu:14.04
RUN mkdir /app && echo“hello” >/app/test.txt
VOLUME /home
CMD [“cat”,”/app/test.txt”]
然后构建:docker build -t test .
执行:docker run --rm test(容器退出时就能够自动清理容器内部的文件系统。)
输出hello
![](https://i-blog.csdnimg.cn/blog_migrate/7358a912a5d6161d78e7ddbf465c67fb.png)
在本地创建一个文件:
mkdir local
echo “here is a test”>~/local/test.txt
再次运行容器,使用-v参数指定/app目录,然后查看cat结果,发现目标文件并不是容器上的test.txt文件,而是宿主机上的test.txt文件
docker run --rm -v ~/local:/app test
输出结果是here is a test
![](https://i-blog.csdnimg.cn/blog_migrate/2e532c27e6d78e3c04c4646ab873aec9.png)
(五)挂在一个数据卷容器
启动一个名为container1容器,此容器包含两个数据卷/var/volume1和/var/volume2(这两个数据卷目录是在容器里的,容器创建的时候会自动生成这两目录)查看/var/volume1是空的
![](https://i-blog.csdnimg.cn/blog_migrate/cc141d5ca63881d31dbb5cbf09336586.png)
用docker inspect 命令查看宿主机上与数据卷对应的目录路径:
![](https://i-blog.csdnimg.cn/blog_migrate/fed2ce648d89747cf6b1f2692378b5ef.png)
由上面命令结果可以查到,两个数据卷/var/volume1和/var/volume2下的数据在/var/lib/docker/volumes/下对于的两个目录的_data下面
创建App1_container容器,挂载container1容器中的数据卷
![](https://i-blog.csdnimg.cn/blog_migrate/771e22890ca6202edea1e6aa02619e38.png)
可以再创建一个容器,挂载App1_container中从container1挂载的数据卷。当然也可以直接挂载初始的container1容器数据卷
![](https://i-blog.csdnimg.cn/blog_migrate/3b440d636bc7ae81ce404451fdca4258.png)
即便是删除了初始的数据卷容器App1_container,或是删除了其它容器,但只要是有容器在使用该数据卷,那么它里面的数据就不会丢失。
(六) 数据卷迁移
自拟题目,进行数据卷的备份操作和恢复导出操作!
备份:
我们先创建一个data容器.
docker run -i -t -v /data --name data ubuntu:14.04 /bin/bash
上面创建的data数据卷容器挂载了data目录.
为了验证数据卷容器的备份功能,在挂载的/data目录下创建一个data文件,并写入内容"data"。
然后为了利用数据卷容器备份,使用 –volumes-from 标记来创建一个加载data容器卷的容器,并从主机挂载当前目录到容器的/backup目录。
docker run -i -t --volumes-from data -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/backup.tar /data
$(pwd)是docker支持的指定当前目录的方法
容器启动后,在当前目录下生成的backup.tar文件就是data容器卷的备份文件。
这样,数据卷容器中的数据就备份完成。
![](https://i-blog.csdnimg.cn/blog_migrate/263393fe7a963ee4cd383f5da80d9c47.png)
恢复
首先,创建一个带有空数据卷的容器data1。
docker run -itd -v /data --name data1 ubuntu:14.04 /bin/bash
然后,创建另一个容器,挂载data1容器卷中的数据卷,并使用untar解压备份文件到挂载的容器卷中。
docker run --volumes-from data1 -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/backup.tar
这个时候,之前备份的数据卷容器的数据已经恢复到了容器data1中了。
为了查看和验证恢复的数据,我们可以再启动一个容器挂载data1容器卷来查看。
![](https://i-blog.csdnimg.cn/blog_migrate/6f9d144e743ebbbb8edfbe38e8cc9d17.png)