聊聊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 ...
随机推荐
- ubuntu14.04上源码安装openssl1.0.2k
卸载自带openssl sudo apt-get remove openssl 解压文件tar -xzf openssl-1.0.2k.tar.gz 配置 sudo ./config shared - ...
- LabVIEW--为控件添加说明信息
之前只知道为VI添加说明信息(在VI的属性里面添加,快捷键ctrl+I 打开),今天知道了控件也可以添加说明信息,这样就方便了许多,极大的提高了程序的可读性.
- WINDOWS资源编译器出错信息
ACCELERATORS语句的type域应包含ASCⅡ值或VIRTKEY值. BEGIN expected in table BEGIN关键字应紧跟在ACCELERATOR ...
- python 函数 动态参数 和嵌套
1.动态参数 是可以接收任意的参数.一种方式, 1,位置的动态传参, 写法是: *参数名 接收的参数是tuple类型举个例子:def yue(*food): print(food)yue(" ...
- Go语言从入门到放弃(一) 变量/常量/函数
HelloWorld 我们先看看一个最简单的HelloWorld代码 package main import "fmt" func main() { fmt.Println(&qu ...
- Confluence 6 用户目录图例 - 只读连接 LDAP 整合本地用户组
上面的图:Confluence 连接到一 LDAP 目录,权限对本地用户组设置为只读. https://www.cwiki.us/display/CONFLUENCEWIKI/Diagrams+of ...
- Swift中 @objc 使用介绍
在swift 中 如果一个按钮添加点击方法 如果定义为Private 或者 定义为 FilePrivate 那么会在Addtaget方法中找不到私有方法 但是又不想把方法暴露出来,避免外界访问 ,那 ...
- SS-QT5
https://blog.csdn.net/sos218909/article/details/78781017
- PHP中json_encode()使用须知,JSON数组和JSON对象
⊰ 偷偷的告诉你,这是一个很不谨慎就会踩得坑 ⊱ 如下代码 (看了一下很简单,没毛病啊,老铁) $arr = array( '0'=>'a','1'=>'b','2'=>'c',' ...
- Es6模块语法笔记
/** * Created by Administrator on 2017/4/15. */ /*---------------------export命令--------------------- ...