【Docker】(四)使用volume持久化Docker容器中的Redis数据

news2024/12/23 18:18:56

1.前言

本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章:

(一)基本概念与安装使用
(二)如何使用Docker发布一个SpringBoot服务
(三)使用registry远程镜像仓库管理镜像

在前面的内容中,讲述了如何通过Docker来部署自己开发的服务,下一个阶段要讲述的是如何使用Docker来安装开发工作中所需要使用到的中间件。

redis为例,我们都知道虽然redis是基于内存操作的,但为了避免宕机后缓存丢失,一般都会配置持久化操作,将数据持久化到快照或者日志文件中,待redis重启后重新加载。

而Docker容器每次启动时,都会创建一个新的环境,也就是说,即使在容器中配置了redis的持久化,也会因为容器的重启而导致缓存丢失,为了处理这个问题,Docker提供了volume,它可以将容器中的文件目录挂在到宿主机中,建立两者的同步关系。

本篇将以redis的安装及持久化配置为主,讲述如何配置volume以持久化缓存数据。

2.Redis安装

得益于Docker的层层叠加镜像的机制,只要做好了镜像,就拥有了应用运行所需的所有环境,所以使用来Docker安装中间件是非常简单的。在DockerHub中就有官方已经制作好的redis镜像,可以直接拉取运行。

2.1.镜像加速器配置

如果觉得DockerHub拉取的太慢,可以给Docker配置镜像加速器,例如配置腾讯云的镜像加速器:

  • 打开Docker守护进程配置文件
    vim /etc/docker/daemon.json
    
  • i键进入编辑模式,将下面的镜像地址填写到配置文件中
    {
    "registry-mirrors": [
       "https://mirror.ccs.tencentyun.com"
      ]
    }
    
    填好后按esc,并输入:wq保存并退出。
  • 重启Docker后生效
    sudo systemctl restart docker
    

2.2.镜像下载及运行

image.png
打开DockerHub搜索redis,在下面的Tags中可以找自己需要的redis版本,在拉取时带上tagName,如果不带上tagName则默认拉取latest

docker pull redis:[tagName]

这里也可以不使用docker pull指令,直接使用docker run指令,如果本地没有找到需要运行的镜像,会隐式的使用docker pull拉取镜像。

# 运行redis容器,并指定密码 
docker run -dp 6379:6379 --name my-redis redis --requirepass "123456"

这里的--requirepass指的的redis访问密码,执行完成后使用docker ps就可以看到刚刚启动的Redis容器了。

image.png

2.3.redis使用测试

redis安装完成之后,我们一般可以使用自带的redis-cli做一个简单的使用测试,根据前面提到的镜像构建知识,可以断定当前正在运行中的redis容器,至少包含了一个操作系统与一个redis应用程序,我们只要能够进入到容器中,就可以通过内置的操作系统运行redis-cli了。那么,如何才能进入到容器中呢?

使用docker exec指令可以进入到容器中:

# 语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 进入redis容器
docker exec -i -t my-redis /bin/bash

-i-t往往是组合使用的,可以简写为-it

  • -i:交互式操作,类似于建立长连接,容器会不断响应收到的指令,如果没有-i则容器只会响应一次。
  • -t:提供一个命令行终端,可以向容器发起指令。
  • /bin/bash:即打开容器中的服务器命令行

进入容器之后,看起来和普通的CentOS服务器没有太大的区别,如下图:

image.png
实际上这是一台阉割版的服务器,只包含redis相关的环境,这个时候我们就可以使用redis-cli来进行测试了。

# 打开redis客户端
redis-cli
# 输入密码鉴权
auth 123456

image.png
验证完成,使用ctrl + c退出redis客户端,再输入exit退出容器。值得一提的是,如果只想打开 redis客户端,可以直接在docker exec中指定 redis-cli

docker exec -it my-redis redis-cli

3.volume

使用volume可以将容器中的某个文件(也可以是目录)挂在到宿主机中,建立这层联系后,容器与宿主机就能进行数据同步了。

3.1.重启容器的猜想与验证

从理论上来说,Docker容器一旦关闭,容器中的数据将会丢失,也就说如果此时将redis容器重启,刚才存入的两条缓存记录将会消失,真的是这样的吗?

# 重启docker
sudo systemctl restart docker
# 启动redis容器(因为没有配置随docker重启而自动启动)
docker start my-redis

image.png

验证结果显示,刚才保存的缓存记录并没有消失,打开容器终端,查看/data目录,发现里面存在redis的快照文件,如下图:

image.png

这里简单的介绍一下rdb文件,它属于redis持久化机制的一种,每隔一段时间就会将redis缓存在内存中的数据保存一个快照,持久化到硬盘中。
redis宕机重启后,就可以选择使用硬盘中的快照文件快速恢复数据,避免数据因宕机而丢失。

那么问题来了,为什么重启之后的容器目录下,还会存在redis的快照文件呢?

3.2.volume的隐式挂载

为了方便观察,这里先清除了所有的redis相关的容器volume,重新使用docker run运行一个新的redis容器,按照先前的操作再来一遍,我把执行脚本放在下面。

