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