docker 数据持久化

文章目录

    • 定制镜像持久化
      • 需求
      • 实现
    • 数据卷持久化
      • 数据卷简介
      • 数据卷的特性
      • 创建读写数据卷
        • 停止容器后的操作
        • 查看数据卷详情
      • 创建只写数据卷
        • 查看数据卷详情
      • 创建共享数据卷
    • Dockerfile持久化
      • 创建Dockerfile、构建和运行镜像
      • 查看宿主机端的目录

在容器层的 UnionFS(联合文件系统)中对文件/目录的任何修改,无论是手工修改还是容器在运行过程中的修改,在该容器丢失或被删除后这些修改将全部丢失。即这些修改是无法保存下来的。若要保存下来这些修改,通常有两种方式:

  • 定制镜像持久化:将这个修改过的容器生成一个新的镜像,让这些修改变为只读的镜像

  • 数据卷持久化:将这些修改通过数据卷同步到宿主机

定制镜像持久化

需求

DockerHub上拉取的centos:7镜像是没有vim工具的,现在将centos:7镜像运行后下载vim工具,再将这个容器打包为一个镜像(centos7:vim)。最后运行这个镜像,可以看到这个镜像里面是有vim工具的。

实现

由于之前做过类似的需求,在此我只把使用的命令展示出来。

# 运行centos:7镜像
docker run --name centos1 -it centos:7# 进入到centos7的shell后下载vim
yum install -y vim# 下载完成之后输入exit退出centos7容器的shell环境。
# 并将该容器打包为一个镜像
docker commit -m="add vim" -a="bing" centos1 centos7:vim# 打包完成后运行这个新镜像
docker run --name centos_vim -it centos7:vim# 查看vim的版本
vim --version

数据卷持久化

数据卷简介

数据卷宿主机中的一个特殊的文件/目录,这个文件/目录与容器中的另一个文件/目录进行了直接关联,在任何一端对文件/目录的写操作,在另一端都会同时发生相应变化。在宿主中的这个文件/目录就称为数据卷,而容器中的这个关联文件/目录则称为该数据卷在该容器中的挂载点。数据卷的设计目的就是为了实现数据持久化,其完全独立于容器的生命周期,属于宿主机文件系统,但不属于 UnionFS。因此,容器被删除时,不会删除其挂载的数据卷。

数据卷的特性

数据卷具有如下明显特性:

  • 数据卷在容器启动时初始化,如果容器启动后容器本身已经包含了数据,那么,这些数据会在容器启动后直接出现在数据卷中,反之亦然。

  • 可以对数据卷或挂载点中的内容直接修改,修改后对方立即可看到。

  • 数据卷会一直存在,即使挂载数据卷的容器已经被删除。

  • 数据卷可以在容器之间共享和重用。

创建读写数据卷

数据卷是在使用 docker run 启动容器时指定的,其语法格式为:

docker run -it -v /宿主机目录绝对路径:/容器内目录绝对路径 镜像名

注:无论是宿主机中的数据卷还是容器中的挂载点,如果指定的目录不存在,那么 docker引擎都会自动创建。即使是多级目录不存在。

# 启动容器并创建数据卷
docker run --name centos1 -it -v /tmp/read_write_sour:/tmp/read_write_dest centos:7

在容器的/tmp/read_write_dest目录下创建hello.log文件,并写入数据。
image-20230913123654815

看宿主机的/tmp/read_write_sour目录下是否有文件和数据,然后向hello.log文件中添加数据。
image-20230913124045098

看看容器的/tmp/read_write_dest目录下的hello.log文件是否有宿主机添加的数据。
image-20230913124217614

停止容器后的操作

即使容器停止了,在宿主机中只要修改了数据卷目录内容,在重新启动容器后,该修改过的数据仍会出现在容器中。因为容器是一个 UnionFS,是一个存在于宿主机中的文件系统,无论容器是否运行,该 FS 都是存在的。
image-20230913125119583

查看数据卷详情

通过 docker inspect [容器] 命令可以查看到当前容器中挂载点与数据卷的绑定关系,其中Mounts表示挂载的意思。
image-20230913125316507

这里给出了数据卷 Source 与挂载点 Destination 的绑定关系,且容器对挂载点的默认操作权限是 RW 读写的。

创建只写数据卷

只读数据卷,指的是容器对挂载点的操作权限是只读的宿主机对数据卷的操作权限始终是读写的。有些情况下,为了防止容器在运行过程中对文件产生修改,就需要创建只读数据卷。创建只读数据卷的命令比之前的命令仅多了:ro,具体语法如下:

docker run -it -v /宿主机目录绝对路径:/容器内目录绝对路径:ro 镜像名

# 启动容器并创建只读数据卷
docker run --name centos2 -it -v /tmp/read_only_sour:/tmp/read_only_dest:ro centos:7

在宿主机中的/tmp/read_only_sour目录下创建一个read-only.log文件,并写入数据。
image-20230913150455156