# 运行redis容器
docker run -dp 6379:6379 --name my-redis redis --requirepass "123456"
# 连接redis客户端
docker exec -it my-redis redis-cli
# 验证密码
auth 123456
# 缓存数据
set k1 1
set k2 2
# ctrl + c 退出并重启docker
docker restart my-redis

这里重启my-redis容器,是为了触发redis生成镜像文件,此时进入到容器中查看,此时dump.rdb是存在的。
image.png

然后退出容器,查询当前是否存在volume

docker volume ls

image.png

可以看到这里有一个名字很长很长的volume,这就是刚才运行redis生成并关联的volume,可以通过inspect查看详细信息。

docker volume inspect 2e9757b2353fe4abda469bc66bd39afc1479677b4b4f89d010c7cf4c94c1b61d

image.png

图中可以找到一个MountPoint,它是一个文件目录,结果已经比较明显了,这个就是redis容器在主机中的挂载点,打开这个目录,会看到里面也有一个dump.rdb文件。

image.png

现在把redis容器停掉并删掉挂载点中的dump.rdb,然后重新启动redis,此时再去查看容器中的/data目录,会发现镜像文件已经不存在了。

image.png

由此可以确认,在运行容器时,会隐式创建一个volume,并将容器中存放数据的目录挂载到这个volume对应的主机地址上。

注意:不是每个容器启动都会隐式创建volume,此处能创建是因为Redis的Dockefile中定义了挂载volume的脚本,VOLUME [/data]。

3.3.volume主动挂载

上面的隐式挂载存在一个很大的问题,自动创建的volume名称特别长,而且没有业务含义,如果这样的volume多了之后,想要找到volume与容器的挂载关系将会非常困难。因此,我们可以使用docker volume create主动创建,并它起一个有意义的名称,例如此处为redis创建一个:

docker volume create redis-volume

image.png

现在看起来就舒服多了,在运行容器的时候可以通过-v指定volume,以:隔开,左侧为自定义volume,右侧为需挂载的容器路径。

docker run -dp 6379:6379 --name my-redis -v redis-volume:/data redis --requirepass "123456"

注:也可以不使用create创建volume,在run的时候会自动创建redis-volume

4.结语

本篇讲述了如何使用Docker安装应用程序,如何应用程序的数据挂载到主机上,做持久化操作。

  • 使用DockerHub可以查找可用的Docker镜像
  • 通过配置镜像加速器,可以加快镜像的下载速度
  • 使用-v指令,可以配置volume,挂载容器目录到主机上。
  • 通过docker volume xxx指令,可以操作volume,《volume指令参考》

下一篇将会讲述Docker持久化数据的另外一种方式:bind mount


如果觉得文章对你有帮助的话,可以帮忙点点赞哦!你们的支持是我更新最大的动力~

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

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

相关文章

[ 数据结构 ] 赫夫曼编码--------数据、文件压缩解压

0 引出 如上图:给定字符串按定长编码处理,最终对应二进制长度为359 思考:如何压缩,将359有效降低? ----回顾:赫夫曼树 1 数据压缩 拿到数据(字符串)的第一反应,虽然知道应该也像上面一样转为字节数组,但就不知道该怎么办了?统计数组中各字节使用的次数,将次数作为权值,字节…

2023.1.8 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.论文主要贡献5.相关工作5.1 序列感知的推荐系统5.2 神经注意模型6.模型:ATTREC6.1 序列推荐6.2 基于Self-Attention的用户短期兴趣建模6.3 用户长期兴趣建模6.4 模型学习7.实验7.1 数据集7.2 评估指标7.3 模型比较7.4 实验…

SSO单点登录实例详解(前端传Code授权登录)

什么是 SSO(单点登录) SSO 英文全称 Single Sign On,单点登录。SSO 是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 单点登录流程 单点登录大致流程如下所示: 单点登录详细流程&#x…

【自学C++】C++变量初始化

C变量初始化 C变量初始化教程 变量 的初始化就是在定义变量的同时,给变量设置一个初始值,在 C 中,如果定义变量没有初始化,那么变量有可能会被赋值也有可能不会赋值。 如果是定义的 全局变量 或者 静态变量,未初始化…

2022年语音合成(TTS)和语音识别(ASR)年度总结

