Docker的持久化存储和数据共享(四)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 有些容器会自动产生一些数据,为了不让数据随着 container 的消失而消失,保证数据的安全性。例如:数据库容器,数据库的表会产生一些数据,如果我把 container 给删除,数据就丢失。为了保证数据不丢失,这就有了 Volume 的存在。

著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

有些容器会自动产生一些数据,为了不让数据随着 container 的消失而消失,保证数据的安全性。例如:数据库容器,数据库的表会产生一些数据,如果我把 container 给删除,数据就丢失。为了保证数据不丢失,这就有了 Volume 的存在。

Data Volume 结构图

16528d695086a9f9_tplv-t2oaga2asx-zoom-in-crop-mark_4536_0_0_0.png

Docker持久化数据的方案

  • 基于本地文件系统的Volume。可以在执行Docker createDocker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基本的本地文件系统的 volume 管理。
  • 基于plugin的Volume,支持第三方的存储方案,比如NAS,aws

Volume的类型

  • 受管理的data Volume:由docker后台自动创建。
  • 绑定挂载的Volume:具体挂载位置可以由用户指定。

数据持久化之Data Volume

以官方镜像mysql的dockerfile文件为例。其中dockerfile通过volume指定了当前容器中要备份的文件路径,但是并没有指定说要保存到宿主机的哪个位置。

volume: 映射容器中的文件到本地宿主机硬盘中

8& rm - rf / var / lib / mysql && mkdir - p / var / lib / mysql / var / run / mysqld \&& chown - R mysql : mysql / var / lib / mysql / var / run / mysqld \
# ensure that / var / run / mysqld ( used for socket and lock files ) is writable regardle 
&& chmod 777/ var / run / mysqld \
# comment out a few problematic configuration values 
8& find / etc / mysql /- name '*. cnf '-print0\
| xargs -0 grep -1zE'( bind - address | log )”\
| xargs - rt -0 sed - Ei ' s /( bind - address | log )/#&/'\
# don ' t reverse lookup hostnames , they are usually another container 
&& echo '[ mysqld ]\ nskip - host - cache \ nskip - name - resolve '>/ etc / mysql / conf . d /
 VOLUME / var /1ib/ mysql 
 CoPY docker - entrypoint . sh / usr / local / bin /
 RUN ln - s usr / local / bin / docker - entrypoint . sh / entrypoint . sh # backwards compat ENTRYPOINT [" docker - entrypoint . sh “]
 ExPosE 3306
 CMD [“ mysqld “ ]

在我们使用docker run 启动mysql镜像容器的时候,容器会默认在宿主机生成一个 volume,至于位置在哪,名字是什么,可以通过如下命令查看

