ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-08-01 22:33:40  阅读:165  来源: 互联网

标签:容器 目录 浅析 volume 挂载 Docker 数据 docker


一、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 查看容器详情:

 

标签:容器,目录,浅析,volume,挂载,Docker,数据,docker
来源: https://www.cnblogs.com/goloving/p/15087746.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有