docker容器自身存储数据效率比较低,因此我们为了提高磁盘IO的性能等,需要在容器中挂载一个外部存储设备。关于讲解大致如下:

Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。
数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。
)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享。数据卷可以在多个容器之间共享。
)创建数据卷,只要在docker run命令后面跟上-v参数即可创建一个数据卷,当然也可以跟多个-v参数来创建多个数据卷,当创建好带有数据卷的容器后,
就可以在其他容器中通过--volumes-froms参数来挂载该数据卷了,而不管该容器是否运行。也可以在Dockerfile中通过VOLUME指令来增加一个或者多个数据卷。
)如果有一些数据想在多个容器间共享,或者想在一些临时性的容器中使用该数据,那么最好的方案就是你创建一个数据卷容器,然后从该临时性的容器中挂载该数据卷容器的数据。
这样,即使删除了刚开始的第一个数据卷容器或者中间层的数据卷容器,只要有其他容器使用数据卷,数据卷都不会被删除的。
)不能使用docker export、save、cp等命令来备份数据卷的内容,因为数据卷是存在于镜像之外的。备份的方法可以是创建一个新容器,挂载数据卷容器,同时挂载一个本地目录,
然后把远程数据卷容器的数据卷通过备份命令备份到映射的本地目录里面。如下:
# docker run -rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
)也可以把一个本地主机的目录当做数据卷挂载在容器上,同样是在docker run后面跟-v参数,不过-v后面跟的不再是单独的目录了,它是[host-dir]:[container-dir]:[rw|ro]这样格式的,
host-dir是一个绝对路径的地址,如果host-dir不存在,则docker会创建一个新的数据卷,如果host-dir存在,但是指向的是一个不存在的目录,则docker也会创建该目录,然后使用该目录做数据源。 Docker Volume数据卷可以实现:
)绕过“拷贝写”系统,以达到本地磁盘IO的性能,(比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。)
)绕过“拷贝写”系统,有些文件不需要在docker commit打包进镜像文件。
)数据卷可以在容器间共享和重用数据
)数据卷可以在宿主和容器间共享数据
)数据卷数据改变是直接修改的
)数据卷是持续性的,直到没有容器使用它们。即便是初始的数据卷容器或中间层的数据卷容器删除了,只要还有其他的容器使用数据卷,那么里面的数据都不会丢失。 Docker数据持久化:
容器在运行期间产生的数据是不会写在镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。
如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。

接下来我们讲解一下案例:

1、docker有两种卷管理的方式:

区别就是:第一种是容器内部指定保存的路径并绑定物理卷的路径映射,第二种是容器内部指定保存数据的路径,但是外部存储在磁盘的/var/lib/docker/volumes目录下的路径。相对来说第一种最好。

2、先讲解第二种:

[root@ELK-chaofeng08 ~]# docker run --name bbox1 -v /opt/data -it busybox
/ # cd /opt/data
/opt/data # ls/opt/data # echo "" > .txt
/opt/data # cat .txt

然后打开另外一个终端查看。

[root@ELK-chaofeng08 ~]# docker inspect bbox1 | grep  /var/lib/docker/volumes
"Source": "/var/lib/docker/volumes/2e7dddadd5ec5a261666735787bba3747abc1d767d8b680065781fa052e52946/_data",
[root@ELK-chaofeng08 ~]# ls /var/lib/docker/volumes/2e7dddadd5ec5a261666735787bba3747abc1d767d8b680065781fa052e52946/_data
.txt
[root@ELK-chaofeng08 ~]# cat /var/lib/docker/volumes/2e7dddadd5ec5a261666735787bba3747abc1d767d8b680065781fa052e52946/_data/.txt

此时即便你把容器删除了,数据依然不会丢失,因为保存到了外部存储设备。

删除容器后查看之前的数据

[root@ELK-chaofeng08 ~]# cat /var/lib/docker/volumes/2e7dddadd5ec5a261666735787bba3747abc1d767d8b680065781fa052e52946/_data/.txt

在 web 容器被删除后,/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data 目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了。因此我们一般都通过指定外部存储设备的路径来做。

3、看第一种方法,绑定外部路径与docker容器内部路径

可以直接挂载宿主机文件或目录到容器里,可以理解为目录映射,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据。

