当前位置:首页 > 科技  > 软件

Docker数据持久化与数据共享

来源: 责编: 时间:2023-08-20 23:16:23 221观看
导读上篇文章的最后我们使用Docker部署了一个纯前端项目,但还有一个很重要的问题就是容器中产生的数据(比如log文件),容器一旦被删除,容器内的所有数据也就没有了,为了避免这个问题我们可以将数据存储到容器之外(比如宿主机),

上篇文章的最后我们使用Docker部署了一个纯前端项目,但还有一个很重要的问题就是容器中产生的数据(比如log文件),容器一旦被删除,容器内的所有数据也就没有了,为了避免这个问题我们可以将数据存储到容器之外(比如宿主机),这样即使删除容器也不会丢失数据。一旦容器故障,我们可以重新创建一个容器,将数据挂载到容器里,就可以快速恢复。FVk28资讯网——每日最新资讯28at.com

数据存储方式

Docker提供了以下几种存储方式:FVk28资讯网——每日最新资讯28at.com

  • 「volume卷」:这种方式是在宿主机文件系统分配一块专有存储区域,由 Docker管理,并且与主机的核心功能隔离。非 Docker 进程不能修改文件系统的这一部分。「卷是在 Docker 中持久保存数据的最佳方式」,它适合存储数据库数据,可挂到多个容器上
  • 「bind mount 绑定挂载」:这种方式是直接把宿主机目录映射到容器内,适合挂代码目录和配置文件,可挂到多个容器上
  • 「tmpfs mount临时挂载」:这种方式仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统,适合存储临时文件,不可多容器共享

FVk28资讯网——每日最新资讯28at.com

这张图很清晰的解释了volume、bind mount、temps mount与容器和宿主机之间的关系,这三者最终都是存储在宿主机上的。FVk28资讯网——每日最新资讯28at.com

重点了解volume数据卷:(其实绑定挂载也可以当成volume来理解)FVk28资讯网——每日最新资讯28at.com

  • 数据卷其实是宿主机上的一个目录
  • 当容器目录与数据卷目录绑定之后,双方的修改都会立即同步
  • 一个数据卷可以被多个容器挂载
  • 一个容器也可以挂载多个数据卷

「数据卷可以用来做容器数据持久化、外部机器与容器间接通信、容器之间间接通信」FVk28资讯网——每日最新资讯28at.com

数据卷操作

数据卷(Volume)也是常见的 Docker 对象类型的一种,因此它也支持创建、查看、删除等操作.FVk28资讯网——每日最新资讯28at.com

创建数据卷

使用docker volume create [name]指令来创建一个数据卷FVk28资讯网——每日最新资讯28at.com

docker volume create nanjiu-data

FVk28资讯网——每日最新资讯28at.com

查看所有的数据卷

docker volume ls

FVk28资讯网——每日最新资讯28at.com

查看卷信息

使用docker volume inspect [name]指令来查看对应卷信息FVk28资讯网——每日最新资讯28at.com

docker volume inspect nanjiu-data

FVk28资讯网——每日最新资讯28at.com

从上图我们可以看到Mountpoint数据卷挂载的地址,需要注意的是「对于非 Linux 系统而言(Windows 、Mac ),该目录不存在于你的文件系统中,而是存在于 Docker 虚拟机中。」FVk28资讯网——每日最新资讯28at.com

删除数据卷

使用docker volume rm [name]指令来删除对应的数据卷FVk28资讯网——每日最新资讯28at.com

docker volume rm nanjiu-data

FVk28资讯网——每日最新资讯28at.com

这里需要注意的是:FVk28资讯网——每日最新资讯28at.com

  • 「数据卷是用来做持久化数据的,它的生命周期独立于容器,所以Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷」
  • 「如果需要在删除容器的同时移除数据卷,可以在删除容器的时候使用 docker rm -v 指令」

如果想要清除所有无容器引用的数据卷,可以使用以下指令:FVk28资讯网——每日最新资讯28at.com

docker volume prune

与容器一起使用

数据卷本身是用来为容器做数据持久化的,所以单独创建一个数据卷的意义并不大。FVk28资讯网——每日最新资讯28at.com