登录到容器中的/tmp/read_only_dest目录下,看看reda-only.log文件的内容,并尝试写入数据。
image-20230913150939058

发现在容器中并不能向read-only.log写入数据,说明在该目录下,所有的文件对于容器来说都是只读的。

查看数据卷详情

通过 docker inspect centos2 命令可以查看到该数据卷的RW为false,也就是该容器对数据卷有只读属性。
image-20230913151351735

创建共享数据卷

当一个容器与另一个容器使用相同的数据卷时,就称这两个容器实现了“数据卷共享”。而数据卷容器是实现数据卷共享的一种非常有效的方案。当一个容器 C 启动运行时创建并挂载了数据卷,若其它容器也需要共享该容器 C 挂载的数据卷,这些容器只需在 docker run 启动时通过 --volumes-from “容器C” 选项即可实现数据卷共享。此时容器 C 就称为数据卷容器。

现在搭建如下环境的各种容器以及数据卷。
image-20230913160517198

# 首先创建一个使用读写数据卷的centos:3的容器并运行。
docker run --name centos3 -it -v /tmp/share_sour:/tmp/share_dest centos:7# 然后创建两个容器分别是tomcat1和tomcat2,注意加上--volumes-from centos3的选项。
docker run --name tomcat1 --volumes-from centos3 -it tomcat:8.5.32 /bin/bash
docker run --name tomcat2 --volumes-from centos3 -it tomcat:8.5.32 /bin/bash

容器创建完成后,首先宿主机在/tmp/share_sour目录下创建一个share.log的文件,并写入数据。
image-20230913161915530

第二步是centos3容器在/tmp/share_dest目录下读取数据并写入数据。
image-20230913162126945

第三步是tomcat1容器在/tmp/share_dest目录下读取数据并写入数据。
image-20230913162300903

第四步是tomcat2容器在/tmp/share_dest目录下读取数据并写入数据。
image-20230913162353465

可以看到这三个容器和宿主机之间实现了数据共享。

Dockerfile持久化

Dockerfile 持久化,其实就是通过使用 Dockerfile 的 VOLUME 指令指定数据卷方式实现的持久化。VOLUME 指令可以在容器中创建可以挂载数据卷的挂载点。其参数可以是字符串数组,也可以是使用空格隔开的多个纯字符串。例如,VOLUME [ “/tmp/demo”, “/etc/apache”] 或VOLUME /tmp/demo /etc/apache。

创建Dockerfile、构建和运行镜像

首先mkdir 一个目录,例如 volume,然后在其中新建 Dockerfile,内容如下。这里指定/tmp/demo1 与/opt/demo2 为容器端的挂载点。

FROM centos:7
VOLUME /tmp/demo1 /opt/demo2
CMD /bin/bash

然后就是构建和运行镜像,命令如下:

# 构建镜像
docker build -t volume .# 运行镜像
docker run --name vols -it volume

查看宿主机端的目录

Ctrl + P + Q 退出容器后,使用 docker inspect vols 查看当前容器中的挂载点目录到底与宿主机中的哪个数据卷对应。
image-20230913164350487

Source是宿主机的目录,Destination是容器的目录。向/var/lib/docker/volumes/0083b3d0a8c8ea137e2bf43a7e43ad1c68e5155415eb293489041bd6dadd50fc/_data 中写入数据,看看容器的/opt/demo2下是否有数据。
image-20230913164929604

这就是使用Dockerfile实现数据持久化的方式,即使删除了容器和镜像,数据也还在宿主机的/var/lib/docker/volumes/······/_data目录下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记1.2 计算机网络结构

网络边缘 主机、网络应用 接入网络,物理介质 有线或无线通信链路 网络核心(核心网络): 互联的路由器(或分组转发设备) 网络之网络 一、网络边缘 主机(端系统): 位…

vue3+ts+uniapp小程序封装获取授权hook函数

vue3tsuniapp小程序封装获取授权hook函数 小程序授权的时候,如果点击拒绝授权,然后就再也不会出现授权了,除非用户手动去右上角…设置打开 通过uni官方api自己封装一个全局的提示: uni.getSetting :http://uniapp.dcloud.io/api/other/settin…

Java操作Influxdb2.x

本片文章不讲怎么安装,只讲安装后如何用JAVA代码操作库表 1.创建数据库2.为bucket添加TELEGRAF配置3.TELEGRAF配置参数说明4.配置数据库的访问权限API TOKENS5.JAVA代码操作库表5.1 yaml5.2 pom依赖5.3 config5.4 controller5.5 查询方法、结果集提取方法 1.创建数据…

SpringBoot-插件化以及springboot扩展接口

插件化常用的实现思路 spi机制,Service Provider Interface ,是JDK内置的一种服务发现机制,SPI是一种动态替换扩展机制约定配置和目录,利用反射配合实现springboot中的Factories机制Java agent(探针)技术S…

JavaScript中的Generator函数及其使用方式

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Generator函数⭐ 创建Generator函数⭐ 调用Generator函数⭐ Generator函数的应用1. 异步编程2. 生成器(Generator) ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧…

