浅析Docker数据管理-数据库容器化并持久化:数据卷概念、创建数据卷的2种方式、docker volume用法
2021/8/2 2:05:58
本文主要是介绍浅析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 查看容器详情:
这篇关于浅析Docker数据管理-数据库容器化并持久化:数据卷概念、创建数据卷的2种方式、docker volume用法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14Docker端口:你真的公开了哪些东西?
- 2024-11-14用DOCKER在家里的实验室里搞些酷炫的玩意儿
- 2024-11-05掌握Docker:高效安全的十大最佳实践
- 2024-11-05在 Docker Compose 中怎么设置端口映射-icode9专业技术文章分享
- 2024-11-05在 Docker Compose 中怎么设置环境变量-icode9专业技术文章分享
- 2024-11-04Docker环境部署项目实战:新手入门教程
- 2024-11-04Docker环境部署资料:新手入门教程
- 2024-11-01Docker环境部署教程:新手入门指南
- 2024-11-01超越Docker:苹果芯片上的模拟、编排和虚拟化方案讲解
- 2024-11-01Docker环境部署:新手入门教程