Centos7——docker持久化存储和卷间状态共享(笔记)
docker持久化存储和卷间状态共享(笔记)
本章介绍
- 存储卷的介绍
- 存储卷的两种类型
- 宿主机好额容器之间如何共享数据
- 容器之间如何共享数据
- 存储卷的声明周期
- 存储卷之间的数据管理和控制模式
就像在容器中运行数据库程序一样,你可以将这个软件打包在镜像中,当启动容器时,它将会初始化一个空数据库。当其他程序接入该数据库并存入数据,这些数据要如何才能保存下来呢?是以容器中一个文件的形式吗?当你暂停一个容器或者删除这个容器,这些数据要怎么办?如果你想要升级数据库程序,这些数据怎么搬迁?一组不同的Web应用程序运行在不同的容器中,为了让它们的日志文件保存在容器之外,你准备把他们写到哪儿去呢?你将如何取得这些日志来排除故障呢?如何让其他程序(比如日志摘要工具)来访问这些文件呢?这些问题的答案就涉及存储卷的使用。
一、存储卷的简介
一个主机或容器的目录树是由一组挂载点创建而成,这些挂载点描述了如何能构建出一个或多个文件系统。存储卷是容器目录树上的挂载点,其中一部分主机目录树已经被挂载了。大多数人只熟悉一点点文件系统和挂载点,很少对其进行定制。比起任何其他Docker话题,存储卷会更难一点。这与对挂载点的缺乏了解有关。
docker如果没有存储卷会发生什么呢?
Docker用户会受限于Union文件系统,仅提供镜像挂载。如下图所示容器中运行着一个程序,正写数据到文件中。第一个文件写入到根文件系统。操作系统控制根文件系统将改变的部分装入Union文件系统的顶层。第二个文件则写入到已经挂载于容器目录树/data中。改动会通过存储卷直接影响到主机文件系统上。
虽然Union文件系统适用于构建和分享镜像,但对于持久化或共享数据而言,并不是理想的办法。存储卷填补了这些用例,并在容器化系统涉及中发挥了关键作用。
1.1 存储卷提供容器无关的数据管理方式
从语义上来说,存储卷是一个数据分割和共享的工具,有一个与容器无关的范围或声明周期。这使得存储卷成为了容器化系统设计中关于文件分享或写入最重要的一部分。数据示例根据其范围或者接入容器方式的不同,分成以下几种:
- 数据软件与数据库中的数据
- web应用程序苏与日志数据
- web数据处理应用程序的输入和输出数据
- web服务器与静态内容
- 产品与支持工具
存储卷可以分离关注点,并为架构组件创建模块化。这种模块化设计帮助你更轻松地了解、构建、支持和重用大型系统的部件。
二、存储卷的类型
每一个存储卷就是容器目录树的挂载点在主机目录树中的位置,但不同的是存储卷类型在主机的位置是不同的。
- 绑定挂载存储卷;
- 管理存储卷。
管理存储卷使用由Docker守护进程控制的位置,被称为Docker管理空间。存储卷类型图示如下:
每种存储卷类型都有优缺点。需要根据具体实际使用情况选择使用。
2.1 绑定挂载卷
绑定挂在卷是一种存储卷,指向主机文件系统上用户指定的位置。绑定挂载卷在主机提供的文件或目录需要挂载到容器目录的特定位置时,非常有用。
优点:
如果你想将数据分享给运行在容器外的京城,比如主机系统组件,绑定卷是非常有用的。
如果你想将主机数据通过已知的主机目录分享给容器中运行的特定程序,绑定卷也管用。
缺点:
使用绑定挂载卷的一个问题就是它们将可移植容器绑定到特定主机的文件系统,无法跨主机移植。
创造了与其他容器发生冲突的机会。
绑定挂载卷比较适合需要使用特殊挂载点的工作站或机器。最好在通用平台或硬件池避免这类特定的绑定。
[root@192.168.0.155]$~:>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 71c43202b8ac 4 days ago 109 MB
docker.io/centos latest 5182e96772bf 3 weeks ago 200 MB
docker.io/tutum/centos latest 99a633ad346f 2 years ago 297 MB
[root@192.168.0.155]$~:>docker run -d --name bmweb \
> -v ~/example-docs:/usr/local/nginx/htdocs \
> -p 80:80 \
> nginx:latest
869c499fb412874dde2c210ec4e7ff316cf5748d49f83a269ffb91543ab8582f
[root@192.168.0.155]$~:>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
869c499fb412 nginx:latest "nginx -g 'daemon ..." 6 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp bmweb
注意:
使用-v选项和位置映射来创建绑定挂载卷。该映射以冒号分割(这是Linux命令行工具的常见风格)。映射键(冒号之前的路径)是主机文件系统上的一个绝对路径,该键值(冒号后的路径)是容器中挂载的目标存储位置。你必须使用绝对路径执行该位置。
这个示例展示了存储卷的一个重要属性或特征。当你在一个容器文件系统挂载存储卷,它取代了镜像在该位置提供的内容。这种行为是后面将讨论多态容器模式的基础。
假设你想确保web服务器不能更改此卷的内容?
Docker提供了一种机制将挂载卷和存储卷设为只读权限,你可以通过在存储卷映射规则后追加:ro来完成。
[root@192.168.0.155]$~:>docker run -d --name bmweb -v ~/example-docs:/usr/local/nginx/htdocs:ro -p 80:80 nginx:latest
8bd9eaddd73f4142760ec10d504a55508cea98824f9fac03418a3afa5bcdb462
[root@192.168.0.155]$~:>
2.2 Docker管理卷
管理卷不同于绑定挂载卷,这是因为Docker守护进程会在主机文件系统中创建存储卷,并由Docker管理。
使用管理卷是一种在文件系统特定位置解耦卷的方法。当你执行docker run使用-v选项(或--volume),只要指定容器目录树中的挂载点,管理卷即可创建。
$ docker run -it --name container-test -h CONTAINER -v /data debian /bin/bash
root@CONTAINER:/# ls /data
root@CONTAINER:/#
上面的命令会将/data挂载到容器中,并绕过联合文件系统,我们可以在主机上直接操作该目录。任何在该镜像/data路径的文件将会被复制到Volume。我们可以使用docker inspect命令找到Volume在主机上的存储位置:
$ docker inspect -f {{.Volumes}} container-test
你会看到类似的输出:
map[/data:/var/lib/docker/vfs/dir/cde167197ccc3e138a14f1a4f...b32cec92e79059437a9]
这说明Docker把在/var/lib/docker
下的某个目录挂载到了容器内的/data
目录下。让我们从主机上添加文件到此文件夹下:
$ sudo touch /var/lib/docker/vfs/dir/cde167197ccc3e13814f...b32ce9059437a9/test-file
Centos7——docker持久化存储和卷间状态共享(笔记)的更多相关文章
- Docker持久化存储与数据共享
一.Docker持久化数据的方案 基于本地文件系统的Volume:可以在执行docker create或docker run时,通过-v参数将主机的目录作为容器的数据卷.这部分功能便是基于本地文件系统 ...
- 20.docker 持久化存储与数据共享
1.image layer 和 container layer 的关系 image layer 是可读的 container layer 是在image layer 之上创建的 一个可读可写层 con ...
- docker 持久化存储
1.data Volume mysql5.7:dockerfile FROM debian:stretch-slim # add our user and group first to make s ...
- 五十四.自定义镜像及仓库、持久化存储 、 Docker网络架构
1. 制作自定义镜像(base基础镜像,搭建共性环境) 基于centos镜像使用commit创建新的镜像文件 基于centos镜像使用Dockerfile文件创建一个新的镜像文件 1.1 使用镜像 ...
- Kubernetes 学习(十)Kubernetes 容器持久化存储
0. 前言 最近在学习张磊老师的 深入剖析Kubernetes 系列课程,最近学到了 Kubernetes 容器持久化存储部分 现对这一部分的相关学习和体会做一下整理,内容参考 深入剖析Kuberne ...
- 4.深入k8s:容器持久化存储
从一个例子入手PV.PVC Kubernetes 项目引入了一组叫作 Persistent Volume Claim(PVC)和 Persistent Volume(PV)的 API 对象用于管理存储 ...
- 理解Docker(8):Docker 存储之卷(Volume)
(1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 ...
- Docker 存储之卷(Volume)
理解Docker(8):Docker 存储之卷(Volume) (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespa ...
- s5 Docker的持久化存储和数据共享
数据库容器的数据如何才能不会丢失?Docker的持久化存储技术.Docker的数据共享技术能极大提高开发人员的开发效率,边写代码,边看运行结果. 数据持久化之Data Volume Docker持久化 ...
随机推荐
- ASP.NET Core EFCore 之DBFirst 自动创建实体类和数据库上下文
通过引用Nuget包添加实体类 运行 Install-Package Microsoft.EntityFrameworkCore.SqlServer 运行 Install-Package Micros ...
- IDEA项目目录里下找不到src,但是src确实存在的的解决方案
写代码的时候可能出现写着写着src就找不到了,我个人认为是触发了热键导致src被隐藏了,下面就是设置src可见和不可见的操作 这个其实是被隐藏了,打开就好,位置如下:
- 树状数组+二维前缀和(A.The beautiful values of the palace)--The Preliminary Contest for ICPC Asia Nanjing 2019
题意: 给你螺旋型的矩阵,告诉你那几个点有值,问你某一个矩阵区间的和是多少. 思路: 以后记住:二维前缀和sort+树状数组就行了!!!. #define IOS ios_base::sync_wit ...
- 入职一个月快速熟悉大型Vue项目经验感想
来到和睦的公司家庭已经一个月出头了,从技术层面来说,公司项目PC端是我目前来说接触的最大最复杂的项目了,德老师也说这个不断开发更新迭代的项目的代码量相对于全国的web来说是蛮多的,对于快速熟悉这样的大 ...
- thinkPHP模型before_insert新增前 before_update更新前 before_write写入前 区别
thinkPHP模型中有个save方法,可用于新增数据和修改数据,这里容易出现混淆. 经过调试: before_write,不管是插入新数据还是修改数据都会执行: before_insert,只有插入 ...
- MYSQL中的UNION和UNION ALL
SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...
- LCT做题笔记
最近几天打算认真复习LCT,毕竟以前只会板子.正好也可以学点新的用法,这里就用来写做题笔记吧.这个分类比较混乱,主要看感觉,不一定对: 维护森林的LCT 就是最普通,最一般那种的LCT啦.这类题目往往 ...
- StandardWrapper
Tomcat中有四种类型的Servlet容器,分别是 Engine.Host.Context.Wrapper,每个Wrapper实例表示一个具体的Servlet定义,StandardWrapper就是 ...
- Global.asax文件
转载:http://www.cnblogs.com/I-am-Betty/archive/2010/09/06/1819558.html 概述: Global.asax文件也叫做asp.net应用程序 ...
- js 控制加载|移除 script 与 link 文件
js 加载 script 文件 /** * 加载 script 文件 * @param src */ function loadScript(src) { var addSign = true; va ...