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.镜像下载及运行


打开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容器了。

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服务器没有太大的区别,如下图:


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

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


验证完成,使用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

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

这里简单的介绍一下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是存在的。

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

docker volume ls

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

docker volume inspect 2e9757b2353fe4abda469bc66bd39afc1479677b4b4f89d010c7cf4c94c1b61d

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

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

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

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

3.3.volume主动挂载

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

docker volume create redis-volume

现在看起来就舒服多了,在运行容器的时候可以通过-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


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

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

  1. redis专题:redis的持久化方式有哪些?redis数据的备份和恢复策略

    文章目录 1. 为什么要做redis持久化? 2. 持久化方式之---RDB快照(snapshot) 3. 持久化方式之---AOF(append-only file) 4. 持久化方式之---混合持 ...

  2. 如何使用docker容器中的redis

    1.检查docker容器中是否启动了redis:命令:docker ps 2.如果没启动,则先启动服务:命令:docker run -p 6379:6379 --name redis -d redis ...

  3. docker容器中使用redis

    加载镜像 查询官方镜像及其版本信息 $ docker search redis 加载最新镜像 $ docker pull redis:lastest 查看本地镜像 $ docker images RE ...

  4. 批量修改数据_#泰Q头条#065期 四步搞定Excel表中的批量数据修改

    『闻道有先后 术业有专攻』 又到每周五我们Offcie小课堂时间,每周学一点儿,知识从未如此简单,也真诚的希望各位能在留言板写下你们宝贵的建议,给您带来更具价值的分享. 这期跟大家带来的Excel表数 ...

  5. 在php中存redis数据,redis缓存都存哪些数据

    字符串string: 字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,他在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据货Json对象描 ...

  6. 【Docker】(五)使用bind mounts修改Docker容器中的Nginx配置文件

    1.前言 本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 (三)使用registry远 ...

  7. docker mysql data volume_Docker 持久化存储, Data Volume/Bind Mounting

    docker容器, 再启动之后 我们可以对其进行 修改删除等等. 如果是一个数据库的容器, 里面的数据 不想随着这个容器的消失, 而消失.  就需要持久化数据存储. Data Volume 这是 do ...

  8. Docker(三) 使用容器数据卷实现数据持久化与容器数据共享

    一,什么是容器数据卷 出现背景:我们在运行的容器中所产生的数据都生成在容器中,如果容器后期被我们删除,那么在容器中的文件数据都将彻底丢失.为了获得容器中的数据,只能通过 docker cp 命令将容器 ...

  9. Docker容器中GUI软件的远程图形界面交互:mobaXterm+SSH,以脑影像处理软件FSL为例;FSL6.0.3完整安装与可视化;docker容器图形化;远程登录docker容器;

    前言   对docker容器中软件的操作,是基于命令行的,这就导致了习惯图形化界面的人比较难以使用docker,而它又是一个神器,所以很难受.一般情况下,可以给容器安装一个桌面环境,然后用类似VNC的 ...

最新文章

  1. 文件头_常见文件文件头
  2. kaggle房价预测问题
  3. iOSTableview 禁止下拉,允许上拉
  4. java线程暂停与恢复suspend和resume
  5. 微信小程序 禁止弹框下面的内容滑动 弹窗禁止底部内容滚动
  6. Qt学习笔记-Qt程序切换皮肤
  7. python编程入门第一课教案_python编程从入门到实践 第一课:输入输出
  8. 爬虫python是什么意思_python爬虫是什么? 【黑马程序员】
  9. 计算机中的PS颜色填充快捷键,ps中填充颜色的快捷键是什么(填充Shift+F5)
  10. hrbust 1853 哈理工oj 1853 幼稚园的数学Ⅰ【Biginteger】
  11. 计量芯片应用心得之硬件篇
  12. IDEA try catch快捷键、 快速生成get set 方法快捷键、快速生成有参和无参构造方法快捷键
  13. 苹果微信多开_一个手机能登两个微信吗
  14. Basler相机内参标定及Basler相机和Livox-avia激光雷达联合标定
  15. 微信公众号怎么申请-微信公众号使用教程1
  16. Windows基本命令操作、网络相关操作、windows用户管理、NTFS权限、更新策略的方法
  17. 最新彩虹外链网盘V5.3版+新增用户系统与分块上传
  18. 疑论:对阿里巴巴的投资该歇手了
  19. Emgucv颜色结构
  20. seo优化之网页排版

热门文章

  1. 数字三农:神州信息农业农村大数据解决方案
  2. 小白也能看懂的踩坑日记--ubuntu(rk3588)安装LXR(阅读源码工具)服务器
  3. arcgis中editor在哪_没有数据,那ArcGIS还有什么用?
  4. 内存走线 菊花链_菊花链拓扑结构布线注意事项和端接方法
  5. 一个栈的输入序列为1 2 3 4 5 的出站顺序的理解
  6. Windows系统使用VM安装mac教程
  7. OpenCV 之BGR2YUV
  8. docker镜像反推dockerfile
  9. mysql 用户 %_mysql用户操作 - 可爱的wzz的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. 自动化测试框架——关键字驱动