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

【数据卷】

文件是数据持久化的最常见的保存方式,由于文件系统的隔离,以及本身是以沙盒形式运行等性质,使其对保存需要持久化的数据并不稳定,对此,docker使用了数据卷这种专门定制的形式

数据卷就是一个挂载在容器内文件或目录,在容器中,数据卷是从外界挂载到内部容器中的,所以可以脱离容器的生命周期而独立存在,正式由于数据卷的生命周期并不等同于容器的生命周期,在容器退或者是删除之后,数据卷仍然不会受到影响,会依然存在于docker中

【数据卷的特点】

数据卷中的数据并不能继承于镜像,也不在联合文件系统临时层所管理的范围内,所以镜像层面的写时复制不会作用于数据卷中的数据,而这些数据也不会被docker commit提交到新的镜像中;

1)文件的操作不是在沙盒环境中进行的,而是直接作用于宿主机内真实的硬盘I/O中;

2)外界直接挂在到容器中,脱离了容器的生命的周期

3)生命周期不受容器控制,能够安全有效的存储文件到数据卷中

4)数据卷独立于容器之外,可实现多个容器共享一个数据卷

【创建数据卷】

创建数据卷的方式有很多种,其中最为常用的是在创建容器的同时也创建数据卷,在使用docker create或者docker run都可以实现,可以通过-v参数向容器中挂载到一个数据卷

Ps:在这里如果通过docker create 这种方式创建容器的话,创建成功之后,手动docker start会无法启动的(亲身经历,郁闷了好久。)

# docker run --name version1 -v /www/html/ docker.io/centos    #-v指定数据卷目录

d4363f3bce6e801518ab565fee659e664d779b8cf0091c109fbf9b476f264137

# docker run -itd  --name version2 -v /www/html/ -v /tmp/ docker.io/centos
4faa7bd0b279a12a4b571cb43b6156430cccce8737187366c2df44cfed53a468

另外还可以通过docker CLI中专属的参数来创建数据卷

# docker volume create --name data    #通过这种方式查看数据卷的基本信息

# docker volume inspect data
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/data/_data",
"Name": "data",
"Options": {},
"Scope": "local"
}
]

我们可以发现。数据卷其实就是放置在数据主机中的一个特殊的目录,只是docker将其封装在容器中进行展示

【挂载数据卷】

# docker run -itd --name test123 -v data:/html e934aafc2206
1d843afd1755ea1ab32588fff39b666f702ef0ad7c3984052341415b9d101e7b

使用挂载数据卷的主机目录已经成为数据卷的方式,可以非常方面的实现容器内部和外部的文件共享,特别是将配置,代码类的可能需要临时修改文件,通过主机目录挂载方式,修改结果立马体现在容器中

Ps:当需要容器中的程序只能读取数据卷的内容,而不能对数据卷中的数据进行修改的时候,我们可以在挂载参数后面加上:ro三个字符,从而达到只读挂载数据卷的目的

docker run -itd --name testv1 -v data:/html:ro  e934aafc2206  

只读挂载能在安全性上面作出一定的贡献,只读挂载使攻击者入侵到容器中,无法对挂载目录中的程序数据卷进行修改,同时容器对应用之间的隔离,对文件系统的隔离,对物理主机之间隔离,攻击者无法进行其他的操作;

Ps:删除数据卷很简单,数据卷不会因为容器的删除而被删除,已经被删除的容器所挂载的数据卷仍然存在宿主机中,并保存着数据,占据着空间大小,可以通过docker提供的命令进行查看宿主机存在的所有数据卷

删除数据卷

PS:另外如要删除数据卷,我们更推荐-随容器删除,可以使用docker rm -v指定容器,在删除容器的同时,也会将容器使用的数据卷一并删除

随容器一并删除数据卷,前提是该数据卷没有被其他容器使用,才能生效,因为数据卷是脱离容器而存在的,因为这个特点,我们也能够将一个数据卷挂载到多个不同的容器中,所以在随容器删除数据卷的前提下,docker会先检查容器中挂载的数据卷是否被其他容器使用,如果其他容器也在使用该数据卷,那么无法随容器删除;

【数据卷容器】

将一个运行的容器作为数据卷,其他容器可以通过挂载这个容器实现数据共享

优势:1,轻松的将数据卷进行归类和汇总;2,能够更好的管理容器与数据卷之间的关系;3,更加合理的控制数据卷的生命周期

数据卷容器详情:

用于持久化保存数据的数据卷,可以通过挂载宿主机目录的方式来实现,但这也存在着弊端,很容易破坏docker的统一性,为了解决这个问题,我们可以使用数据卷容器

顾名思义,数据卷容器也就是专门存放数据卷的容器

创建 数据卷容器

# docker create --name datatest -v /www/html/ e934aafc2206   #创建数据卷容器时候,指定-v参数来创建数据卷容器所使用的数据卷,

# docker inspect datatest    #通过docker inspect查看数据卷容器详细信息

【链接数据卷容器】

数据卷容器只是链接其它容器与数据卷的桥梁,通过--volumes-from参数可以挂在指定的数据卷中的所有数据卷

# docker run -itd --name webserver --volumes-from datatest e934aafc2206
a58b0c09b1ff75159e2dcd974700325aa7ff72fea878b8308414aa67ca340b41

【数据卷的迁移】

数据的备份或是导出导入都是保证数据的安全性最简单直接的方式

Ps:已经启动的容器是无法再挂载新的外部目录进去,利用数据卷的特性,数据卷是可以被多个容器挂载的,我们可以通过新建容器挂载宿主机中的目录,并共享需要导出的容器数据卷,这样的就容易实现数据的导出了

