Docker 数据卷之数据持久化与备份-Volume Container(一)
简介
在使用docker 运行容器的时候,我们通常会保存一些静态文件是数据,如网站的静态文件、应用的配置文件等,这些数据需要持久化的存储,否则会影响我们正在运行的应用或站点页面,为了提高数据的持久化安全性,我们可以利用Docker 不会删除被其他容器使用和挂载的数据卷以及其中的数据,因此,通过创建数据卷容器在容器间存储与共享文件数据。
数据卷容器在其他容器与数据卷之间起到一个桥的作用,因此,数据卷容器并不需要保证其必须运行。
一、数据卷容器
1. 数据卷容器在容器与数据卷之间的关系,如下所示
2. 创建数据卷容器
创建数据卷容器时,需要使用 -v
参数来建立数据卷容器所使用的数据卷。
[root@localhost ~]# docker create --name data -v /html nginx
注:
- 使用数据卷容器时无须保证数据卷容器处于运行状态;同时不运行数据卷容器,可以减少对宿主机性能的影响。
- 同一个数据卷容器中,可以使用多个数据卷,不过为了更为准确的管理数据卷,建议使用不同的数据卷容器来关联不同的数据卷,或者对数据卷进行分类存放于不同的数据卷容器中。
3. 连接数据卷容器
通过 --volumes-from
参数挂载数据卷容器关联的数据卷。数据卷的挂载点,会使用创建数据卷容器时指定的数据卷挂载目录。
[root@localhost ~]# docker run -t -d -p 80:80 --volumes-from data --name webser nginx
注:
- 多个容器同时使用了相同的数据卷容器所提供的数据卷时,它们所挂载目录中的文件是相同的。
- 在任意一个容器中对挂载目录中的文件进行操作,都会影响其他挂载的容器中挂载文件。
- 利用挂载相同数据卷容器所提供的数据卷,可以实现多个容器间对相同文件的即时访问和操作,进而达到容器间共享文件数据的目的。
- 需要注意,在对数据卷容器提供的数据卷操作时(删除),需要谨慎,操作结果会影响所有使用的容器。
二、数据卷容器备份(数据卷的迁移)
1. 数据卷的导出(备份)
数据的备份或导出是保证数据安全最简单的方式,因此在对Docekr 使用过程中自然也就离不开对数据卷的导出或备份工作。
因为数据卷导出或备份,并不是通过Docker 自身提供的方法实现,而是利用Tar 存档管理工具来实现。而需要导出的数据卷又不是直接与宿主机目录形式挂载,因此,要让数据卷的数据被tar命令访问到,必须要先进入容器中,在容器中通过tar
命令将数据卷目录归档,然后将归档文件保存到容器外,因此,我们需要额外挂载一个容器外的目录,用来存放归档好的数据。
我们利用数据卷容器的数据卷可以被多个容器共享使用(挂载),因此我们可以通过新创建容器挂载宿主机目录,用于导出共享数据卷需要导出的数据,这样就很容易的实现数据的导出或备份,具体过程如下图所示:
1.1 创建新的容器(桥梁)
用于连接到持有需要导出数据卷的数据卷容器,容器创建和运行后,就可以进入容器执行打包命令,将导出数据放到挂载了宿主机目录的位置。
[root@localhost ~]# docker run -it --volumes-from date -v $(pwd):/bakup --name export --rm nginx bash
1.2 进入容器对需要导出的数据进行归档
[root@localhost bakup]# docker run -it --volumes-from date -v $(pwd):/bakup --name export --rm nginx bash
root@43ca716c1f4f:/# tar -cvf /bakup/data.tar /html/
tar: Removing leading `/' from member names
/html/
/html/test/
/html/1.txt
/html/2.txt
/html/3.txt
/html/4.txt
/html/5.txt
/html/6.txt
/html/7.txt
/html/8.txt
/html/9.txt
root@43ca716c1f4f:/# exit
或是直接将tar 命令作为运行时的命令:
[root@localhost bakup]# docker run -it --volumes-from date -v $(pwd):/bakup --name export --rm nginx tar -cf /bakup/data.tar /html/
注 : --rm
参数:容器停止后自动删除。
2. 数据卷的导入(恢复)
数据导入(恢复导出的数据),其实只要把导出的过程逆向执行一遍即可。
2.1 创建一个新的容器(桥梁)
新创建的容器,挂载上宿主机中存放导出数据的目录,并连接到包含共享数据卷的数据卷容器上。
[root@localhost bakup]# docker run -it --volumes-from date -v $(pwd):/bakup --name importer --rm nginx bash
2.2 运行并进入容器,并在容器中对需要恢复的数据进行解包,把导出的数据恢复到目标数据卷指定的位置。
root@5b897788f3a3:/# cd /bakup/
root@5b897788f3a3:/bakup# ls
data.tar html
root@5b897788f3a3:/bakup# tar xf data.tar -C /
root@5b897788f3a3:/bakup# ls /html/
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt html test
root@5b897788f3a3:/bakup# exit
Docker 数据卷的备份与恢复的过程如上,欢迎相互讨论与交流。