zoukankan      html  css  js  c++  java
  • 浅析Docker数据管理-数据库容器化并持久化:数据卷概念、创建数据卷的2种方式、docker volume用法

    一、Docker 数据管理

      在生产环境中使用Docker的过程,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。

      所谓Docker的数据持久化即:数据不随着Container的结束而结束。在Docker中,要想实现数据的持久化,需要将数据从宿主机挂载到容器中。

      容器中管理数据主要有两种方式:

    (1)数据卷(Data Volumes):容器内数据直接映射到本地主机环境;

    (2)数据卷容器(Data Volume Containers):使用特定容器维护数据卷。

    1、数据卷

      数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的 mount 操作。

      容器数据卷作用:(1)容器的持久化;(2)容器间继承 + 共享数据。

      卷 就是目录或文件,存在于一个或多个容器中,由docker挂载到容器中,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。

      卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

      数据卷可以提供很多有用的特性,如下:

    (1)数据卷可以在容器之间共享和重用,容器间传递数据将变的高效方便;

    (2)对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;

    (3)对数据卷的更新不会影响镜像,解耦了应用和数据;

    (4)数据卷的生命令周期默认会一直存在,即使容器被删除。也就是说:卷会一直存在,直到没有容器使用,可以安全的卸载它。

    2、数据卷容器

      如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。

      数据卷:“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。

      示例:docker run -v /home/dock/Downloads:/usr/Downloads --name dataVol ubuntu64 /bin/bash,创建一个普通的容器,用 --name 给他指定了一个名(不指定的话会生成一个随机的名字)。

      再创建一个新的容器,来使用这个数据卷:docker run -it --volumes-from dataVol ubuntu64 /bin/bash

      --volumes-from 用来指定要从哪个数据卷来挂载数据,这样在新创建的容器里/usr/Downloads目录会和宿主机目录/home/dock/Downloads同步。

      这里数据卷容器仅做提及,有需要可后面深度了解。

    二、创建数据卷的 2 种方式

    1、直接用命令添加

    (1)在容器内创建一个数据卷:在用 docker run 命令的时候,使用 -v 标记可以在容器内创建一个数据卷。多次重复使用 -v 标记可以创建多个数据卷。

    (2)挂载一个主机目录作为数据卷(推荐)

      使用 -v 标记也可以指定挂载一个本地的已有目录到容器中去作为数据卷(推荐方法)

      使用 docker volume create pgdata 命令创建本地卷:

    [root@CentOS /]# docker volume create pgdate
    pgdate
    [root@CentOS /]# find / -name pgdate
    /var/lib/docker/volumes/pgdate

      启动容器:

    docker run -itd --rm -v pgdata:/var/lib/postgresql/data -p 5433:5432 postgres:11.11

      Docker挂载数据卷的默认权限是读写(rw),用户也可以通过 ro 指定为只读,加了 :ro 之后,容器内对所挂载数据卷内的数据就无法修改了。

    docker run -itd --rm -v pgdata:/var/lib/postgresql/data:ro -p 5433:5432 postgres:11.11

    (3)挂载一个本地主机文件作为数据卷:-v 标记也可以从主机挂载单个文件到容器中作为数据卷(不推荐)。

    2、DockerFile 创建

      在 Dockerfile 中使用 Volume 指令来给镜像添加一个或多个数据卷。语法格式:

    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]

      说明:出于可移值和分享的考虑,用 -v 主机目录:容器目录 这种方法 不能够直接在Dockerfile中实现。

      原因是因为由于宿主机目录是依赖于特定宿主机的,并不能保证在所有宿主机上都存在这样的特定目录。

    3、测试:安装并持久化PostgreSQL

      以postgresql为例进行docker化并验证数据卷的持久性。

    (1)创建本地卷:docker volume create pgdate

    (2)启动容器:将创建的卷 pgdata 挂载到容器的 /var/lib/postgresql/data 目录

    docker run -itd --rm -v pgdata:/var/lib/postgresql/data -p 5433:5432 postgres:11.11

    (3)连接数据库发现连接成功,新建一张表插入一条记录

    (4)停止容器 docker stop CONTAINER ID ,因为启动时使用了 -rm 所以当容器退出时会自动删除容器。

    (5)再次启动一个新的容器。

    docker run -itd --rm -v pgdata:/var/lib/postgresql/data -p 5433:5432 postgres:11.11

    (6)查看数据库,发现之前的记录还在,说明持久化是成功的。

    4、可能遇到的问题

      如果Docker挂载主机目录时,Docker访问出现 catnot open directory.:Permission denied

      解决办法:在挂载目录后多加一个--privileged=true参数。如

    docker run -it -v  /hostDataVolume:/containerDataVolume --privileged=true centos

      docker 容器内添加数据卷的2种方式,具体测试可以看这篇博客:https://xiaojin21cen.blog.csdn.net/article/details/84501206

    三、docker volume用法

      volume 在docker中的意思表示将宿主机上的目录挂在到docker容器中,这样可以保持数据持久化,当将容器删除时,数据不会丢失

      volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(是创建数据卷最常用的方式

      由上图可以知道,目前所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名(就上面这一堆很长ID的名字)卷。

    1、手动创建一个volume可以使用命令:docker volume create wincom-node

    2、查看volume信息使用命令:docker volume inspect wincom-node,如下图所示

      其中Mountpoint表示的是本机的目录,当挂在到容器中后,容器中的目录则显示的是该目录下的信息。

    3、删除volume则使用命令:docker volume rm wincom-node

    4、dockerfile 里创建数据卷

    FROM tomcat:9.1
    VOLUME ["/usr/local/tomcat/webapps"]

      可以看出以DockerFile中VOLUME命令指定容器中数据卷对应位置,并没有提供能够指定在宿主机中文件的位置,其原因是,不同的宿主机下,无法确定一个目录的存在。上面没有指定数据卷在宿主机中位置,如何查看,使用 docker inspect 容器id 查看容器详情:

  • 相关阅读:
    USACO 1.2 Broken Necklace
    USACO 1.2 Friday the Thirteenth
    USACO 1.1 Greedy Gift Givers
    USACO 1.1 Your Ride Is Here
    CSP考试策略
    CF444A DZY Loves Physics【结论】
    树状数组-复习笔记
    CF792E Colored Balls【思维】
    USACO4.4 Shuttle Puzzle【bfs+优化】
    拓扑排序-学习笔记
  • 原文地址:https://www.cnblogs.com/goloving/p/15087746.html
Copyright © 2011-2022 走看看