『现学现忘』Docker基础 — 33、Docker数据卷容器的说明与共享数据原理
1、数据卷容器的说明
(1)什么是数据卷容器
一个容器中已经创建好的数据卷,其它容器通过这个容器实现数据共享。那么这个容器,称之为数据卷容器。(也可以说叫父容器)
(2)数据卷容器的作用
数据卷容器的作用就是,实现多个容器间的数据传递共享。
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
(3)需要使用的Docker参数
--volumes-from
:容器间传递共享。
(4)补充:容器数据卷和数据卷容器的区别
Docker容器数据卷:
- 文件是数据持久化的最常见的保存方式。
由于文件系统的隔离,以及本身是以沙盒形式运行等性质,使其对保存需要持久化的数据并不稳定。
对此,Docker使用了数据卷这种专门定制的形式。 - 数据卷就是一个挂载在容器内文件或目录。
在容器中,数据卷是从外界挂载到内部容器中的,所以可以脱离容器的生命周期而独立存在。
正式由于数据卷的生命周期并不等同于容器的生命周期,在容器退或者是删除之后,数据卷仍然不会受到影响,会依然存在于Docker中。
数据卷的特点:
数据卷中的数据并不能继承于镜像,也不在联合文件系统临时层所管理的范围内,所以镜像层面的写时复制不会作用于数据卷中的数据,而这些数据也不会被docker commit
提交到新的镜像中。
- 1)文件的操作不是在沙盒环境中进行的,而是直接作用于宿主机内真实的硬盘I/O中;
- 2)外界直接挂在到容器中,脱离了容器的生命的周期;
- 3)生命周期不受容器控制,能够安全有效的存储文件到数据卷中;
- 4)数据卷独立于容器之外,可实现多个容器共享一个数据卷。
Docker数据卷容器:
将一个运行的容器作为数据卷,其他容器可以通过挂载这个容器(也叫父容器)实现数据共享。
优势:
- 1)轻松的将数据卷进行归类和汇总;
- 2)能够更好的管理容器与数据卷之间的关系;
- 3)更加合理的控制数据卷的生命周期。
2、数据卷容器共享数据原理
我们以上一篇文章中创建的wukong/centos
镜像为例,进行演示。
将会以wukong/centos
镜像启动三个容器:docker01-fu
、docker02-zi
、docker03-zi
。
操作1:
创建docker01-fu
容器,并操作。
# 1.查看本地docker镜像
[root@192 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wukong/centos 1.0 98b1b6590b78 2 hours ago 209MB
centos latest 300e315adb2f 3 months ago 209MB
# 2.运行wukong/centos镜像,创建docker01-fu容器
[root@192 ~]# docker run -it --name docker01-fu wukong/centos:1.0
# 3.查看该容器器内容
[root@d2ad442398d5 /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Mar 19 14:37 dev
drwxr-xr-x. 1 root root 66 Mar 19 14:37 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
dr-xr-xr-x. 123 root root 0 Mar 19 14:37 proc
dr-xr-x---. 2 root root 162 Dec 4 17:37 root
drwxr-xr-x. 11 root root 163 Dec 4 17:37 run
lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
dr-xr-xr-x. 13 root root 0 Mar 19 04:07 sys
drwxrwxrwt. 7 root root 145 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 144 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 262 Dec 4 17:37 var
drwxr-xr-x. 2 root root 6 Mar 19 14:37 volume01 # 数据卷目录
drwxr-xr-x. 2 root root 6 Mar 19 14:37 volume02 # 数据卷目录
我们可以看到wukong/centos
容器创建后,会挂载好volume01
和volume02
两个目录。
然后我们在volume02
目录中创建一个docker01-fu_add.txt
文件。
# 创建文件
[root@d2ad442398d5 /]# mkdir /volume02/docker01-fu_add.txt
# 查看文件中的内容
[root@d2ad442398d5 /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
之后ctrl + P + Q
退出容器。
操作2:
创建docker02-zi
容器,并操作。
执行如下命令:
docker run -it --name docker02-zi \
--volumes-from docker01-fu \
wukong/centos:1.0
演示:
# 1.创建docker02-zi容器
[root@192 ~]# docker run -it --name docker02-zi \
> --volumes-from docker01-fu \
> wukong/centos:1.0
[root@0ce44b3e129e /]#
# 2.查看docker02-zi容器
[root@0ce44b3e129e /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Mar 19 14:56 dev
drwxr-xr-x. 1 root root 66 Mar 19 14:56 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
dr-xr-xr-x. 127 root root 0 Mar 19 14:56 proc
dr-xr-x---. 2 root root 162 Dec 4 17:37 root
drwxr-xr-x. 11 root root 163 Dec 4 17:37 run
lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
dr-xr-xr-x. 13 root root 0 Mar 19 04:07 sys
drwxrwxrwt. 7 root root 145 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 144 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 262 Dec 4 17:37 var
drwxr-xr-x. 2 root root 6 Mar 19 14:37 volume01
drwxr-xr-x. 3 root root 33 Mar 19 14:48 volume02
# 我们可以看到docker02-zi容器中,也有volume01和volume02目录
# 因为他们是同一个镜像创建的容器。
# 我们查看volume02目录中的内容
[root@0ce44b3e129e /]# ls -l /volume02/
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
[root@0ce44b3e129e /]#
从上面看出,我们在新创建的docker02-zi
容器中的,/volume02/
数据卷目录中发现,有docker01-fu
容器中创建的docker01-fu_add.txt
文件。
结论:docker01-fu
容器中创建的内容,同步到了docker02-zi
容器上面。
说明:
docker01-fu
容器就可以叫做父容器,也称之为数据卷容器。即:通过
--volumes-from
我们就可以是容器间的数据共享了。
在docker02-zi
容器的/volume02/
目录中创建docker02-zi_add.txt
文件。
# 创建文件
[root@0ce44b3e129e /]# mkdir /volume02/docker02-zi_add.txt
# 查看文件中的内容
[root@0ce44b3e129e /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
之后ctrl + P + Q
退出容器。
操作3:
创建docker03-zi
容器,并操作。
执行如下命令:
docker run -it --name docker03-zi \
--volumes-from docker01-fu \
wukong/centos:1.0
演示:
# 1.创建docker03-zi容器
[root@192 ~]# docker run -it --name docker03-zi \
> --volumes-from docker01-fu \
> wukong/centos:1.0
[root@14e91c379eb0 /]#
# 2.我们查看volume02目录中的内容
[root@14e91c379eb0 /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
结论:我们可以看到新创建的docker03-zi
容器,同步了docker01-fu
容器和docker02-zi
容器中创建的文件。
我们在docker03-zi
容器中创建docker03-zi_add.txt
文件。
# 创建文件
[root@14e91c379eb0 /]# mkdir /volume02/docker03-zi_add.txt
# 查看文件中的内容
[root@14e91c379eb0 /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
之后ctrl + P + Q
退出容器。
操作4:
我们再到docker01-fu
容器和docker02-zi
容器中,看看是否能够同步到docker03-zi
容器中创建的docker03-zi_add.txt
文件。
演示:
# 进入docker01-fu容器
[root@192 ~]# docker attach docker01-fu
# 查看/volume02目录中的内容
[root@d2ad442398d5 /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
# `ctrl + P + Q`退出容器
# 进入docker01-fu容器
[root@192 ~]# docker attach docker02-zi
# 查看/volume02目录中的内容
[root@0ce44b3e129e /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
结论:我们从docker01-fu
容器和docker02-zi
容器中都可以看到,docker03-zi
容器中创建的docker03-zi_add.txt
文件。
说明:这三个容器可以之间可以互相同步数据。
操作5:
我们现在把docker01-fu
容器或直接删除停掉,看看docker02-zi
容器和docker03-zi
容器之间是否还能够同步数据。
演示:
# 1.删除docker01-fu容器
[root@192 ~]# docker rm -f docker01-fu
docker01-fu
# 2.进入docker02-zi容器
[root@192 ~]# docker attach docker02-zi
# 3.查看/volume02目录中内容,可以看到之前共享的数据还在。
[root@0ce44b3e129e /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
# 4.在/volume02目录中内容创建docker02-zi_update.txt文件
[root@0ce44b3e129e /]# mkdir /volume02/docker02-zi_update.txt
[root@0ce44b3e129e /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:56 docker02-zi_update.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
[root@0ce44b3e129e /]#
ctrl + P + Q
退出容器。
# 5.进入docker03-zi容器
[root@192 ~]# docker attach docker03-zi
# 6.查看/volume02目录中的内容
[root@14e91c379eb0 /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:56 docker02-zi_update.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
[root@14e91c379eb0 /]#
结论:我们可以看到,删除了docker01-fu
容器,原先三个容器同步的数据依然存在,并且docker02-zi
容器和docker03-zi
容器之间依然可以互相同步新增的数据。
操作6:
我们还可以继续做如下操作,但是我们就进行叙述了,不进行代码演示了。
步骤(1):如果在通过wukong/centos
镜像,启动一个docker04-zi
容器,--volumes-from
于docker03-zi
容器。
结论:docker04-zi
容器会和docker02-zi
容器、docker03-zi
容器,这三个容器之间互相同步数据。
步骤(2):如果按照操作(1)之后,把docker03-zi
容器删除掉。
结论:docker04-zi
容器会和docker02-zi
容器之间依然互相同步,且所有的数据都会存在。
3、总结
数据卷容器的生命周期为一直持续到没有容器使用它为止。
这相当于一种备份机制,可以利用数据卷容器来备份、恢复、迁移数据。
4、练习:MySQL实现数据共享
目标:多个MySQL实现数据共享。
以MySQL 5.7镜像为例。
步骤1:启动mysql-01镜像。
docker run -p 3310:3306 \
--name mysql-01 \
-v /etc/mysql/conf.d \
-v /var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
以匿名挂载的方式实现数据卷挂载。
步骤2:启动mysql-02镜像。
docker run -p 3310:3306 \
--name mysql-02 --volumes-from mysql-01 \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
这个时候,就可以实现两个MySQL容器之间数据同步了。
『现学现忘』Docker基础 — 33、Docker数据卷容器的说明与共享数据原理的更多相关文章
- 聊聊Docker数据卷和数据卷容器
当程序在容器运行的时候,特别是需要与其他容器中的程序或容器外部程序进行沟通交流,这时需要进行数据交换,作为常用的两种沟通数据的方式,网络通信与文件读写是需要提供给程序的支持, [数据卷] 文件是数据持 ...
- Docker数据卷容器备份、恢复
1.备份数据卷容器 使用数据卷来备份数据,通过指定本地的一个文件路径,对应到容器中的路径,运行tar命令将重要的文件打包备份. $ cd /home/xm6f/dev $ docker run --v ...
- Docker创建数据卷容器
docker create --name test_4 -v /data_4 nginx创建一个test_4数据卷容器,在该容器的/data_4目录挂载数据卷 使用数据卷容器时,无须保证数据卷容器处于 ...
- Docker容器的数据卷(data volume),数据卷容器,数据卷的备份和还原。
Docker容器的数据卷(data volume),数据卷容器,数据卷的备份和还原. 数据卷就是数据(一个文件或者文件夹). Docker的理念之一是将应用与其运行的环境打包,docker容器的生命周 ...
- 『现学现忘』Docker基础 — 30、Docker中数据卷相关命令
目录 1.Volume命令说明 2.Volume命令的使用 (1)创建数据卷 (2)查看本地数据卷列表 (3)打印myVolume数据卷的详细信息 (4)删除数据卷 (5)删除所有未使用的数据卷 3. ...
- Docker数据卷容器
用户需要在多个容器之间共享一些数据,就可以使用数据卷容器 从阿里云仓库下载镜像(也可以自己制作一个基础进项,比如只有几M的alpine) sudo docker pull registry.cn- ...
- docker对数据卷容器进行备份
转载请注明出处 官网的数据以及各大博客都没有对这个的具体说明,本人也是理解了好久. 我们使用docker的过程中,使用共享的数据卷是经常的,那么.我们要怎么进行备份呢? 首先,我们得了解下面4个命 ...
- Docker学习笔记 - Docker的数据卷容器
一.什么是数据卷容器 如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器. 数据卷容器:用于容器间的数据共享,主动挂载宿主机目录,用于其他容器挂载和共享. 二.数据卷容器的操作 1.创建 ...
- Docker 数据卷容器
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器. 数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的. 首先,创建一个命名的数据卷容器 dbdata: $ sud ...
随机推荐
- webshell安全教程防止服务器被破解
直接上传取得webshell 因过滤上传文件不严,导致用户能够直接上传webshell到网站恣意可写目录中,然后拿到网站的办理员操控权限. 2 增加修正上传类型 现在很多脚本程序上传模块不是只允许上传 ...
- pytest--配置用例执行顺序(pytest_ordering插件介绍)
前言 设置测试用例执行顺序: 默认情况下,pytest测试用例的执行顺序是按先外层后内层(目录下的文 件),再根据名称按ascii码值的顺序升序执行. 如果想自定义pytest测试用例的执行顺序,可以 ...
- Linux 时间操作及其同步
完整格式支持链接:https://blog.imakiseki.cf/2022/02/27/techdev/linux-time-operations-and-sync/ 本文将以 Arch Linu ...
- 还在用excel做分析?你已经out了!
Excel 是个很有趣的工具,不管你是不是数据分析领域的打工人,都一定听过它的名字,甚至在全球拥有大量虔诚的粉丝.Excel这个名字其实源自英语中的" Excellence "一词 ...
- Linux中查看进程与日志
转至:https://www.cnblogs.com/dengxiaoning/p/13336778.html Linux尽管使用频繁,仍然每次都还是需要到处去找相关的命令,如进程,日志之类的,既然这 ...
- JavaWeb-JDBC-Mybatis-Junit-Maven-Lombok
Java与数据库 初识JDBC JDBC是什么? JDBC英文名为:Java Data Base Connectivity(Java数据库连接),官方解释它是Java编程语言和广泛的数据库之间独立于数 ...
- parquet列存储本身自带压缩 配合snappy或者lzo等可以进行二次压缩
上传txt文件到hdfs,txt文件大小是74左右. 这里提醒一下,是不是说parquet加lzo可以把数据压缩到这个地步,因为我的测试数据存在大量重复.所以下面使用parquet和lzo的压缩效果特 ...
- spark conf的3种配置优先级
在SparkConf上设置的属性具有最高的优先级,其次是传递给spark-submit或者spark-shell的属性值,最后是spark-defaults.conf文件中的属性值
- Maven打包异常:Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war
出现下面异常,因为默认web.xml在 src/main/webapp 下所以才出现找不到的异常. 我的项目结构为 解决办法①: 在pom.xml里面制定 web位置即可 //先确保打包方式为w ...
- Python:Dict
0.运算符 in:检查字典中是否有某个key 'a' in {'a':1,'b':2} True 提取其中Key对应的Value: d={'1':'A','2':'B','3':'C'} d['2'] ...