docker数据卷与数据卷容器以及备份与恢复

一、数据卷

前言:

​ 在生产环境中使用Docker,往往需要对数据进行持久化,或者需要再多个容器之间进行数据共享,而这个必然涉及到容器的数据管理操作

​ 在容器中对数据进行管理的方式主要有两种:

数据卷 Data Volume:容器内部的数据直接映射到本地主机环境中

数据卷容器 Data Volume Container:指定一个容器进行管理管理维护数据卷

1、什么是数据卷

数据卷 Data Volumes

​ 简单来讲的话,数据卷就是在本地主机中可以在容器之间进行共享和重用的一些文件或者文件夹,通过docker run -v 的形式进行对数据卷挂载到对应的容器目录空间,进行文件读取

它可以提供有很多的有用的特性

  1. 数据卷可以在容器之间共享和重用
  2. 对数据卷的修改会即刻生效
  3. 对数据卷进行升级,不会影响到镜像
  4. 数据卷默认情况下会一直存在,即使是容器被删除

数据卷的操作方式类似于linux中对目录或者文件进行mount的方式,将一个容器或者多个容器中的目录进行以挂载的形式挂载到宿主机

2、为什么要使用数据卷

在创建容器的时候不使用数据卷的时候一般会遇到一下几个问题:

  1. 当创建一个容器的时候,容器在运行的时候,数据能不能持久化?
  2. 如果能持久化,数据存储在哪里?由于Docker是个例的,数据能否存储在容器外部?
  3. 如果部署很多的容器,每次都需要进入到容器中进行配置吗?能不能在外部进行部署?

Docker数据卷在呈现给Docker容器的形式就是一个目录,而且,该目录支持多个容器间进行共享,修改数值并不会对镜像产生影响。上面也说了,使用Docker数据卷,类似于系统中使用mount进行挂载一个文件系统来修改差不多

Volume的作用恰巧就能尽量的解决这些问题:

Volume的作用

  1. 通过数据卷可以在容器之间实现共享和重用
  2. 对数据卷的修改会直接生效,非常适合作为开发环境
  3. 数据卷在更新的时候,并不会去修改容器镜像中的数值
  4. 数据卷本身会一直存在,并不会因为某个连接的容器挂到或者删除而消失

3、创建数据卷

创建容器并且挂载到数据卷

docker run -it -p 8808:80 --name nginx_1 -v /opt/test:/opt nginx:1.12 /bin/bash
#创建一个nginx容器,映射端口是8808,名字为nginx_1,将容器中opt目录以挂载的形式到宿主机目录中的opt下的test目录

挂载完成之后,进行测试

容器
	#先到容器中到达共享的目录中,上面我们测试的就是opt目录
 	cd /opt/
 	#到opt下先查看当前目录下有什么文件
 	ls
 	#当前还没有进行创建文件或者目录,所以是空的
 
宿主机
	#到宿主机中,同样是到指定好的目录中
	 pwd
	 /opt/test
	#到达之后先随便创建一个文件
	touch 1.txt
	#创建之后,再去容器中查看一下,就可以看到已经有了一个相同的文件
	
容器
	ls
	1.txt
	#并且,在宿主机找那个对这个文件进行管理的话,会实时同步到容器中

上面,将一个容器添加到数据卷中已经完成了,上面也说了,可以在一个数据卷中可以添加多个容器

docker run -it -p 8809:80 --name nginx_2 -v /opt/test:/opt nginx:1.12 /bin/bash

创建第二个容器之后,不用再进行在数据卷中常见新的文件,因为现在已经存在有文件。直接到容器中的共享目录中查看即可

容器中
	cd /opt/
	ls
	1.txt
#就可以看到上面我们创建的文件

最后再试试,将两个容器都关闭之后,数据卷是否还存在

docker rm -f `docker ps -qa`
#批量删除容器,因为我这就是测试使用的,所以只运行了更改创建的两个,可以直接无脑全清
cd /opt/test/ && ls
1.txt
#查看之后,刚刚创建的文件还是正常存在,当创建新的容器的时候,指定该目录,可以直接将其目录下文件给共享过去

注:容器在共享目录到主机中的时候,数据是双向的也就是,容器中创建文件的时候,主机中也会多一个文件,删除的时候,主机中也会少一个文件。

如果只想要容器中拥有只读权限,可以在-v指定路径的最后,添加上:ro即可,例如:

