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 就介绍到这里。

相关推荐
Ling_suu25 分钟前
Spring——单元测试
java·spring·单元测试
ModelBulider27 分钟前
十三、注解配置SpringMVC
java·开发语言·数据库·sql·mysql
苹果酱056742 分钟前
C语言 char 字符串 - C语言零基础入门教程
java·开发语言·spring boot·mysql·中间件
csucoderlee1 小时前
eclipse mat leak suspects report和 component report的区别
java·ide·eclipse
水宝的滚动歌词1 小时前
K8S单节点部署及集群部署
云原生·容器·kubernetes
代码小鑫1 小时前
A032-基于Spring Boot的健康医院门诊在线挂号系统
java·开发语言·spring boot·后端·spring·毕业设计
训山1 小时前
4000字浅谈Java网络编程
java·开发语言·网络
VertexGeek1 小时前
Rust学习(四):作用域、所有权和生命周期:
java·学习·rust
喔喔咿哈哈1 小时前
【手撕 Spring】 -- Bean 的创建以及获取
java·后端·spring·面试·开源·github
码农小丘1 小时前
了解springboot国际化用途以及使用
java·spring boot·spring