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

【数据卷】

文件是数据持久化的最常见的保存方式,由于文件系统的隔离,以及本身是以沙盒形式运行等性质,使其对保存需要持久化的数据并不稳定,对此,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. mysql定时任务,每天的零点执行一个存储过程

    1 前言 利用navicat工具来写存储过程及定时执行,此文章是按照自身经验总结的,仅作为记录使用. 2 步骤 2.1 新建过程 2.2 在函数体写你需要执行的代码 CREATE DEFINER=`r ...

  2. 6)django-示例(fbv)

    FBV(function base view),即一个url对应views.py一个函数 示例演示如下 1)FBV如何使用 2)渲染页面,并返回字典数据 3)字典数据页面如何访问 1)url.py f ...

  3. CSS基础入门

    css基础语法 一.CSS格式 选择器{ 属性名:属性值; 属性名:属性值; } 选择器负责圈定范围,要修改的元素集合,花括号内的声明由属性名和属性值组成(key:value)的形式,用于设定具体样式 ...

  4. js——数组操作

    把教程里的api看了一遍,感觉记住了,又感觉没有记住...后来发现,如果给自己提需求,或许不错.想想对于一个数组,可能会用到哪些操作呢?基本的操作就是增删改查吧(有点像sql) 1. 创建数组     ...

  5. Java中数据类型默认转换和强制类型转换

    默认转换: a:由低到高一次为:(byte   short    char  )---int ---long ---float --- double b:注意:byte   short    char ...

  6. Confluence 6 嵌入的 H2 数据库

    为了让你的 Confluence 在安装成功后就可以使用而不需要使用任何外部的数据库,Confluence 使用一个嵌入的 H2 数据库. 当你选择对 Confluence 进行评估和测试的时候,H2 ...

  7. ipone mac真机调试

    safiri 识别不了iPhone 真机  需要在iPhone上 做设置  safri-> 高级 ->web检查器  进行设置,然后重新启动  safri即可...

  8. nginx常用命令及简单配置

    nginx常用命令 nginx -c /usr/local/nginx/conf/nginx.conf 启动nginx(windows下start nginx); nginx -s quit 停止ng ...

  9. spring boot 自动配置原理

    1).spring boot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration,先看一下启动类的main方法 public ConfigurableApplic ...

  10. Nginx详解九:Nginx基础篇之Nginx的访问控制

    基于IP的访问控制:http_access_module 不允许指定网段的用户访问:配置语法:deny address | CIDR | unix: | all;默认状态:-配置方法:http.ser ...