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. vim编辑器详解(week1_day3)

    vi编辑器   作用:编辑文本文件中的内容的工具   命令历史   末行模式中,以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令.   启动vim   在命令行窗口中 ...

  2. [Python3] 033 异常

    目录 异常 1. 简介 2. 异常的分类 3. 出现异常小例子 例子 4. 异常处理 5. 解决异常小例子 5.1 例子1 5.2 例子2 5.3 例子3 5.4 例子4 6. 手动引发异常 6.1 ...

  3. [转帖]How does a CPU work?

    How does a CPU work? https://milapneupane.com.np/2019/07/06/how-does-a-cpu-work/ CPU, also known as ...

  4. SpringMVC基础教程

    1. 最简单的配置 首先是要有相应的配置文件: 文件内容: <context:component-scan base-package="com.imethsoft.server.*&q ...

  5. AppCan模拟器调试

    来源: 1, 页面CSS调试 2, JS调试 3, 插件请打包后手机调试 4, 打开另一个页面示例: appcan.button("#myBtn", "ani-uct&q ...

  6. 下载安装npm和cnpm

    下载安装npm http://nodejs.cn/download/ 下载安装cnpm 完成npm的安装后,再安装cnpm https://npm.taobao.org/ 切换源为 taobao 源 ...

  7. docopt 安装及基本应用

    什么是 docopt docopt是一种python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 使用这种语言可以在自己的脚本中,添加一些规则限制,这样脚本在执行 ...

  8. CF 403D Beautiful Pairs of Numbers

    The sequence of integer pairs (a1, b1), (a2, b2), ..., (ak, bk) is beautiful, if the following state ...

  9. 外贸开发,用java调用速卖通api第一步,token的获取。

     第一步 定义速卖通api的常量  public String client_id;  public String client_key;  public String site;   第二步 获取登 ...

  10. LintCode 64---合并排序数组

    public class Solution { /* * @param A: sorted integer array A which has m elements, but size of A is ...