Docker实战十一之Redis部署

Docker实战十一之Redis部署

简介

前面我们介绍了如何使用Docker 安装软件的一些简单方法。但在生产环境中,我们往往有更高的要求,需要保证系统的高可靠性和稳定性,以及数据的持久化,比如:
我们使用Docker 安装 Redis 并运行一段时间后,被误删除了,我们怎么才能重新安装并恢复原始数据呢?下面介绍Docker 安装软件的高级方式。
我们先介绍 基本知识,后面在详细介绍如何 安装 Redis 。

一、数据管理

大家在生产环境使用Docker部署项目的时候,基本都需要进行数据持久化、或多个容器间进行数据共享,这个就需要容器的数据管理来进行操作。

1.1 Docker数据持久化

Docker数据持久化就是容器中的数据不会随着容器的结束而随之结束,在Docker中如果需要实现数据的持久化,前提把数据从Docker容器挂载到宿主主机上去。

1.2 容器中数据管理的方式

  • 数据卷(Data Volumes):容器内的数据直接映射到宿主主机环境
  • 数据卷容器(Data Volume Containers):使用特定容器维护数据卷

二、数据卷的介绍

数据卷是一个可供容器内部使用的特殊目录,它将宿主主机的操作系统目录直接映射进容器内,类似于Linux系统中的 mount 操作。

2.1 数据卷作用

容器的持久化、容器间继承 + 共享数据

2.2 卷的概念

本质就是目录或文件,存在于一个或多个容器中,由docker挂载到容器中,但不属于联合文件系统,因此能够绕过合文件系统提供一些用于持续存储或共享数据的特性。卷的目的就是实现数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时同时删除其挂载的数据卷。

2.3 数据卷的特点

  • 数据卷可以在容器之间实现共享和重用,容器间传递数据将变的高效方便
  • 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
  • 对数据卷的更新不会影响Docker镜像,解耦了应用和数据
  • 数据卷的生命令周期不受容器的影响,除非你卸载它。

三、Docker数据卷常见的作用

  • 数据持久化:比如Redis,数据目录要挂载到宿主主机或者别的地方,否则Redis容器删除你的数据也会随之删除。
  • 同步操作:比如我需要修改redis.conf的配置文件,不需要在进入容器内部,可以直接修改数据卷对应的文件就可以进行配置实时同步。
  • 容器间数据共享:多个容器之间需要数据共享的时候

四、操作数据卷

4.1 常用命令

复制代码
docker volume 指令值

指令值:

  • create:创建一个volume
  • inspect:显示一个或多个volume的信息
  • ls :列出所有的volume
  • prune :删除未使用的volume
  • rm:删除一个或多个指定的volume

4.2 挂载数据卷

创建数据卷myvolume

复制代码
docker volume create myvolume

运行nginx容器

复制代码
  docker run --name nginxtest -v myvolume:/usr/share/nginx/html -p 8000:80 -d nginx

五、使用数据卷安装Redis

在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
下面创建一个 redis 容器,并加载一个数据卷到容器的 /etc/redis 目录。

复制代码
docker run --name redis -p 6379:6379 --privileged=true  
-v /Users/a123456/Downloads/redis/data:/data  
-v /Users/a123456/Downloads/redis/redis.conf:/etc/redis/redis.conf  
-d  redis:6.2.14 redis-server /etc/redis/redis.conf

a123456@luludeMacBook-Pro-2 redis % docker run --name redis -p 6379:6379 --privileged=true  -v /Users/a123456/Downloads/redis/data:/data  -v /Users/a123456/Downloads/redis/redis.conf:/etc/redis/redis.conf  -d  redis:6.2.14 redis-server /etc/redis/redis.conf
Unable to find image 'redis:6.2.14' locally
6.2.14: Pulling from library/redis
8a1e25ce7c4f: Already exists 
fc82c4b279bf: Pull complete 
003c886698dd: Pull complete 
aa8ba7ed57ab: Pull complete 
739bc212d5bc: Pull complete 
df15d839dd4a: Pull complete 
4f4fb700ef54: Pull complete 
ce747e78672c: Pull complete 
Digest: sha256:a4752f210bb45f94067bfca7257c7ebe90e7b4d5457f2ad3f2716ab636f5b2cc
Status: Downloaded newer image for redis:6.2.14
2cf801be0bedb0ff370a2f6fff3236a3027e79f7ad61422716a16521e61101e1