注意:
-v后面的映射关系是"宿主机文件/目录:容器里对应的文件/目录",其中,宿主机上的文件/目录是要提前存在的,容器里对应的文件/目录会自动创建。 数据卷权限:
挂载的数据默认为可读写权限。
但也可以根据自己的需求,将容器里挂载共享的数据设置为只读,这样数据修改就只能在宿主机上操作。

案例演示:

[root@ELK-chaofeng08 ~]# docker run --name bbox1 -v /tmp/test:/opt/data -it busybox
/ # cd /opt/data
/opt/data # ls
/opt/data # touch .txt
/opt/data # echo "abcdefg" > .txt
/opt/data # cat .txt
abcdefg
/opt/data #

然后再打开一个终端,不要进入容器,直接到/tmp/test目录查看是否有1.txt这个文件和文件的内容

[root@ELK-chaofeng08 ~]# cd /tmp/test
[root@ELK-chaofeng08 test]# cat .txt
abcdefg

主机上的目录可以是一个本地目录,也可以在一个 NFS share 内,或者在一个已经格式化好了的块设备上。

其实这种形式和第一种没有本质的区别,容器内对 /opt/data 的操作都会反映到主机上的 /tmp/test 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /tmp/test 目录挂载到新的容器内,这样就可以实现数据持久化的目标。

在容器的详细信息中是这样的:

