Docker 数据持久化方案详解

news2024/10/5 16:22:51

目录

一、Docker数据持久化概述

1.1联合文件系统

1.2容器的数据卷

1.2.1 什么是数据卷

1.2.2 数据卷特点

1.2.3 Docker提供三种方式将数据从宿主机挂载到容器

二、 Docker持久化方案

2.1 查看volume 基本命令使用方法

2.2 volume持久化方案

2.2.1volume简介

2.2.2.volume特点

2.2.3 挂载指定volume

2.2.4 volume使用场景

2.3 Bind Mounts持久化方案

2.3.1 bind mount特点

2.3.2 bind mount使用场景

2.3.3 常用命令

2.3.4 bind mount注意事项

2.4 tmpfs mount持久化方案

2.4.1 tmpfs mount

2.4.2 tmpfs mount特点

2.4.3 tmpfs mount使用场景


一、Docker数据持久化概述


1.1联合文件系统


了解联合文件系统后,我们知道,镜像是只读的,类似共享文件形式让多个容器使用。如果要在容器里修改文件,即镜像里的文件,那该如何修改?

为了解决这个问题,docker 引入了 写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写的文件复制到自己的文件系统中进行修改。

默认情况下,Docker容器内部新创建文件或者修改文件,结果会保存在容器的可读写层中,因此:

(1)当container消失时,与container一体的可读写层也一并消失,数据并未持久化。当一个container需要其它container中可读写层的数据时,读取操作非常困难。

(2)container可读写层与宿主机的文件系统紧密结合,很难进行迁移。

(3)写入数据到container可读写层需要storage driver,与直接在宿主机文件系统中读写数据相比效率要低。

1.2容器的数据卷


1.2.1 什么是数据卷

数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者多个容器提供访问,数据卷设计的目的,在于数据的永久存储,它完全独立于容器的生存周期,因此,docker 不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理,同一个数据卷可以只支持多个容器的访问。

1.2.2 数据卷特点

  • 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中
  • 数据卷可以在容器之间共享和重用
  • 可以对数据卷里的内容直接进行修改
  • 数据卷的变化不会影像镜像的更新
  • 卷会一直存在,即使挂载数据卷的容器已经被删除

1.2.3 Docker提供三种方式将数据从宿主机挂载到容器

  • Volumes: Docker 管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
  • Bind mounts: 将宿主机的任意位置的文件或者目录挂载到容器中。
  • tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmps,同时避免写入容器可写层提高性能。


二、 Docker持久化方案


2.1 查看volume 基本命令使用方法

2.2 volume持久化方案


2.2.1volume简介

volume是Docker官方推荐的持久化方案,默认情况下,volume的存储空间来自于宿主机文件系统中的某个目录,如/var/lib/docker/volumes/,docker系统外的程序无权限修改其中的数据。

一个volume可以同时供多个container使用,如果没有container使用volume,其不会自动删除,用户需运行docker volume prune明确删除。

如果用户显式创建volume,则需要给其指定一个名称;如果是隐式创建volume,Docker会自动为其分配一个在宿主机范围内唯一的名字。

2.2.2.volume特点

docker volume create -v 创建 volume 时,宿主机目录路径必须以/或~/开头,否则 Docker 会将其当成volume 而不是bind mount。

如果容器中的目录不存在,docker会自动创建目录;如果容器中的目录已有内容,docker会使用宿主机上目录的内容覆盖容器目录的内容。

2.2.3 挂载指定volume

### 管理卷
docker volume create nginx-vol # docker volume ls
docker volume inspect nginx-vol
## 用卷创建一个容器
docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
## 清理
docker stop nginx-test # docker rm nginx-test
docker volume rm nginx-vol

## 注意:如果没有指定卷,自动创建。

创建数据卷,启动容器使用 nginx-vol 这个数据卷

[root@offline-client docker]# docker volume create nginx-vol
nginx-vol
[root@offline-client docker]# docker volume inspect nginx-vol
[
    {
        "CreatedAt": "2022-05-15T12:10:52+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
        "Name": "nginx-vol",
        "Options": {},
        "Scope": "local"
    }
]
[root@offline-client ~]#  docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx:1.17Unable to find image 'nginx:1.17' locally
[root@offline-client ~]# curl  172.17.0.2
hello world

创建容器并挂载数据卷

2.2.4 volume使用场景

通过使用第三方提供的volume driver,用户可以将数据持久到远程主机或者云存储中。

(1)多个容器间共享数据。

(2)宿主机不保证存在固定目录结构。

(3)持久化数据到远程主机或者云存储而非本地。

(4)需要备份、迁移、合并数据时。停止container,将volume整体复制,用于备份、迁移、合并等

2.3 Bind Mounts持久化方案


bind mount持久化方式将宿主机中的文件、目录挂载到容器上,相应文件、目录可以被宿主机读写,也可以被容器读写。

