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-fudocker02-zidocker03-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容器创建后,会挂载好volume01volume02两个目录。

然后我们在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-fromdocker03-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容器之间数据同步了。

参考:https://www.cnblogs.com/bixiaoyu/p/9069778.html

『现学现忘』Docker基础 — 33、Docker数据卷容器的说明与共享数据原理的更多相关文章

  1. 聊聊Docker数据卷和数据卷容器

    当程序在容器运行的时候,特别是需要与其他容器中的程序或容器外部程序进行沟通交流,这时需要进行数据交换,作为常用的两种沟通数据的方式,网络通信与文件读写是需要提供给程序的支持, [数据卷] 文件是数据持 ...

  2. Docker数据卷容器备份、恢复

    1.备份数据卷容器 使用数据卷来备份数据,通过指定本地的一个文件路径,对应到容器中的路径,运行tar命令将重要的文件打包备份. $ cd /home/xm6f/dev $ docker run --v ...

  3. Docker创建数据卷容器

    docker create --name test_4 -v /data_4 nginx创建一个test_4数据卷容器,在该容器的/data_4目录挂载数据卷 使用数据卷容器时,无须保证数据卷容器处于 ...

  4. Docker容器的数据卷(data volume),数据卷容器,数据卷的备份和还原。

    Docker容器的数据卷(data volume),数据卷容器,数据卷的备份和还原. 数据卷就是数据(一个文件或者文件夹). Docker的理念之一是将应用与其运行的环境打包,docker容器的生命周 ...

  5. 『现学现忘』Docker基础 — 30、Docker中数据卷相关命令

    目录 1.Volume命令说明 2.Volume命令的使用 (1)创建数据卷 (2)查看本地数据卷列表 (3)打印myVolume数据卷的详细信息 (4)删除数据卷 (5)删除所有未使用的数据卷 3. ...

  6. Docker数据卷容器

    用户需要在多个容器之间共享一些数据,就可以使用数据卷容器   从阿里云仓库下载镜像(也可以自己制作一个基础进项,比如只有几M的alpine) sudo docker pull registry.cn- ...

  7. docker对数据卷容器进行备份

    转载请注明出处 官网的数据以及各大博客都没有对这个的具体说明,本人也是理解了好久. 我们使用docker的过程中,使用共享的数据卷是经常的,那么.我们要怎么进行备份呢?   首先,我们得了解下面4个命 ...

  8. Docker学习笔记 - Docker的数据卷容器

    一.什么是数据卷容器 如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器. 数据卷容器:用于容器间的数据共享,主动挂载宿主机目录,用于其他容器挂载和共享. 二.数据卷容器的操作 1.创建 ...

  9. Docker 数据卷容器

    如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器. 数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的. 首先,创建一个命名的数据卷容器 dbdata: $ sud ...

随机推荐

  1. Cobbler 批量安装操作系统

    文章目录 环境准备 部署cobbler cobbler语法检查以及排错 问题1 问题2 问题3 问题4 问题5 问题6 问题7 问题8 修改dhcp模板 重启服务,再次检查 镜像配置 镜像导入 kic ...

  2. No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK 问题解决

    1. 问题描述 使用idea对Java工程执行mvn compile命令进行编译,出现以下报错: [ERROR] Failed to execute goal org.apache.maven.plu ...

  3. .NET 云原生架构师训练营(权限系统 系统演示 EntityAccess)--学习笔记

    目录 模块拆分 EntityAccess 模块拆分 EntityAccess 实体权限 属性权限 实体权限 创建 student https://localhost:7018/Student/dotn ...

  4. pytest--mark基本使用(主要通过pytest.ini文件注册标签名,对用例进行标记分组)

    1.pytest中的mark介绍 mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记 名),实现测试分组功能,并能和其它插件配合设置测试方法执行顺序等.如下 图,现在需要只执行红色 ...

  5. Ubuntu更新命令无法执行的,下一步该怎么办?

    对Linux的系统学习的更加深入,所以今天笔者正在Ubuntu20.04 LTS 上部署Sublime Text 的环境时 , 由于对操作的不熟悉,踩了一些坑.拿出来和大家分享. 正在我对照着官方文档 ...

  6. 【C#程序集】为何.NET Core控制台项目发布后是一个dll文件,而不是exe文件?

    因为 .NET Core 的控制台应用默认是生成 dll 文件,而没有对应的 exe 文件.如下图所示,是在VS中编译后生成的结果 图中看到的TestVisualizer.exe 只是一个快捷方式, ...

  7. 动态语言运行时(DLR)

    前言 为了让C#.Visual Basic等.NET编程语言能具备动态编程语言的特性,.NET 4.0引入了一个"DLR(Dynamic Language Runtime:动态语言运行时)& ...

  8. 个人c#编码约定 继承C#编码约定

    1.内插字符 串取代  字符串复合格式设置 使用这个写法: Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it' ...

  9. Docker学习笔记(详细)

    目录 01 介绍 02 Docker安装 03 Docker常用命令 04 Docker镜像 05 Docker容器数据卷 06 Dockerfile解析 Dockerfile构建过程解析 Docke ...

  10. Windows用户如何安装cpolar内网穿透

    概述 本教程适合于Windows用户,安装并使用cpolar工具. 什么是cpolar? cpolar是一个非常强大的内网穿透工具,开发调试的必备利器 它可以将本地内网服务器的HTTP.HTTPS.T ...