论文统计每月更新一次,主要跟踪语音合成和语音识别的发展状况(很多文章都是在会议后才发出,但不影响统计。统计过程难免存在疏漏,因此统计结果仅供参考。所有文章语音合成领域统计列表请访问http://yqli.tech/page/tts_paper.html&#xff0c…

绝大多数人远远低估了软件开发的难度

给你付钱了,你应该把软件做好! 这个话相当于: 给你付钱了,你应该把月亮摘下来! 趣讲大白话:臣妾做不到 ********** 软件是特殊商品服务 可以说很难有标准 开发的难度取决于需求多少,技术难度&a…

Java Map集合的介绍和使用

什么是Map类型的集合 介绍 1.用于保存具有映射关系的数据(key——value)。 2.Map中的key和value可以是任意的类型的数据。 3.Map中的key值不允许重复。 4.Map中的value值可以重复。 5.一般常用string作为value的key。 6.key和value之间存在一一对…

如何进行地图SDK开发(二)——示例文档

概述 前面的文章文章我们写到了SDK的开发以及ak认证的实现,在本文我们继续讲讲地图SDK开发中的示例文档的实现。 技术点 vue3viteelement-plusmonaco-editor 实现后效果 实现 1. 工程初始化 1.1 搭建工程 搭建工程的过程请参照博文(使用vite搭建vue3项目&…

javaEE初阶 — 线程池

文章目录线程池1 什么是线程池2 标准库中的线程池2.1 什么是工厂模式2.2 如何使用标准库中的线程池完成任务2.3 ThreadPoolExecutor 构造方法的解释3 实现一个线程池线程池 1 什么是线程池 随着并发程度的提高,随着对性能要求标准的提高会发现,好像线程…

[cpp进阶]C++异常

文章目录C语言传统处理错误的方式C异常概念C异常使用异常的抛出和捕获异常的重新抛出异常安全异常规范自定义异常体系C标准库的异常体系异常的优缺点C语言传统处理错误的方式 传统的错误处理机制: 终止程序。assert断言直接终止程序。缺点:过于粗暴&am…

Fiddler抓取手机APP报文

Http协议代理工具有很多,比如Burp Suite、Charles、Jmeter、Fiddler等,它们都可以用来抓取APP报文,其中charles和Burp Suite是收费的,Jmeter主要用来做接口测试,而Fiddler提供了免费版,本文记录一下在Windo…

位运算做加法,桶排序找消失元素,名次与真假表示,杨氏矩阵,字符串左旋(外加两道智力题)

Tips 1. 2. 3. 大小端字节序存储这种顺序只有在放进去暂时存储的时候是这样的,但是一旦我里面的数据需要参与什么运算之类的,会“拿出来”先恢复到原先的位置再参与运算,因此,大小端字节序存储的什么顺序不影响移位运算等等…

【案例教程】CLUE模型构建方法、模型验证及土地利用变化情景预测实践技术

【前沿】:土地利用/土地覆盖数据是生态、环境和气象等领域众多模型的重要输入参数之一。基于遥感影像解译,可获取历史或当前任何一个区域的土地利用/土地覆盖数据,用于评估区域的生态环境变化、评价重大生态工程建设成效等。借助CLUE模型&…

声音产生感知简记

声音产生 人的发音器官包括:肺、气管、声带、喉、咽、鼻腔、口腔、唇。肺部产生的气流冲击声带,产生震动。 声带每开启和闭合一次的时间是基音周期(Pitch period,T),其到数为基音频率(F.=1/T,基频),范围在70-450Hz。基频越高,声音越尖细,如小孩的声音比大人尖,就是…

编译错误2

本文迁移自本人网易博客&#xff0c;写于2015年11月25日&#xff0c;编译错误2 - lysygyy的日志 - 网易博客 (163.com)1、error C2059:语法错误&#xff1a;“<L_TYPE_RAW>”error C2238:意外的标记位于“;”之前.错误代码定位于&#xff1a;BOOL TreeView_GetCheckState…

excel函数公式:常用高频公式应用总结 上篇

公式1&#xff1a;条件计数条件计数在Excel的应用中十分常见&#xff0c;例如统计人员名单中的女性人数&#xff0c;就是条件计数的典型代表。条件计数需要用到COUNTIF函数&#xff0c;函数结构为COUNTIF(统计区域,条件)&#xff0c;在本例第一个公式COUNTIF(B:B,G2)中&#xf…

《栈~~队列~~优先级队列》

目录 前言&#xff1a; 1.stack 1.stack的介绍 2.stack的使用&#xff1a; 3.stack的模拟实现 4.有关stack的oj笔试题 2.queue 1.队列的介绍 2.队列的使用 3.队列的模拟实现 4.有关队列的oj笔试题 3.priority_queue 1.优先级队列的介绍 2.优先级队列的使用 3.优先级队列的模拟实…

挥别2022,坦迎2023。

第一章&#xff1a;CSDN&#xff0c;我来啦&#xff01;第一节&#xff1a;初遇&#xff01;2022-08-13&#xff0c;我和CSDN相遇啦&#xff01;CSDN&#xff0c;你好呀&#xff01;2022年8月13日&#xff0c;是我与你相遇的日子。这是一个值得纪念的时刻。从此之后&#xff0c…

English Learning - L1-10 时态(下) 2023.1.5 周四

English Learning - L1-10 时态&#xff08;下&#xff09; 2023.1.5 周四8 时态8.3 完成时态核心思想&#xff1a;回首往事&#xff08;一&#xff09;现在完成时核心思想用法延续动作延续时间 “动作一直持续了。。。”延续动&#xff08;无延续时间&#xff09; “做过。。…

AtCoder Beginner Contest 284 A - E

题目地址&#xff1a;AtCoder Beginner Contest 284 - AtCoder 一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.8 Last edited: 2023.1.8 目录 题目地址&#xff1a;AtCoder Beginner C…