要导出数据,需要创建一个新的容器,并将其连接到持有我们需要导出的数据卷的数据卷容器上,容器创建之后,我们就可以进入容器执行打包命令,并将所有数据方式到挂载的宿主机的目录中

返回到宿主机上面,会发现,备份的tar包已经同步/root/目录了!

恢复数据之前,依然要创建新的容器,挂载上面宿主机中存在备份数据的目录,并连接到包含目标数据卷的数据卷容器上面,然后运行并进入这个容器,在容器中进行解压命令,把导出的数据放置到目录数据卷里

# docker run -it --volumes-from datatest -v $(pwd):/backup --rm --name importer e934aafc2206 /bin/bash

[root@88563d2cf14b /]# tar xf /backup/data.tar

整个过程经历了创建容器-运行命令-关闭和删除容器的过程,上述提到的--rm是容器退出时就能够自动清理容器内部的文件系统

聊聊Docker数据卷和数据卷容器的更多相关文章

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

    1.本节课主要讲解如何在Docker内部及容器之间管理数据.容器中管理数据主要有两种方式:数据卷(Data volumes)数据卷容器(Data volume containers) 2.数据卷:是一 ...

  2. Docker学习笔记:镜像、容器、数据卷

    核心概念 镜像:一个只读的模板,类似虚拟机的镜像. 容器:可以理解为镜像的一个运行实例.运行时类似于沙箱,多个容器互相独立. 仓库:存放镜像文件的地方. 镜像 命令表格 命令 解释 选项 docker ...

  3. Docker数据卷和数据卷容器

    是什么 数据卷设计的目的,在于数据的永久化,他完全独立于容器的生存周期,因此,Docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制对容器引用的数据卷进行处理.类似我们Redis ...

  4. Docker-数据卷和数据容器卷

    容器中管理数据主要有两种方式: 数据卷(Data Volumes) 数据卷容器(Data Volumes Dontainers) 数据卷 使用-v可以挂载一个本地的目录到容器中作为数据卷. [root ...

  5. Docker 使用指南 (四)—— 数据卷的使用

    一.数据卷的使用 有时候需要使用数据库,但是又希望它的数据能保存在本地,Docker中提供了数据卷可以供你方便的操作数据.数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用 ...

  6. docker--数据卷与数据卷容器

    docker--数据卷与数据卷容器 1.数据卷: 创建一个volumes的文件夹: [root@docker01 /]# mkdir volumes [root@docker01 /]# ls bin ...

  7. Docker:网络及数据卷设置 [四]

    一.Docker网络设置 默认情况下,docker会创建一个桥接网卡[docker 0],docker有2种映射方式,一种是随机映射,一种是指定映射 提示:生产场景一般不使用随机映射,但是随机映射的好 ...

  8. Docker Kubernetes Volume 本地数据卷

    Docker Kubernetes Volume 本地数据卷 emptyDir 当Pod分配到Node时,首先创建一个空卷,并挂载到Pod中的容器. Pod中的容器可以读取和写入卷中的文件. 当Pod ...

  9. Docker Kubernetes Volume 网络数据卷

    Docker Kubernetes Volume 网络数据卷 由于支持网络数据卷众多 今天只拿nfs作为案例. 支持网络数据卷 nfs iscsi glusterfs awsElasticBlockS ...

随机推荐

  1. Windows Server 2008 R2 报错事件ID:10之WMI报错

    问题描述: Details -Event filter with query "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHE ...

  2. Linux 两组信号对比(关闭和停止进程信号)

    之前看信号的时候,没有太注意不同信号的对比.今天再次看到的时候,突然感觉对一些信号,非常相似,乃至非常容易混淆.今天周末就抽空总结一下. 一.关闭进程信号 常见的4中关闭进程信号是SIGKILL,SI ...

  3. nodejs,javascript过滤emoj表情

    1 前言 由于带emoj表情的昵称无法存储在mysql character_set_server= utf8模式下,按照参考文章[1],改成utf8mb4,无效(可能使用方法不对). 总体思路是,把昵 ...

  4. 使用layui框架做分页

    第一步引用两个文件: <link href="layui-v2.2.5/layui-v2.2.5/layui/css/layui.css" rel="stylesh ...

  5. python2.7报错Non-ASCII character '\xe5' in file knn.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

    Python默认是以ASCII作为编码方式的,如果在自己的Python源码中包含了中文(或者其他非英语系的语言),此时即使你把自己编写的Python源文件以UTF-8格式保存了,但实际上,这依然是不行 ...

  6. 金9银10,分享几个重要的Android面试题

    说一下java多态的理解,以及接继承,和接口的理解 于哥在这里只讲多态,其他自己上网体会 对于多态的定义不同类的对象对统一函数做出不同对的响应或者动作.作用主要是消除类之间的耦合性,灵活性比较强,利于 ...

  7. Oracle Vm VirtualBox 搭建 yum 环境

    配置本地yum库(用root用户操作) 创建挂载目录 #创建挂载目录 [root@oracle ~]# mkdir /mnt/cdrom # 查看挂载目录 [root@oracle ~]# ls /m ...

  8. 限制 Confluence 6 WebDAV 客户端的写入权限

    在早期的 WebDAV 插件中分离了 WebDAV 客户端的写入权限(不能使用,创建/修改,编辑和删除操作)是分开配置的.但是在新版版本的插件中,我们将这些权限合并到了一起. WebDAV 客户端现在 ...

  9. Confluence 6 在数据源连接中启用校验查询

    确定 Confluence 在数据库连接池中校验数据库连接: 停止 Confluence. 编辑 <installation-directory>/conf/server.xml 文件(或 ...

  10. Socket网络编程(二)

    udp协议发送消息案例 1.创建UdpServer(udp服务器端) package com.cppdy.udp; import java.net.DatagramPacket; import jav ...