浅析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 目录中;(是创建数据卷最常用的方式

浅析Docker数据管理-数据库容器化并持久化:数据卷概念、创建数据卷的2种方式、docker volume用法

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

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

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

浅析Docker数据管理-数据库容器化并持久化:数据卷概念、创建数据卷的2种方式、docker volume用法

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

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

4、dockerfile 里创建数据卷

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

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

浅析Docker数据管理-数据库容器化并持久化:数据卷概念、创建数据卷的2种方式、docker volume用法

 

上一篇:基于docker搭建hadoop集群


下一篇:在Android中Intent的概念及应用(一)——显示Intent和隐式Intent