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. 【Linux开发】linux设备驱动归纳总结(五):1.在内核空间分配内存

    linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  2. 统计学习方法 | 第3章 k邻近法 | 补充

    namedtuple 不必再通过索引值进行访问,你可以把它看做一个字典通过名字进行访问,只不过其中的值是不能改变的. sorted()适用于任何可迭代容器,list.sort()仅支持list(本身就 ...

  3. 5.写一个sh脚本,可以通过一台机器控制多台机器

    先创建一个脚步文件 对这个脚本进行编辑 [hadoop@node1 ~]$ vim xcall.sh 给脚本赋予权限 执行脚本 把脚本移动到 /usr/local/bin/目录下 [hadoop@no ...

  4. delete an extra edge from BST

    Given a BST, remove an extra edge to make it BST. 7 / \ 5   9 /  \ / 3    8 public void deleteEdge(T ...

  5. java暂停线程

    暂停线程 本节介绍两个被废弃的用于线程暂停和恢复的方法suspend().resume().主要探究废弃原因,强调线程的安全性.主要有两个原因 原因1: suspend().resume()使用不当, ...

  6. JAVA基础--JAVA API集合框架(其他集合类,集合原理)

    一.ArrayList介绍 1.ArrayList介绍 ArrayList它是List接口的真正的实现类.也是我们开发中真正需要使用集合容器对象. ArrayList类,它是List接口的实现.肯定拥 ...

  7. Makefile 书写规则

    1.1 Makefile的规则 在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则. target ... : prerequisites ...   command   ...

  8. Git服务器搭建与配置管理

    Git for Windows TortoiseGit:是一个开放的git版本控制系统的源客户端,支持Winxp/vista/win7.离不开真正的Git(Git for windows版本名字又叫M ...

  9. Docker 容器简介与部署

    关于Docker容器技术 参考文献:<docker 从入门到精通> Docker容器简介 Docker的构想是要实现 "Build,Ship and Run Any App,An ...

  10. cut--修剪小能手

    cut命令 cut原理:以每一行位一个处理对象. 参数选项 解释说明 -b 以字节为单位进行分割 -c 以字符为单位进行分割(对切割中文有奇效) -d 自定义分隔符号,默认以tab为分隔符 1:-b ...