bind mount持久化方式可以将数据存储在宿主机器任何地方,但会依赖宿主机的目录结构,因此不能通过docker CLI直接管理,并且非Docker进程和Docker进程都可以修改。

2.3.1 bind mount特点

(1)性能最好

(2)Docker容器与宿主机耦合过于紧密,移植性较差。

2.3.2 bind mount使用场景

(1)container共享宿主机配置文件,如docker将宿主机文件/etc/resov.conf文件bind mount到容器上,两者会使用相同的DNS服务器。

(2)开发环境中build容器化。开发过程中将build过程container化,将宿主机上源代码目录bind mount到build container中。修改代码后,运行build container的build命令,build container则将build结果写入另一个bind mount的目录中。

(3)监控服务container化。读取宿主机固定文件中的数据实现监控。

2.3.3 常用命令

#用卷创建一个容器:
docker run -d --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx 
docker run -d --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
# 验证绑定:
docker inspect nginx-test
# 清理:
docker stop nginx-test 
docker rm nginx-test

启动 nginx-test容器,挂载/app/wwwroot到/usr/share/nginx/html

[root@offline-client ~]# docker run -d --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
13e5652a1b889d61021b9b726579646a00531fa2773068b1b7066ff60eff11f5
[root@offline-client ~]# 
[root@offline-client ~]# 
[root@offline-client ~]# 
[root@offline-client ~]# ll  /app/wwwroot/
total 0
[root@offline-client ~]# echo hello world >  /app/wwwroot/index.html
[root@offline-client ~]# curl  172.17.0.2
hello world

将 根路径下wwwNginx路径mount到/usr/share/nginx/html,并输入 内容 ,然后访问

2.3.4 bind mount注意事项

(1)-v 宿主机目录路径必须以/或~/开头,否则docker会将其当成是volume 而不是bind mount。

(2)如果宿主机上的目录不存在,docker会自动创建目录(多级的绝对路径好像不行)。

(3)如果容器中的目录不存在,docker会自动创建目录。

(4)如果容器中目录已有内容,那么docker会使用宿主机上目录的内容覆盖容器目录的内容。

2.4 tmpfs mount持久化方案


2.4.1 tmpfs mount

tmpfs mount只在Linux主机内存中持久化,是临时性的。当容器停止,tmpfs mount会被移除,通常用于临时存放敏感文件。

tmpfs mounts 可选选项

Option

Description

tmpfs-size

挂载的tmpfs的字节数,默认不受限制

tmpfs-mode

tmpfs的文件模式,例如700或1700.默认值为1777,这意味着任何用户都有写入权限

使用--tmpfs参数无法指定任何其他的可选项,并且不能用于Swarm Service(集群节点服务)。

docker run -d -it --name tmptest --tmpfs /test busybox

2.4.2 tmpfs mount特点

(1)只能在Linux主机内存中,不会持久化到磁盘。

(2)不支持多容器间共享。

2.4.3 tmpfs mount使用场景

Docker可将用户名与密码等敏感数据保存在某个数据库中,当启动需要访问这些敏感数据的container或者service时,docker会在宿主机上创建一个tmpfs,然后将敏感数据从数据库读出写到tmpfs中,再将tmpfs mount到container中,安样能保证数据安全。当容器停止运行时,则相应的tmpfs也从系统中删除。


参考原文链接:Hello Docker(七)——Docker数据持久化_docker持久化目录_天山老妖的博客-CSDN博客

原文链接:Docker数据持久化_丰恒谷的博客-CSDN博客

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

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

相关文章

【JavaSE】Java基础语法(四十一):TCP通信程序

文章目录 1. TCP发送数据2. TCP接收数据【应用】3. TCP程序练习4. TCP程序文件上传练习【应用】 1. TCP发送数据 Java中的TCP通信 Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。…

Android 易忽略小知识

1.设置hint的字体大小 在Android xml文件中并没有直接设置hint字体大小的属性。如果hint文字的大小不希望跟正常字体的大小一样,就只能通过代码的方式来进行处理。 提供两种方式: //设置"用户名"提示文字的大小 EditText etUserName (Ed…

教育硬件“老玩家”进入智能手机新赛道,小度胜算几何?

从5月8日有传言称“百度旗下小度将进军智能手机市场”,到5月17日小度官宣将推出旗下新物种产品——小度青禾学习手机,小度在短短10天时间成为市场关注的焦点。 而5月22日,其也拿出了真正的成果,这部专门为青少年打造的学习手机正…

MySQL——在Linux环境下安装(在线安装)

MySQL的安装(在线安装) mysql的安装并不是比赛的内容,所以我们用比较方便的在线安装的方法,比起安装,我们更要知道如何去使用: 首先看一下自己有没有安装MySQL的服务,或者自己的服务器上有没有…

application.yml中的配置怎么写

