docker持久化存储和卷间状态共享(笔记) 

本章介绍

  • 存储卷的介绍
  • 存储卷的两种类型
  • 宿主机好额容器之间如何共享数据
  • 容器之间如何共享数据
  • 存储卷的声明周期
  • 存储卷之间的数据管理和控制模式

  就像在容器中运行数据库程序一样,你可以将这个软件打包在镜像中,当启动容器时,它将会初始化一个空数据库。当其他程序接入该数据库并存入数据,这些数据要如何才能保存下来呢?是以容器中一个文件的形式吗?当你暂停一个容器或者删除这个容器,这些数据要怎么办?如果你想要升级数据库程序,这些数据怎么搬迁?一组不同的Web应用程序运行在不同的容器中,为了让它们的日志文件保存在容器之外,你准备把他们写到哪儿去呢?你将如何取得这些日志来排除故障呢?如何让其他程序(比如日志摘要工具)来访问这些文件呢?这些问题的答案就涉及存储卷的使用。

一、存储卷的简介

  一个主机或容器的目录树是由一组挂载点创建而成,这些挂载点描述了如何能构建出一个或多个文件系统。存储卷是容器目录树上的挂载点,其中一部分主机目录树已经被挂载了。大多数人只熟悉一点点文件系统和挂载点,很少对其进行定制。比起任何其他Docker话题,存储卷会更难一点。这与对挂载点的缺乏了解有关。

docker如果没有存储卷会发生什么呢?

  Docker用户会受限于Union文件系统,仅提供镜像挂载。如下图所示容器中运行着一个程序,正写数据到文件中。第一个文件写入到根文件系统。操作系统控制根文件系统将改变的部分装入Union文件系统的顶层。第二个文件则写入到已经挂载于容器目录树/data中。改动会通过存储卷直接影响到主机文件系统上。

  虽然Union文件系统适用于构建和分享镜像,但对于持久化或共享数据而言,并不是理想的办法。存储卷填补了这些用例,并在容器化系统涉及中发挥了关键作用。

1.1 存储卷提供容器无关的数据管理方式

  从语义上来说,存储卷是一个数据分割和共享的工具,有一个与容器无关的范围或声明周期。这使得存储卷成为了容器化系统设计中关于文件分享或写入最重要的一部分。数据示例根据其范围或者接入容器方式的不同,分成以下几种

  • 数据软件与数据库中的数据
  • web应用程序苏与日志数据
  • web数据处理应用程序的输入和输出数据
  • web服务器与静态内容
  • 产品与支持工具

  存储卷可以分离关注点,并为架构组件创建模块化。这种模块化设计帮助你更轻松地了解、构建、支持和重用大型系统的部件。

二、存储卷的类型

  每一个存储卷就是容器目录树的挂载点在主机目录树中的位置,但不同的是存储卷类型在主机的位置是不同的。

  1. 绑定挂载存储卷;
  2. 管理存储卷。

  管理存储卷使用由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持久化存储和卷间状态共享(笔记)的更多相关文章

  1. Docker持久化存储与数据共享

    一.Docker持久化数据的方案 基于本地文件系统的Volume:可以在执行docker create或docker run时,通过-v参数将主机的目录作为容器的数据卷.这部分功能便是基于本地文件系统 ...

  2. 20.docker 持久化存储与数据共享

    1.image layer 和 container layer 的关系 image layer 是可读的 container layer 是在image layer 之上创建的 一个可读可写层 con ...

  3. docker 持久化存储

    1.data Volume  mysql5.7:dockerfile FROM debian:stretch-slim # add our user and group first to make s ...

  4. 五十四.自定义镜像及仓库、持久化存储 、 Docker网络架构

    1. 制作自定义镜像(base基础镜像,搭建共性环境) 基于centos镜像使用commit创建新的镜像文件 基于centos镜像使用Dockerfile文件创建一个新的镜像文件   1.1 使用镜像 ...

  5. Kubernetes 学习(十)Kubernetes 容器持久化存储

    0. 前言 最近在学习张磊老师的 深入剖析Kubernetes 系列课程,最近学到了 Kubernetes 容器持久化存储部分 现对这一部分的相关学习和体会做一下整理,内容参考 深入剖析Kuberne ...

  6. 4.深入k8s:容器持久化存储

    从一个例子入手PV.PVC Kubernetes 项目引入了一组叫作 Persistent Volume Claim(PVC)和 Persistent Volume(PV)的 API 对象用于管理存储 ...

  7. 理解Docker(8):Docker 存储之卷(Volume)

    (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 ...

  8. Docker 存储之卷(Volume)

      理解Docker(8):Docker 存储之卷(Volume) (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespa ...

  9. s5 Docker的持久化存储和数据共享

    数据库容器的数据如何才能不会丢失?Docker的持久化存储技术.Docker的数据共享技术能极大提高开发人员的开发效率,边写代码,边看运行结果. 数据持久化之Data Volume Docker持久化 ...

随机推荐

  1. 【VS开发】【DSP开发】浅谈Linux PCI设备驱动(二)

    我们在 浅谈Linux PCI设备驱动(一)中(以下简称 浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设 ...

  2. 好用的 Chrome 插件

    这些好用的 Chrome 插件,提升你的工作效率   本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可 ...

  3. 笔记本通过命令配置wifi win7系统

    查看本子是否支持承载网络 在开始菜单>附件>命令提示符(右键点击:以管理员身份运行) 命令行中输入以下内容,找到[支持的承载网络]这一行,如果为"是"就OK了,表示支持 ...

  4. Mybatis(三) 动态SQL

    if + where 用法 1. if 元素来实现多条件查询 1.1 UserMapper.xml配置文件 <!--查询用户列表 (if)--> <select id="g ...

  5. SqlServer中#和##的区别

    本地临时表的名称以单个数字字符(#)开头,它们仅对当前的用户连接是可见的. 全局临时表的名称以两个数字字符(##)开头,创建后对任何用户都是可见的.

  6. 【洛谷P1816】忠诚——ST表做法

    看了两个小时RMQ并位运算,对二进制勉勉强强有了个初步了解,不能说精通(可能今年CSP前都做不到精通),但是记熟板子做做题还是没有问题的 以下是正式题解,相信你看过了题目,我介绍的是ST表的做法(很简 ...

  7. SQL之事务

    ●事务的ACID(acid)属性 ➢1.原子性(Atomicity ) 原子性是指事务是-一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. ➢2. 一致性(Consistency) 事务 ...

  8. Docker学习1

    命名空间(Namesaoces):Linux内核提供的一种对进程资源隔离的机制,例如网络.进程.挂载点等资源. 控制组(CGroups):Linux内核提供的一种限制进程资源的机制:例如CPU.内存等 ...

  9. LinkedList实现基于LRU算法的缓存

    LinkedList实现基于LRU算法的缓存 2015年08月07日 18:18:45 秦江波 阅读数 2068 文章标签: java算法linkedlist缓存LRU更多 分类专栏: Java   ...

  10. Git复习(十二)之命令专场

    命令 git init -> 初始化一个git仓库 git clone -> 克隆一个本地库 git pull -> 拉取服务器最新代码 git fetch –p -> 强行拉 ...