docker run -it --name nginx_1 -v /opt/test:/opt:ro nginx:1.12 /bin/bash
#在容器中的目录后添加ro,设置为只读则不能对文件进行更改动作
rm -f 1.txt
#结果如下
rm: cannot remove '1.txt': Read-only file system

vi 1.txt
#对内容进行修改之后保存的结果如下
E45: 'readonly' option is set (add ! to override)

二、数据卷容器

上面大致介绍了一下数据卷的创建方式,并且展示了共享多个容器,下面再介绍一下第二个,数据卷容器

1、什么是数据卷容器

数据卷容器 Data Volume Container

​ 结合上面的数据卷,顾名思义,数据间容器是在多个容器中共享数据的一个容器,在这个容器中的指定目录中,该目录下数据对多个容器进行共享,也就是多个容器共享同一个容器的目录

​ 如果需要在多个容器之间共享数据,并且希望能够永远的保存这些数据,那么最好的方式就是使用数据卷容器,这种方式类似于一个提供网络文件共享个服务的NFS服务器

2、创建数据卷容器

#先创建数据卷容器,用于共享使用
docker create -v /opt/ --name test_1 nginx:1.12
6e1f65fc8f60ce334babf83be38abb40a1302e27ed70d2c80aff87677259c8cd
#创建一个容器,并且指定该容器中的opt目录提供共享
docker ps
#先查看刚刚创建的容器有没有启动,没有启动就手动开启一下

数据卷容器创建完之后,打开多个容器进行测试一下

容器1:
docker run -itd --volumes-from test_1 --name nginx_1 nginx:1.12
#创建容器,并且指定数据卷容器名字
docker exec -it nginx_1 /bin/bash
#进入容器1
cd /opt
touch 1.txt
#进入共享目录,创建一个文件

容器2:
#步骤差不多,直接一遍过了。创建好并进入容器之后,到opt目录下
cd /opt
ls
1.txt
#会发现,直接被共享过来一个刚刚我们创建好的文件

三、数据卷容器的备份与恢复

1、备份

先创建一个数据卷容器,进入容器中添加一个数据

docker run -it -v /opt --name test_1 centos:7 /bin/bash

echo "123321" > /opt/1.txt

在容器中创建完成之后,先退出容器,进行备份操作

docker run -it --volumes-from test_1 -v /mnt:/mnt centos:7 tar cvf /mnt/opt.tar /opt

#--volumes-from test_1 :指定数据卷容器所在
#-v /mnt:/mnt :共享该容器中mnt目录到主机的mnt
#tar cvf /mnt/opt.tar /opt :这个较为绕,mnt是该容器跟主机之间共享的一个目录。所以将备份后的数据放到这个文件中,好备份之后直接导到主机。
#而后面跟随的备份目标路径,则是该容器与数据卷容器之间的共享目录,因为要对数据卷容器进行备份,所以则是需要备份该目录

备份完成之后,直接到主机的mnt目录下查看即可。因为我们上面共享的就是mnt目录

ls /mnt/
opt.tar

tar xvf opt.tar
#将备份好的数据解压,并且查看文件内的数据
cat ./opt/1.txt
123321
#这个数据就是我们之前写进去的

2、恢复

恢复备份就很简单了,将上面的操作在继续做一遍就可以了,将压缩换成解压

例如,下面我们模拟,需要再创建一个新的数据卷容器,并且需要导入上面这个数据卷容器的数据

#创建数据卷容器,并且共享opt目录
docker run -it -v /opt --name test_2 nginx:1.12 /bin/bash
#创建一个容器,作用是从主机中获取文件,并且将该文件传输给数据卷容器
docker run -itd --volumes-from test_2 -v /mnt:/mnt nginx:1.12 tar xvf /mnt/opt.tar -C /opt/

#到数据卷容器中查看结果
cd opt/ && ls
opt		#因为我们之前直接压缩的就是opt目录,所以解压也是这个目录
cat ./opt/1.txt
123321
#结果正确

小结

数据卷与数据卷容器都是可以实现容器与主机或者容器与容器之间的一对一或者一对多的一种资源共享。可以方便的将本地主机上面的资源导入/上传到容器,容器中的也能到主机中。方便对于容器的管理。
而且备份功能,可以将一个容器中的主要的并且不方便封装进镜像中的资源,进行打包,存放在本地。等到需要的时候,再导入到新的容器中或者恢复到原来的容器,是一个较为重要的方面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值