当前位置: 首页 > news >正文

Docker 的数据持久化-数据卷

场景分析

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

  • 定制镜像持久化 :将这个修改过的容器生成一个新镜像,让这些修改变为只读的镜像;
  • 数据卷持久化 : 将这些修改通过数据卷同步到宿主机。
补充:
Docker 提供了三种实时同步的方式 : 宿主机与容器FS间的数据同步
1、数据卷
2、Bind mounts (绑定挂载) 【较复杂,不推荐】
3、temps(临时文件系统)【较复杂,不推荐】本文重点介绍一下【数据卷】的方式进行容器数据的持久化。

什么是数据卷

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

数据卷的特性

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

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

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

4、数据卷可以在容器之间共享和重用,即不同容器可以挂载同一个数据卷。

创建数据卷(*)

创建数据卷,是在 docker run 时通过 -v 参数进行定义的

创建读写数据卷

* 宿主机 对 目录的权限 始终是 读写的;
* 此处的 读写权限 是 容器对挂载点的 权限 : 容器可以对挂载点读和写。

docker run --name xxx -it -v /宿主机的绝对路径:/容器中的局对路径 image:tag

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

创建只读数据卷

* 宿主机 对 目录的权限 始终是 读写的;
* 此处的 读写权限 是 容器对挂载点的 权限 : 容器对挂载点只读。
* 某些情况下,为了防止容器在运行过程中对文件产生修改,就需要创建只读数据卷。

docker run --name xxx -it -v /宿主机的绝对路径:/容器中的绝对路径:ro image:tag

通过共享创建数据卷

当两个容器使用相同的数据卷时,就称这两个容器实现了“数据卷共享”。

数据卷容器 :当一个容器c启动运行时创建并挂载了数据卷,若其他容器也需要共享该容器挂载的数据卷,则可以在 docker run 命令中通过 --volumes-from 容器ID 选项,实现数据卷的共享。
此时,容器c 就称为 数据卷容器。

docker run --name xxx-it --volumes-from 数据卷容器ID image:tag

补充—mount 参数

作用是一样的,只不过表述更清晰
非简写:
docker run --mount type=bind,source=/host/path,target=/container/path[,readonly] --name mycontainer ubuntu
简写:
docker run --mount type=volume,src=myvolume,dst=/container/path[,ro] --name mycontainer ubuntu

Dockerfile 持久化

  • Dockerflie 持久化,是通过 VOLUME 指令指定数据卷方式的持久化。
  • VOLUME 指令可以在容器中创建可以挂载数据卷的挂载点。其参数可以是字符串数组,也可以是空格隔开的多个纯字符串。
  • 但这种方式只能定义容器中的挂载点,宿主机中的数据卷是匿名的,自动生成的。
  • 例如 :
    VOLUME [“/path1”,“/path2”,…]
    VOLUME /path1 path2 …

可以通过 docker inspect 容器ID 查看挂载点的信息,会有一个 叫做 Mounts 的数组,记录对应的数据卷的信息。

http://www.dtcms.com/a/301412.html

相关文章:

  • (AC)架子鼓
  • 基于Java的KTV点歌系统的设计与实现
  • 【CF】Day112——杂题 (逆向思维 | 二分 + 贪心 | 单调队列优化DP | 二进制 + 前缀和 | 二分图判断 | 暴力枚举)
  • JavaEE--3.多线程
  • python-装饰器
  • 【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
  • QT6 源,七章对话框与多窗体(15)多文档 MDI 窗体 QMdiArea 篇一:属性,公共成员函数,信号与槽函数
  • 多智能体架构
  • 《计算机组成原理与汇编语言程序设计》实验报告四 Debug及指令测试
  • setnonblocking函数用途和使用案例
  • 在本地环境中运行 ‘dom-distiller‘ GitHub 库的完整指南
  • OSPF路由协议 多区域
  • 【ESP32】无法找到: “${env:IDF_PATH}/components/“的路径报错问题以及CMAKE构建不成功问题
  • Cursor报错解决【持续更新中】
  • 金融科技中的远程开户、海外个人客户在线开户、企业客户远程开户
  • 深入解析Java运行机制与JVM内存模型
  • 【Web APIs】JavaScript 节点操作 ⑩ ( 节点操作综合案例 - 动态生成表格案例 )
  • windows 11 JDK11安装
  • LeetCode 239:滑动窗口最大值
  • 五自由度磁悬浮轴承转子不平衡振动抑制破局:不平衡前馈补偿+自抗扰控制实战解析
  • MySQL 全详解:从入门到精通的实战指南
  • 第二阶段-第二章—8天Python从入门到精通【itheima】-138节(MySQL的综合案例)
  • 设备分配与回收
  • 数据处理实战(含代码)
  • OpenFeign-远程调用((Feign的使用方法))
  • Spring Boot 配置文件常用配置属性详解(application.properties / application.yml)
  • 【PCIe 总线及设备入门学习专栏 5.3.4 -- PCIe PHY Firmware 固件加载流程】
  • 如何思考一个动态规划问题需要几个状态?
  • [每周一更]-(第150期):AI Agents:从概念到实践的智能体时代
  • net8.0一键创建支持(Elastic)