docker ps -a

docker ps -a命令用于列出所有的Docker容器,包括正在运行和已经停止的容器。

复制代码
a123456@luludeMacBook-Pro-2 redis % docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS                     PORTS                                                                    NAMES
2cf801be0bed   redis:6.2.14               "docker-entrypoint.s..."   56 seconds ago   Up 16 seconds              0.0.0.0:6379->6379/tcp                                                   redis
3f070c2bb470   yandex/clickhouse-server   "/entrypoint.sh"         2 months ago     Exited (255) 4 weeks ago   0.0.0.0:8123->8123/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:9009->9009/tcp   ch-server

可以看到 镜像redis:6.2.14 的 STATUS = Up。表示Redis 启动成功。

docker exec 基本语法

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

  • OPTIONS: 可选参数,用于指定一些附加选项,比如 -i(交互式)、-t(分配伪终端)等。

  • CONTAINER: 要执行命令的目标容器名称或容器ID。

  • COMMAND [ARG...]: 要在容器内执行的命令及其参数。

    a123456@luludeMacBook-Pro-2 redis % docker exec -it 2cf801be0bed /bin/bash
    root@2cf801be0bed:/data#

连接Redis

复制代码
a123456@luludeMacBook-Pro-2 redis % docker exec -it 2cf801be0bed /bin/bash
root@2cf801be0bed:/data# redis-cli   
127.0.0.1:6379> set name yyp
OK
127.0.0.1:6379> get  name
"yyp"
127.0.0.1:6379>

停止容器

复制代码
a123456@luludeMacBook-Pro-2 redis % docker stop 2cf801be0bed
2cf801be0bed

删除镜像

复制代码
a123456@luludeMacBook-Pro-2 redis % docker  rmi -f  redis:6.2.14  
Untagged: redis:6.2.14
Untagged: redis@sha256:a4752f210bb45f94067bfca7257c7ebe90e7b4d5457f2ad3f2716ab636f5b2cc
Deleted: sha256:800a4c20dea0ad75bec9f3171f1008142c3bce87cd5cfecc3d3b266048788696

查看镜像

复制代码
a123456@luludeMacBook-Pro-2 redis % docker images             
REPOSITORY                 TAG       IMAGE ID       CREATED       SIZE
yandex/clickhouse-server   latest    c739327b5607   2 years ago   826MB
yandex/clickhouse-client   latest    8208fbe345cd   2 years ago   805MB
<none>                     <none>    7614ae9453d1   2 years ago   113MB

重新安装Redis

复制代码
a123456@luludeMacBook-Pro-2 redis % docker run --name redis -p 6379:6379 --privileged=true  -v /Users/a123456/Downloads/redis/data:/data  -v /Users/a123456/Downloads/redis/redis.conf:/etc/redis/redis.conf  -d  redis:6.2.14 redis-server /etc/redis/redis.conf
d44b6b2286349adc563f77304798b72f4f5e34fc3fad48446a7b4ce983149819
a123456@luludeMacBook-Pro-2 redis % docker ps -a   
CONTAINER ID   IMAGE                      COMMAND                  CREATED              STATUS                     PORTS                                                                    NAMES
d44b6b228634   redis:6.2.14               "docker-entrypoint.s..."   About a minute ago   Up About a minute          0.0.0.0:6379->6379/tcp                                                   redis
3f070c2bb470   yandex/clickhouse-server   "/entrypoint.sh"         2 months ago         Exited (255) 4 weeks ago   0.0.0.0:8123->8123/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:9009->9009/tcp   ch-server
a123456@luludeMacBook-Pro-2 redis % docker exec -it d44b6b228634 /bin/bash
root@d44b6b228634:/data# redis-cli
127.0.0.1:6379> get name
"yyp"
127.0.0.1:6379>

我们使用 get name 命令验证重新安装 Redis后,原始数据能够正确恢复。好了,使用Docker 安装 Redis 就介绍到这里。

相关推荐
侠客行031721 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪21 小时前
深入浅出LangChain4J
java·langchain·llm
老毛肚1 天前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎1 天前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Yvonne爱编码1 天前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚1 天前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂1 天前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
fuquxiaoguang1 天前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
琹箐1 天前
最大堆和最小堆 实现思路
java·开发语言·算法
__WanG1 天前
JavaTuples 库分析
java