数据卷管理实验

一. 实验目的:

  1. 熟悉数据卷的基本工作原理;
  2. 掌握数据卷操作的常用命令;
  3. 熟悉数据卷容器的基本工作原理;
  4. 掌握数据卷容器操作的常用命令;

二. 实验环境:

Ubuntu16.04+Docker

三. 实验内容:

  1. 练习使用数据卷和数据卷容器操作的常用命令;

四、 实验练习:

(一)创建数据卷

新建一个以ubuntu14.04为镜像,名叫web1的交互式容器,并且设置数据卷/html1。

docker create --name web1 -it  -v /html1 ubuntu:14.04

启动容器web1:docker start -i web1

向数据卷html1中新建一个文件123,内容也是123。使用ctrl+p+q暂时退出docker容器,但是保持容器一直运行。

在宿主机上,使用docker inspect来查看一下对应上面的那个数据卷的目录路径:

docker inspect web1|grep /var/lib/docker/volumes

并在宿主机上查看本地数据卷中文件的内容

cat /var/lib/docker/volumes/b92ee1515941a876f010ad75fd178a1d8cf5686aa4db24 e9bc089bcd3b62deab/_data/123

echo "test" >> /var/lib/docker/volumes/b92ee1515941a876f010ad75fd178a1d8cf5686aa4db24e9bc089bcd3b62deab/_data/123

再次进入刚刚创建的容器web1,并且进入/html1目录查看文件123的值是否发生变化?

利用docker CLI中专有命令来创建数据卷,数据卷名称为html3并且查看数据卷的详细信息

docker volume create --name html3

docker inspect html3

(二)挂载数据卷

1.挂载宿主机文件到容器上。

在宿主机上创建一个目录/html,并在目录中创建一个新文件web.list,内容为192.168.1.1

以ubuntu:14.04为模板,创建一个容器web4,挂载宿主机文件/html4/web.list到容器/html4/web.list中,并且挂载共享的数据设置为只读。

docker run -it --name web4 -v /html4/web.list:/html4/web.list:ro ubuntu:14.04 /bin/bash

进入容器之后,用echo命令往/html4/web.list中写数据,是否可以写入,为什么?

不能,因为文件只能读取

用ctrl+p+q退出容器,但是不关闭容器,发现在宿主机中可以修改数据卷的内容。

2.挂载宿主机目录到容器上

在宿主机上创建一个目录/var/spp,并在目录中新建两个文件test1和test2,内容为test1和test2。以ubuntu:14.04为模板,创建一个容器web5,挂载宿主机文件/var/spp到容器/var/spp中。

docker run -it --name web5 -v /var/spp:/var/spp ubuntu:14.04 /bin/bash

3.挂载多个目录到容器上

在宿主机中新建两个目录/var/spp1和/var/spp2,在/var/spp1中新建文件test1,内容为123456,在/var/spp2中新建文件test2,内容为abcdef。以ubuntu:14.04为模板,新建一个容器web6,并且挂载两个目录/var/spp1和/var/spp2,并且把/var/spp2目录设置为只读。在容器内,查看/var/spp1/test1内容,并且向/var/spp2/test2中添加数据date2,请问是否能够添加成功,为什么?

不能。文件只有只读权限

(三)删除数据卷

1.直接删除数据卷

我们可以通过docker提供的数据卷管理命令,查看宿主机中所有的数据卷,并且删除它。

docker volume list //列出宿主机中的所有数据卷

docker volume rm volumeID  //直接删除,但是这样会误删

2.随着容器删除数据卷

Volume 只有在下列情况下才能被删除:

1)docker rm -v删除容器时添加了-v选项,只有无人使用该数据卷时候,才会被真正删除!

2)docker run --rm运行容器时添加了--rm选项

可以使用 docker rm -v 命令在删除容器时删除该容器的卷。示例如下:

(四)设置数据卷的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 .

FROM ubuntu:14.04

RUN mkdir /app && echo "hello" >/app/test.txt

VOLUME  /home

CMD  ["cat","/app/test.txt"]

执行:docker run --rm test(容器退出时就能够自动清理容器内部的文件系统。)

输出hello

在本地创建一个文件:

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

(五)挂载一个数据卷容器

启动一个名为container1容器,此容器包含两个数据卷/var/volume1和/var/volume2(这两个数据卷目录是在容器里的,容器创建的时候会自动生成这两目录)查看/var/volume1是空的

docker run -it -v /var/volume1 -v /var/volume2 --name container1 ubuntu:14.04 /bin/bash

用docker inspect 命令查看宿主机上与数据卷对应的目录路径:

docker inspect container1|grep /var/lib/docker/volumes

由上面命令结果可以查到,两个数据卷/var/volume1和/var/volume2下的数据在/var/lib/docker/volumes/下对于的两个目录的_data下面

创建App1_container容器,挂载container1容器中的数据卷

docker run -it --rm --volumes-from container1 --name app_container ubuntu:14.04 /bin/bash

即便是删除了初始的数据卷容器App1_container,或是删除了其它容器,但只要是有容器在使用该数据卷,那么它里面的数据就不会丢失。

(六)数据卷迁移

自拟题目,进行数据卷的备份操作和恢复导出操作!

启动一个命名为vol_simple的容器并创建数据卷(volume)

 docker run -itd --name vol_simple -v /data ubuntu /bin/bash

进入挂载目录写入若干数据,此时在容器内的/data目录下会共享这些数据

docker inspect vol_simple | grep Source

cd

/var/lib/docker/volumes/767a187bcd2bb150322eec974421089e6dace6b303b28233fb0064f419e6c3aa/_data

docker exec -it  vol_simple /bin/bash

备份容器vol_simple的数据卷数据

docker run --rm --volumes-from vol_simple -v $(pwd):/backup ubuntu tar cf /backup/data.tar /data

恢复volume数据到新容器中

docker run -itd --name vol-bck -v /data ubuntu /bin/bash

docker ps

docker run --rm --volumes-from vol-bck -v $(pwd):/backup ubuntu tar xf /backup/data.tar -C /

docker inspect vol-bc | grep Source

docker exec -it vol-bck /bin/bash

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章