老板要我开发一个简单的工作流引擎-读后感与补充

概述 最近读了一篇《老板要我开发一个简单的工作流引擎》 幽默风趣,干货较多,作为流程引擎的设计者、开发者、探索者,写的很好,合计自己的理解,对每个功能补充说明,对于流程引擎的应用场景,做出…

vue中slot,slot-scope,v-slot的用法和区别

slot用于设置标签的属性值(slot“title”)slot-scopev-slot slot <el-menu-item v-if"!navMenu.children" :key"navMenu.id" :index"navMenu.id " click"itemClick(navMenu)" ><span slot"title">{{ navMenu.…

无涯教程-JavaScript - N函数

描述 N函数返回一个转换为数字的值。 语法 N (value) 争论 Argument描述Required/OptionalValue 要转换的值或对值的引用。 N转换下表中列出的值。 Required 值 N的返回值一个数字那个数字日期,采用Microsoft Excel中可用的内置日期格式之一该日期的序列号 TRUE 1 FALSE…

大数据课程L3——网站流量项目的系统搭建

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解网站流量项目的运行环境; ⚪ 了解网站流量项目的日志采集系统搭建; ⚪ 了解网站流量项目的离线业务系统搭建; ⚪ 了解网站流量项目的Hive做离线数据处理; ⚪ 了解网站流量项目的…

Java笔记:Java线程Dump分析

1 Thread Dump介绍 1.1 什么是Thread Dump Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力&#xff0c;虽然各个 Java虚拟机打印的thread dump略有不同&#xff0c;但是 大多都提供了当前活动线程的快…

【深度学习】 Python 和 NumPy 系列教程(廿七):Matplotlib详解:3、多子图和布局:散点矩阵图(Scatter Matrix Plot)

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 3、多子图和布局 1. subplot()函数 2. subplots()函数 3. 散点矩阵图&#xff08;Scatter Matrix Plot&#xff09; 一、前言 Python是一种高级编程语言&#xff0c;由Guido van Rossum于…

Web服务器解析:从基础到高级的全面指南

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 Web服务器是现代互…

前端实现符合Promise/A+规范的Promise

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 介绍&#xff1a; Promise/A规范简介 1. Promise的三种状态&#xff1a; 2. 状态转换&#xff1a; 3. Promise的…

盘点11种高效改进卷积神经网络(CNN)的优化方法【核心代码下载】

卷积作为神经网络的核心计算之一&#xff0c;在CV领域有着诸多突破性进展&#xff0c;因而近年来关于卷积神经网络的研究不断。由于卷积的计算十分复杂&#xff0c;而且神经网络运行时很大一部分时间都会耗费在计算卷积上&#xff0c;因此优化卷积计算就显得尤为重要。 那么如…

2023谷歌开发者大会直播详细脚本

主播:三掌柜 设备:手机+直播云台 平台:CSDN 角度:对Google技术感兴趣的人、技术爱好者 画风:言简意赅、通俗易懂,将难懂的内容转化为简洁的描述,旨在让每一位观众都能有所收获。 形式:直播互动,提高受众人群的范围,包括但不限于对Google感兴趣的任何人,以及对G…

【LeetCode-简单题】剑指 Offer 58 - II. 左旋转字符串

文章目录 题目方法一&#xff1a;连续双指针翻转 题目 方法一&#xff1a;连续双指针翻转 class Solution {public String reverseLeftWords(String s, int n) {StringBuffer sb new StringBuffer(s);reverseWord(sb,0,n-1);reverseWord(sb,n,sb.length()-1);return sb.revers…

OLED透明屏触控:引领未来科技革命的创新力量

OLED透明屏触控技术作为一项颠覆性的创新&#xff0c;正在引领新一轮科技革命。它将OLED显示技术与触摸技术相结合&#xff0c;实现了透明度和触控功能的完美融合。 在这篇文章中&#xff0c;尼伽将通过引用最新的市场数据、报告和行业动态&#xff0c;详细介绍OLED透明屏触控…

hutool的HttpRequest.post的使用-包括上传文档等多个传参【总结版本】

首先hutool已经为我们封装好了远程调用的接口&#xff0c;我们只要将对应的传参和方式对应填写即可 hutool官方文档 1实际应用 post 常见的使用json传参&#xff0c;contend type为application/json RequestMapping("login") ResponseBody public static String s…

用于非线性多载波卫星信道的多输入多输出符号速率信号数字预失真器DPD(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Docker】ubuntu20.04 X86机器搭建NVIDIA ARM64 TX2的Docker镜像

文章目录 1. 设置ubuntu为清华源1.1 备份源文件1.2 替换清华源1.3 更新清华源 2. Ubuntu Docker 安装3. 安装qemu4. 安装Nvidia TX2 Docker镜像5. 如何使用TX2容器6. 参考资料 1. 设置ubuntu为清华源 为了后面ubuntu下载安装软件快些&#xff0c;需要使用国内的源&#xff0c;…