创建容器与数据卷

命名数据卷

可以使用docker run指定-v或-mount来创建数据卷,两者产生的结果相同,最大的区别在于-v语法将所有选项组合在一个字段中,而--mount 语法则将它们分开。FVk28资讯网——每日最新资讯28at.com

docker run -itd -v nanjiu-vol:/nanjiu-data --name nanjiu nginx:latest

这里通过-v指定了数据卷的名称为nanjiu-vol,并且对应绑定容器中的路径为/nanjiu-data对于容器中不存在的文件夹,Docker会帮我们自动新建,所以我们可以进入到容器中查看是否有该文件夹FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

这里我们可以看到容器中对应的数据卷目录FVk28资讯网——每日最新资讯28at.com

匿名数据卷

这里还有一种类型叫做匿名数据卷,他的创建方式只需要省略数据卷名称就可以,然后Docker会为它生成一长串的hash值作为数据卷的名称FVk28资讯网——每日最新资讯28at.com

docker run -itd -v /nanjiu-noname --name nanjiu-noname nginx:latest

FVk28资讯网——每日最新资讯28at.com

验证数据持久化

我们先在这个数据卷目录新建一个文件,再把当前容器删除FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

然后我们再重新创建一个容器并绑定上面那个数据卷,如果数据卷中的内容还存在,那就能够证明数据是持久化存储的,不会随着容器的删除而删除FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

「从这里我们就能够验证数据卷可以用来做持久化存储了」FVk28资讯网——每日最新资讯28at.com

绑定挂载

上面我们提到过它可以当成数据卷来理解,因为它在使用过程中几乎与数据卷类似,不同的地方是它其实是与宿主机的文件系统进行绑定FVk28资讯网——每日最新资讯28at.com

docker run -itd -v ~/Desktop/nanjiu-mount-data:/nanjiu-mount-data --name nanjiu nginx:latest

这里-v的格式为 :,对应绑定的是宿主机目录与容器目录FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

然后可以到桌面看对应的文件是否存在FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

「绑定挂载可以让宿主机与容器共享数据,并且同样不会随容器的删除而删除,也可以用来实现数据持久化,上面有提到他适合用来挂载代码目录和配置文件」FVk28资讯网——每日最新资讯28at.com

数据共享

容器与宿主机共享数据

绑定挂载

这个很好理解,上面那种bind mount绑定挂载方式就是最明确的,它是直接将宿主机上的目录挂载到容器。FVk28资讯网——每日最新资讯28at.com

docker cp

volume数据卷的方式想要实现容器与宿主机共享数据稍微有点麻烦,因为「这种方式是在宿主机文件系统分配一块专有存储区域,由 Docker管理,并且与主机的核心功能隔离。非 Docker 进程不能修改文件系统的这一部分」FVk28资讯网——每日最新资讯28at.com

但好在docker提供的docker cp命令可以用来拷贝文件,该docker cp命令可以将内容从SRC_PATH复制到DEST_PATH. 您可以从容器的文件系统复制到本地计算机,或者相反,从本地文件系统复制到容器。FVk28资讯网——每日最新资讯28at.com

docker cp 88eecfd2dd14:/nanjiu-data ~/Desktop/cpDir

FVk28资讯网——每日最新资讯28at.com

然后查看本地桌面是否有了拷贝过来的内容FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

通过这种方式也能实现宿主机与容器之间的数据共享,但它的缺点在于每次都需要手动操作,数据共享比较麻烦。FVk28资讯网——每日最新资讯28at.com

容器与容器之间共享数据

绑定挂载

这里第一种方式仍然是可以使用bind mount绑定挂载,因为同一个文件可以挂载到多个容器,这样就可以借助宿主机中转来实现容器之间的数据共享了,这种方式比较简单易懂。FVk28资讯网——每日最新资讯28at.com

数据卷容器

数据卷容器是一个专门为其它容器提供卷的容器,它提供的卷可以是bind mount,也可以是docker volume「数据卷容器在为其它容器提供卷功能时可以不需要处于运行状态」FVk28资讯网——每日最新资讯28at.com

