聊聊Docker数据卷和数据卷容器
当程序在容器运行的时候,特别是需要与其他容器中的程序或容器外部程序进行沟通交流,这时需要进行数据交换,作为常用的两种沟通数据的方式,网络通信与文件读写是需要提供给程序的支持,
【数据卷】
文件是数据持久化的最常见的保存方式,由于文件系统的隔离,以及本身是以沙盒形式运行等性质,使其对保存需要持久化的数据并不稳定,对此,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数据卷和数据卷容器的更多相关文章
- Docker 数据卷和数据卷容器
1.本节课主要讲解如何在Docker内部及容器之间管理数据.容器中管理数据主要有两种方式:数据卷(Data volumes)数据卷容器(Data volume containers) 2.数据卷:是一 ...
- Docker学习笔记:镜像、容器、数据卷
核心概念 镜像:一个只读的模板,类似虚拟机的镜像. 容器:可以理解为镜像的一个运行实例.运行时类似于沙箱,多个容器互相独立. 仓库:存放镜像文件的地方. 镜像 命令表格 命令 解释 选项 docker ...
- Docker数据卷和数据卷容器
是什么 数据卷设计的目的,在于数据的永久化,他完全独立于容器的生存周期,因此,Docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制对容器引用的数据卷进行处理.类似我们Redis ...
- Docker-数据卷和数据容器卷
容器中管理数据主要有两种方式: 数据卷(Data Volumes) 数据卷容器(Data Volumes Dontainers) 数据卷 使用-v可以挂载一个本地的目录到容器中作为数据卷. [root ...
- Docker 使用指南 (四)—— 数据卷的使用
一.数据卷的使用 有时候需要使用数据库,但是又希望它的数据能保存在本地,Docker中提供了数据卷可以供你方便的操作数据.数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用 ...
- docker--数据卷与数据卷容器
docker--数据卷与数据卷容器 1.数据卷: 创建一个volumes的文件夹: [root@docker01 /]# mkdir volumes [root@docker01 /]# ls bin ...
- Docker:网络及数据卷设置 [四]
一.Docker网络设置 默认情况下,docker会创建一个桥接网卡[docker 0],docker有2种映射方式,一种是随机映射,一种是指定映射 提示:生产场景一般不使用随机映射,但是随机映射的好 ...
- Docker Kubernetes Volume 本地数据卷
Docker Kubernetes Volume 本地数据卷 emptyDir 当Pod分配到Node时,首先创建一个空卷,并挂载到Pod中的容器. Pod中的容器可以读取和写入卷中的文件. 当Pod ...
- Docker Kubernetes Volume 网络数据卷
Docker Kubernetes Volume 网络数据卷 由于支持网络数据卷众多 今天只拿nfs作为案例. 支持网络数据卷 nfs iscsi glusterfs awsElasticBlockS ...
随机推荐
- YUV的数据格式
一.YUV格式分为两大类:planar(平面)和packed(打包).planar格式,先连续存储所有像素点的Y分量,紧接着存储所有像素点的U,随后存储所有像素点的V.packed格式,每个像素点的Y ...
- 5分钟搞定Nginx安装
1. 安装gcc(centos 7之后一般已自带,可以在第6步失败后再安装) yum install gcc gcc-c++ 2. 安装pcre yum install -y pcre pcr ...
- 小白6步搞定vue脚手架创建项目
1.安装node及npm node -v (测试node是否安装成功)npm -v(测试npm是否安装成功) 2.安装cnpm npm install -g cnpm --registry=http: ...
- 【进阶3-2期】JavaScript深入之重新认识箭头函数的this(转)
这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/21 上篇文章详细的分析了各种this的情况,看过之后对this的概 ...
- ASP.NET的路由系统:路由映射
总的来说,我们可以通过RouteTable的静态属性Routes得到一个基于应用的全局路由表,通过上面的介绍我们知道这是一个类型的RouteCollection的集合对象,我们可以通过调用它的MapP ...
- Confluence 6 数据库整合的方法 1:基本流程
步骤 1:对你的插件进行记录 对你近期在 Confluence 中安装和启用的插件进行记录,这你可以在后期对插件进行重新安装或者调整.针对你安装的插件,你需要记录下面的一些内容: 插件名称 版本号 启 ...
- AFN 请求报 415错误解决方案
使用 AFHTTPSessionManager 发起请求时 设置下面两句代码 manager.requestSerializer = [AFJSONRequestSerializer seriali ...
- bat如何实现自动创建文件夹(以当前时间命名)
先比较直接的查看当前的日期和时间:(或者cmd中直接输入date,time查看) @echo off color 0a set dt=%date%%time% echo %dt% pause 1.使用 ...
- django rest framework(4)
目录 一.分页 二.视图 三.路由 四.渲染器 一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一 ...
- 浅谈js的join()方法
简单描述:今天看同事的代码,看js的时候,看到了一个join()方法,我从来都没有用过,就查了查,第一次用就记录一下 正经的: 定义和用法 join() 方法用于把数组中的所有元素放入一个字符串. 元 ...