1.问题 application.yml中可以做很多组件的配置,比如redis,mongo, 但是这些的key是什么,value怎么写呢? 2.分析问题 为了搞清楚这个问题,我们需要先了解application.yml中的配置是怎么加载的,以MongoProperties配置加载为例, 在Spring Boot中,可以使用application.y…

【OJ比赛日历】快周末了,不来一场比赛吗? #06.03-06.09 #18场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2023-06-03(周六) #7场比赛2023-06-04…

【数据结构】---二叉树类型部分练习解析让你更深程度了解二叉树

文章目录 前言🌟一、第一种:二叉树性质类型:🌏1.1 第一题:💫1.1.1 理论:💫1.1.2 图解:💫1.1.3 解析: 🌏1.2 第二题:&#…

小明给大家分享几个CSDN涨粉小技巧,期待大家多多涨粉

今天和大家一起来聊聊CSDN涨粉相关几个的技巧,希望对热爱技术分享,并且想快速涨粉提升自身曝光度的朋友们提供一些经验,本文都是自己的一些想法,有说的不对的地方希望大家指正! 一、个人介绍 我叫小明,我的…

京东国际销售数据查询(京东国际行业/品牌数据分析)

根据京东平台官方数据显示,今年京东国际的贡献力度也高于以往。 京东618开门红5分钟,京东国际成交额已突破去年开门红前两小时的成交额,跨境酒水、跨境手机通讯、跨境箱包皮具等3个品类成交额同比增长超100%。,开门5分钟&#xff…

Unreal5 第三人称射击游戏 角色基础制作2

接上一篇 Unreal5 第三人称射击游戏 角色基础制作1 角色蹲伏效果 上面是需要的操作映射,蹲伏实现,首先要开启相应功能,你需要在角色移动组件上面开启可蹲伏 蹲伏还有一些其它设置,比如蹲下角色高度,蹲下以后行走的…

MySQL基础2

一.常见数据类型 数值类型: TINYINT:占用1字节,默认为有符号 BIT(M):位类型:M指定位数,默认值为1,范围为1-64,bit类型在显示时,按照ASCII码对应的值进行显示。 FLOAT[(M,…

华为OD机试(41-60)老题库解析Java源码系列连载ing

华为OD机试算法题新老题库练习及源码 41.寻找相同子串42.找出经过特定点的路径长度43.全量和已占用字符集44.密钥格式化45.数字字符串组合倒序 郑重声明: 1.博客中涉及题目为网上搜索而来,若侵权,请联系作者删除。 源码内容为个人原创&#…

git --- git merge用法

1 git merge介绍 在Git中,合并是一个连接分叉历史的过程。它将两个或多个开发历史连接在一起。git merge命令可以帮助你把git分支创建的数据整合到一个分支中。git merge会将一系列的提交关联到一个统一的历史。 在上图中,有两个分支 master 和 feature。我们可以看到,我们…

《priority_queue》

本文主要介绍优先级队列的使用,以及一个TOPK问题的OJ 文章目录 一、priority_queue的介绍二、priority_queue的使用三、[数组中第k个大的元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/) 一、priority_queue的介绍 优先队列是一种容器适配器…

代码创造童话--Python为六一儿童节送专属礼物

前言: Hello大家好,我是Dream。 六一儿童节到啦,祝所有的朋友们六一儿童节快乐! 在这个节日里,孩子们可以接受父母、老师、社会各界人士的关爱和祝福,同时也可以享受到各种各样的礼物和活动。Python作为一门…

第十五篇、基于Arduino uno,获取mpu6050三轴加速度、角速度、温度的数据——结果导向

0、结果 说明:先来看看串口调试助手显示的结果,第一个值是温度值,第二个值是X轴的加速度,第三个值是Y轴的加速度,第四个值是Z轴的加速度,第五个值是X轴的角速度,第六个值是Y轴的角速度&#xff…

C++库函数——string类

1. 简介 ①什么是string类 源文档 译: 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。 3. string 类是使用 char( 即作为它…

【六一】90后的你们还记得年少时的梦吗?还记得你们当初追的奥特曼吗?现在就让我们一起回味我们逝去的曾经吧!

迎面走来的是我们从未正式出过剧集,并附有“反派”盛名的大哥!佐~~菲~~! 还记得第一个登场,第一个进入我们的视野的那位吗?没错,那就是奥特曼 我的最爱~~~~~赛文! 一度以为,曾经的那…

Bellhop 绘制传播损失

文章目录 前言一、相干传播损失(TL)基本算例1、环境文件2、绘制相干传播损失 二、相干、半相干和非相干传播损失(TL) 前言 上文我们讲述了 Bellhop 的使用以及使用 bellhop 绘制了声速剖面、声线轨迹及本证声线,本文我…

【SpringMVC】入门案例

前言: SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装。 对于SpringMVC我们主要学习如下内容: SpringMVC简介请求与响应REST风格SSM整合(注解版)拦截器 SpringMVC是处于Web层的框架,所以其主要的作用…