# 查看所有volume
docker volume ls
# 删除指定volume
docker volume rm [volume name]
# 查看volume详细
docker volume inspect [volume name]
Lvagranteaocker - nost 
[ vagrant @ docker - host ~ J $ sudo docker volume 1s
 DRIVER 
 VOLUME NAME 
 QC 
e6ee590e90115677b39170b6633ae15257692ba4f8ad387f87f40cf450e669b9
 OCal 
fe82dd5ab639db1199a8adcad4bd3d4deba0548b01796329085de2ce61298c4b
[ vagrant @ docker - host ~]$[ vagrantedocker - host 
 Cvagrant @ docker - host -
~]$ sudo 
[ vagrantedocker - host ~ Js sudo 
 Error : No such volume :fe8[ vagrantedocker - host ~]$ sudo 
 docker run - d -- name mysql2- e MYSQL _ ALLOW _ EMPTY _ PASSWORD - true mysqlAC 
 aocker volume inspect fe8
 docker volume inspect fe82dd5ab639db1199a8adcad4bd3d4deba0548b01796329085de2
" CreatedAt ":"2018-01-23T16:13:01Z”,
" Driver ":" local ”,
" Labels ”: null ,
“ Mountpoint ":“/ var / lib / docker / volumes /fe82dd5ab639db1199a8adcad4bd3d4deba0548b01796329085de2ce612" Name ":"fe82dd5ab639db1199a8adcad4bd3d4deba0548b01796329085de2ce61298c4b”,
" Options ":{}
“ Scope ”:" Local ”
98c4b/_ data ”,

此时我们删除容器,发现volume数据卷还在,有保留。

[ vagrant @ docker - host mysql1
Iysql2
[ vagrant @ docker - host Lvagrantedocker - host 
[ vagrant @ docker - host 
[ vagrant @ docker - host ~ Js sudo docker ps - a 
 ONTAINER ID 
 IMAGE 
 COMMAND 
[ vagrant @ docker - host ] s sudo docker colume is 
 docker :' colume is not a docker command .
 See ' docker -- help '
[ vagrantedocker - host ~ JS sudo 
 DRIVER 
 VOLUME NAME 
 local 
e6ee590e90115677b39170b6633ae15257692ba4f8ad387f87f40cf450e669b9
0 C 
fe82dd5ab639db1199a8adcad4bd3d4deba0548b01796329085de2ce61298c4b
 cker rm mysql1mysql2
 CREATED STATUS PORTS 
 NAMES 
 docker volume ls 

此时我们会觉得这个data volume name 的名字很长,很不好理解。我们可以通过-v参数来指定生成的

volume namedocker run -d -v mysql:/var/lib/mysql --name mysql mysql5.7

:前参数是volume name, :后面的是要备份的文件目录(容器)

[ vagrant @ docker - host ~]$ sudo docker volume Ls DRIVER 
 VOLUME NAME 
1ocal
 mySql 

此时我们删除容器,volume数据卷还在,我们用这个名为mysql的volume作为一个新容器的数据卷,使用它。

docker run -d -v mysql:/var/lib/mysql --name mysql2 mysql5.7

进入mysql2容器中,mysql -uroot 进入数据库中,发现当前数据库数据和之前删除的容器中的数据库数据一样。

数据持久化之bind Mounting

和上面Data Volume不同的是,bind Mounting只能通过docker run -v方式启动,无法使用dockerfile文件的方式。

运行容器的时候指定本地的一个文件目录和容器中的一个文件目录的映射,通过这个可以做文件数据同步,两方无论哪一方有修改,另一方都会同步内容

docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name nginx nginx

这个时候-v:前面的参数是本机文件路径, :后面是docker容器文件目录, $(pwd)当前命令执行的路径

值得注意的是,使用bind Mounting方式做数据卷的映射时,首次docker run -v 运行,如果本机的文件夹是没有内容的,docker容器中的文件夹是有内容的,则本机的会覆盖dokcer容器中的,也就是容器中原本有内容的也会没有内容。

相关实践学习
Github实时数据分析与可视化
基于Github Archive公开数据集,将项目、行为等20+种事件类型数据实时采集至Hologres进行分析,并搭建可视化大屏。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
相关文章
|
1月前
|
存储 数据管理 应用服务中间件
Docker的数据管理实战篇
关于Docker数据管理实战的教程,涵盖了Docker数据卷的使用、特点、场景以及数据卷容器的概念和应用。
51 13
Docker的数据管理实战篇
|
5月前
|
应用服务中间件 nginx Docker
Docker部署Nginx以及挂载数据卷(代码详细展示)_nginx 挂载大文件卷(1)
Docker部署Nginx以及挂载数据卷(代码详细展示)_nginx 挂载大文件卷(1)
|
2月前
|
存储 Kubernetes 安全
如何与不同节点共享 Docker 容器
【8月更文挑战第27天】
30 5
|
2月前
|
存储 Docker 容器
在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
|
3月前
|
Shell Linux Docker
docker常用命令大全(基础、镜像、容器、数据卷)
这些命令仅仅是 Docker 命令行工具的冰山一角,但对于日常操作来说已经非常全面。通过熟练地使用这些基础命令,用户可以有效地管理 Docker 的镜像、容器、数据卷和网络。随着用户对 Docker 的深入使用,更高级的命令和选项将会变得必需,但上面列出的命令已经为用户提供了一个坚实的起点。对于初学者来说,理解和掌握这些常用命令是深入学习 Docker 的基础。
282 5
docker常用命令大全(基础、镜像、容器、数据卷)
|
2月前
|
存储 Linux Go
Docker Volume - 目录挂载以及文件共享
Docker Volume - 目录挂载以及文件共享
30 0
|
3月前
|
存储 NoSQL Redis
如何修改docker默认数据目录
【7月更文挑战14天】
112 3
|
3月前
|
存储 开发者 Docker
|
5月前
|
存储 数据管理 数据安全/隐私保护
【Docker专栏】Docker存储卷管理:数据持久化的关键
【5月更文挑战第7天】本文探讨了Docker容器中数据持久化的关键——存储卷,包括其独立于容器生命周期的特性、数据共享与迁移能力。Docker提供默认、命名、数据卷容器和挂载宿主机目录四种卷类型。创建与管理涉及`docker volume create`、`ls`、`run`等命令。最佳实践建议使用命名存储卷,定期备份,避免存储敏感数据,并清理未使用卷。了解和有效管理存储卷能提升容器灵活性和数据管理效率。
137 5
【Docker专栏】Docker存储卷管理:数据持久化的关键
|
3月前
|
Docker 容器
docker(四):数据卷
docker(四):数据卷
30 0
下一篇
无影云桌面