"Mounts": [
{
"Type": "bind",
"Source": "/tmp/test",
"Destination": "/opt/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],

上面的这个是容器内创建文件并写入内容,然后容器外查看。现在我们可以反过来操作,比如

[root@ELK-chaofeng08 test]# touch .txt && echo "abcdefghijklmn" > .txt
[root@ELK-chaofeng08 test]# cat .txt
abcdefghijklmn

然后此时回到容器中查看

/opt/data # ls
.txt .txt
/opt/data # cat .txt
abcdefghijklmn

4、可以挂在多个目录

docker run --name bbox1 -v /opt/data1:/var/www/data1 -v /opt/data2:/var/www/data2 -it busybox

5、挂载为只读,就是在外部存储卷挂载容器内时,在容器中是只读的,只能查看内容,但是不能修改外部存储卷上的文件

[root@localhost ~]# docker run -it --name bbox1 -v /etc/web.list:/etc/web.list:ro busybox

docker新版本引入 docker volumn命令使用方法

1、提前创建好volumn,然后在启动容器中映射。

[root@ELK-chaofeng08 test]# docker volume create vol1
vol1
[root@ELK-chaofeng08 test]# docker volume inspect vol1
[
{
"CreatedAt": "2019-03-21T10:52:59+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/vol1/_data",
"Name": "vol1",
"Options": {},
"Scope": "local"
}
]

docker volumn默认创建的目录是在/var/lib/docker/volumns目录下。

2、使用这个volumn

[root@ELK-chaofeng08 test]# docker run -it --name bbox2 -v vol1:/volumn busybox
/ # ls
bin dev etc home proc root sys tmp usr var volumn

查看这个容器的详细信息

"Mounts": [
{
"Type": "volume",
"Name": "vol1",
"Source": "/var/lib/docker/volumes/vol1/_data",
"Destination": "/volumn",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],

共享存储卷

案例演示

1、首先是创建第一个容器

[root@ELK-chaofeng08 ~]# docker run  -it --name bbox1 -v /tmp/test2:/opt/data busybox
/ # cd /opt/data
/opt/data # ls

然后我们再打开一个终端,在物理卷下的/tmp/test2目录创建一个文件

[root@ELK-chaofeng08 test2]# touch .txt
[root@ELK-chaofeng08 test2]# ls
.txt

然后回到容器bbox1中查看是否有这个文件

/opt/data # ls
.txt

发现是有的,符合常理。我们看下容器bbox1的挂载信息,如下所示:

"Mounts": [
{
"Type": "bind",
"Source": "/tmp/test2",
"Destination": "/opt/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],

然后我们再启动一个容器bbox2,这次是共享容器bbox1的存储卷

[root@ELK-chaofeng08 test]# docker run -it --name bbox2 --volumes-from bbox1 busybox
/ # ls /opt/data
.txt

然后查看一下容器bbox2的挂载信息

"Mounts": [
{
"Type": "bind",
"Source": "/tmp/test2",
"Destination": "/opt/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],

你会发现容器bbox1和容器bbox2的挂载信息是相同的,他们都是映射到物理卷/tmp/test2目录下,这就是容器间的共享数据。

docker容器持久化卷讲解的更多相关文章

  1. 『现学现忘』Docker基础 — 28、Docker容器数据卷介绍

    目录 1.什么是Docker容器数据卷 2.数据卷的作用 3.数据卷的使用 1.什么是Docker容器数据卷 Docker容器数据卷,即Docker Volume(卷). 当Docker容器运行的时候 ...

  2. docker 12 docker容器数据卷

    数据卷概念 ♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面).所以我们就需要用容器数据卷把容器数据进行持久化储存. ...

  3. Docker容器数据卷

    ⒈Docker容器中数据如何持久化? ①通过commit命令使容器反向为镜像 ②以容器数据卷的方式将数据抽离 ⒉容器数据卷的作用? ①容器数据的持久化 ②容器间继承.共享数据 ⒊能干嘛? 卷就是目录或 ...

  4. Docker容器数据卷介绍和命令

    是什么 一句话:有点类似我们Redis里面的rdb和aof文件 先来看看Docker的理念: *  将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 *   ...

  5. Docker容器数据卷(七)

    Docker致力于: 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker co ...

  6. 5、docker容器数据卷: -v添加共享传递容器数据卷

    1.是什么 1.docker理念 先来看看Docker的理念:*  将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的*  容器之间希望有可能共享数据 2.保 ...

  7. Docker 容器数据卷(Data Volume)与数据管理

    卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必 ...

  8. Docker容器数据卷-Volume详解

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...

  9. Docker系列-第五篇Docker容器数据卷

    1.是什么 在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作 . 容器中的管理数据主要有两种方式 : 数据卷 ( Data V ...

随机推荐

  1. 再也不用被this苦恼了

    前端编程对于this再熟悉不过了,今日来个老调重弹温故知新,肯定有很多大佬已经完全吃透了this原理,敬请出门左拐.对于理解this似懂非懂的同学可以借鉴一波 1.this描述 this指的是当前执行 ...

  2. ARM 处理器寻址方式之间接寻址的几种表达

    我们以 LDR 指令为例来分别举例分析. LDR 指令的格式为: LDR{条件} 目的寄存器,<存储器地址> LDR 指令是字加载指令,用于从存储器中将一个 32 位的字数据送到目的寄存器 ...

  3. zabbix实现百台服务器的自动化监控--技术流ken

    前言 最近有小伙伴通过Q联系到我说:公司现在有百多台服务器,想要部署zabbix进行监控,怎么实现自动化全网监控? 本篇博客将讲解一个我工作时做的一个实际项目,现在写出来供大家以后参考使用. 实现自动 ...

  4. pxe+kickstart自动化批量安装系统详解-技术流ken

    前言 pxe+kickstart是一款可以实现自动化批量安装系统的服务,比较经典,下面将详细介绍此服务的安装和使用. 系统环境准备 系统版本:CentOS release 6.7 (Final) 内网 ...

  5. Django 系列博客(七)

    Django 系列博客(七) 前言 本篇博客介绍 Django 中的视图层中的相关参数,HttpRequest 对象.HttpResponse 对象.JsonResponse,以及视图层的两种响应方式 ...

  6. 阿里云oss,简单上传

    描述:oss比较方便,省去了自己搭建文件服务器的时间,价格比较便宜,下面是java基于oss的简单上传代码 a.添加maven依赖 <dependency> <groupId> ...

  7. 【Spring】使用Spring和AMQP发送接收消息(下)

    上篇讲了使用RabbitMQ发送消息,本篇则来讲接收消息.在传统JMS中有两种从队列获取信息的方式,使用JmsTemplate的同步方式以及使用消息驱动pojo的异步方式.Spring AMQP也提供 ...

  8. 02-Java中的对象和类

    面向对象: 程序由对象构成,每个对象包含对用户公开的特定功能部分(public)和隐藏实现部分(private). 类: 构造对象的模板 对象: 对象的行为 --- 可以对对象施加的操作(方法) 对象 ...

  9. virtualbox中 Ubuntu挂载共享文件夹

    1. 进入 /mnt 目录 2. 新建目录 share 3. sudo mount -t vboxsf share /mnt/share(其中的第一个share是共享文件夹的名字) 4. 成功

  10. jQ效果:jQuery之插件开发短信发送倒计时功能

    实现的主要功能如下: 1.点击按钮的时候,可以进行倒计时,倒计时自定义. 2.当接收短信失败后,倒计时停止,可点击重新发送短信. 3.点击的元素支持一般标签和input标签. html代码: < ...