这里创建了两种类型的volume,同时挂载在nanjiu-vc这个数据卷容器上,这个容器可以不启动FVk28资讯网——每日最新资讯28at.com

docker create --name nanjiu-vc / > -v ~/Desktop/nanjiu-vc:/nanjiu-vc /> -v nanjiu-vc:/nanjiu-vc2 /> nginx:latest

FVk28资讯网——每日最新资讯28at.com

其他容器可以通过--volumes-from使用nannie-vc这个数据卷容器FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

这里建了两个容器都使用nanjiu-vc这个数据卷容器FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

这样两个容器就通过数据卷容器实现了数据共享。FVk28资讯网——每日最新资讯28at.com

「这种方式的优点在于:」FVk28资讯网——每日最新资讯28at.com

与bind mount相比,不必为每一个容器指定宿主机path,所有path都在volume container中定义好了,容器只需与volume container关联,实现了容器与host的解耦。FVk28资讯网——每日最新资讯28at.com

使用volume container的容器,其mount point是一致的,有利于配置的规范和标准化,但也带来一定的局限,使用时需要综合考虑。FVk28资讯网——每日最新资讯28at.com

改造之前的log存储方式

之前的那种部署方式存在一个问题,如果容器出现故障被销毁,那么容器内产生的log文件也就没有了,现在我们可以把它改造成将nginx产生的log文件使用数据卷存储,当容器出现故障,我们只需要重新创建一个容器并挂载数据就可以快速恢复log文件排查问题FVk28资讯网——每日最新资讯28at.com

修改Dockerfile

# 指定node镜像FROM node:16-alpine as builder# 指定工作目录WORKDIR /code# 代码复制到工作目录ADD . /code# 安装依赖RUN npm install --registry=https://registry.npm.taobao.org# 打包RUN npm run build# 指定nginx镜像FROM nginx:alpine# 创建nginx日志目录数据卷VOLUME ["/var/log/nginx"]# 复制打包后的代码到nginx容器中COPY --from=builder /code/dist /usr/share/nginx/htmlCOPY /nginx.conf /etc/nginx/nginx.conf# 暴露端口EXPOSE 8080

重新打包镜像

docker build -t nanjiu:1.0.1 .

FVk28资讯网——每日最新资讯28at.com

创建容器

基于上面nanjiu:1.0.1镜像创建一个容器nanjiu-web3docker run -d -p 9099:8080 --name nanjiu-web3 nanjiu:1.0.1FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

访问页面

这里主要是为了产生nginx日志文件FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

将容器删除

docker stop 4355deda547f # 停止容器docker rm 4355deda547f # 删除容器

容器虽然被删除了,但数据卷并不会跟随容器的删除而删除FVk28资讯网——每日最新资讯28at.com

FVk28资讯网——每日最新资讯28at.com

新建容器绑定数据卷查看数据

docker run -d /-v 3690f4f3b2d15466a9dfa7f692cba06add99daba3f76b8e7ffdc99b1c5937a8a:/nginx-data /--name nanjiu-web4 nginx:latest

FVk28资讯网——每日最新资讯28at.com

这样一来即使容器出现故障被删除,也不影响查看log文件排查问题。FVk28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-6150-0.htmlDocker数据持久化与数据共享

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何为游戏开发优化3D模型?

下一篇: 使用Redis分布式锁可能会出现哪些问题?

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 女孩租房开2小时空调用完100元电费引热议:5级能耗惹不起 月薪过万电费也交不起

    女孩租房开2小时空调用完100元电费引热议:5级能耗惹不起 月薪过万电费也交不起

    近日,江苏苏州一女孩租房当天充值了100元电费,开着空调不到2小时发现电费已用完。对于为什么这个快,房东表示,电表坏了这种情况很多,之前也遇到过,给租客换
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 一篇文章带你了解 CSS 属性选择器

    一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 这款新兴工具平台,让你的电脑效率翻倍

    这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 与兆芯合作  联想推出全新旗舰版笔记本电脑开天N7系列

    与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top