本文重新编写于2023年8月2日,涵盖安装时所遇到的大部分问题,如遇不懂,可以留下评论、私信或者添加微信(nzc_wyh),在力所能及的情况下帮助你,仅是因为作为前人踩过的坑,希望后来的同行者可以借鉴和学习罢啦。

当然也希望你在发出询问前,已确保自己认真阅读了文章,百度或google了,带着自己的思考和问题而来,可以更好的交流和学习。

本文纯新手也能看懂,当然我这里没讲解怎么安装 Docker,这一步还是需要自己去做哈。

测试过的相关系统版本信息:centos 8.5、ubuntu 18、ubuntu 20,比这些版本高的不用在意,一般都会兼容,如果版本较低的话,导致redis启动失败的话,可以选择降低 redis 版本,再重复尝试一下。
关于这一点,评论区有朋友在 centos 7.9 版本情况下启动redis 7.0.2,报内存申请失败,处于一直重启的情况,将redis版本将为6版本后,没有再出现相关问题。各位可做一个参考。

不仅教你安装,还教你删除。

每一行命令都带图解,绝对能懂。

大家对搭建Redis Clustr (Redis 集群)感兴趣的,可以看看这篇文章
Docker搭建Redis Cluster集群环境
希望对大家有所帮助

如果只需要看如何指定配置文件启动 redis 容器的,可以直接跳到第二章节开始阅读,以节省时间。

前言

大致内容点

1、Docker 的基本使用(查看、删除镜像,查看、暂停、删除容器,查看日志,交互式的方式进入容器内部等)

2、Docker 命令行参数的大致介绍

3、redis-cli 的使用

本文大纲:

在这里插入图片描述

一、简易版本启动

1.1、一条命令直接搞定

无需配置文件,所有的参数全部跟在docker 命令后,命令如下:

docker run --restart=always -p 6379:6379 --name myredis -d redis:7.0.12  --requirepass ningzaichun

启动效果:
在这里插入图片描述

备注:在宿主机没有镜像的情况,会自动在 Docker hub 的公开仓库中进行寻找和下载。

1、docker ps 命令,查看本机docker运行的容器

docker ps
docker ps -a # 查看全部的容器,包括已经停止的

在这里插入图片描述

从这里可以看到是容器运行状态是健康的。

2、docker logs 查看日志

docker logs [容器名 | 容器ID ]
docker logs -f  [容器名 | 容器ID ] #表示实时的跟踪日志输出
docker logs --since 30m myredis # 此处 --since 30m 是查看此容器30分钟之内的日志情况。

在这里插入图片描述

1.2、测试连接

1)测试本地连接

docker exec -it [容器名 | 容器ID] bash # 以交互的方式进入容器内部,具体的我这里没解释啦
#最近准备了一篇文章专门来讲这个

redis-cli
set k1 v1
auth ningzaichun #自己设置的密码
get k1

在这里插入图片描述

2)测试外部连接

外部连接的话,你可以使用连接工具,也可以使用 redis-cli

笔者此处使用的本机的 redis-cli 环境,我此处是配置了环境变量,你们可能需要在安装redis的环境下才可以运行 redis-cli 命令
在这里插入图片描述

备注

1、如果你是云环境的话,记得要去开放安全端口,否则外部是无法连接的。

2、虚拟机环境的话,记得要去开放防火墙,或者直接关闭防火墙。

1.3、优缺点

优点及适用场景

1、适用于各位搭建测试环境,直接一条命令到位,不需要考虑这考虑那

2、适用于新手玩redis,只是想要学习Redis命令,完全可以应付前期的学习,给予自己一定的正向反馈,让自己坚持学下去。

缺点

1、数据比较容易丢失,因为没有配置需要落入磁盘,所以全部都是在内存中,一旦关机或者容器挂掉,数据就没有啦。

2、没法修改配置文件,不好去自定义配置

二、指定 redis.conf 配置文件启动

2.1、获取Redis配置文件

这个配置文件需要自己上传到服务器上~

截止我编写文章 2023年8月1号,目前最新版是 7.2 ,但并非是稳定版,然后我就选择了 7.02 版本,在这里选择了 7.0 版本的配置文件(一般大版本的配置文件都是通用的),那么在获取镜像的时候,也需要找相对应的镜像版本。

7.02 Redis.conf Github,有考虑了一下可能有访问失败的朋友,笔者 fock了一份放到了 gitee redis.conf

此处的配置文件笔者只修改一下密码和允许外部连接的配置,以确保是使用了我们自己修改过的配置文件。想要了解详细配置文件的朋友,可以找相关的文章学习一下,英文能力尚可的情况下,大部分也可以理解。

配置文件具体修改的地方:

# requirepass foobared 找到这个,改成你想改的密码即可

在这里插入图片描述

bind 127.0.0.1 -::1 # 这个的话改成 0.0.0.0 即可,127.0.0.1 是只允许本机访问

在这里插入图片描述

我的目录结构如下,后面的启动命令中的参考路径也是这里的:

在这里插入图片描述

2.2、Docker Hub 上查看已有 Redis 相关版本镜像

在Docker hub 上可以进行搜索,找到目前 Redis 已有的镜像和相关版本,有些版本是三位数,不好确定,可以来这里看一下,此处的版本号不完全和 Github 上Redis 版本相对应,但只要是稳定版本,且在同一个大版本之内的,配置文件就大概率可以通用。

Docker Hub Redis Images

要查看的具体的版本,可以点击tags,可以看到相关的版本,并且也有拉取镜像的命令。

在这里插入图片描述


补充:笔者尝试过使用 docker search redis:7.0.12 是无法搜到镜像,好像默认就是只能搜索到 latest版本,但是使用 docker pull redis:7.0.12 是可以成功拉取镜像的。

docker pull redis:7.0.12

在这里插入图片描述

2.3、指定redis.conf 启动 redis 容器

启动命令,我去掉了之前的一些繁琐的参数,比如大家常常说指定日志文件大小

-log-opt max-size=100m --log-opt max-file=2 从而导致报错之类的,现在的话,大伙可以看自己的需求是否需要添加。

docker run --restart=always \
-p 6379:6379 \
--name myredis \
-v /home/dj/redis/redis.conf:/etc/redis/redis.conf \
-v /home/dj/redis/data:/data \
-d redis:7.0.12 redis-server /etc/redis/redis.conf

在这里插入图片描述

笔者宿主机的文件目录如下:(供参考)

在这里插入图片描述

各参数的意义:

1)-restart=always 总是开机启动
2)-p 6379:6379 将6379端口挂载出去
3)–name 给这个容器取一个名字
4)-v 数据卷挂载 /home/dj/redis/redis.conf:/etc/redis/redis.conf

此处是将宿主机 /home/dj/redis/redis.conf 文件映射到 redis 容器下的 /etc/redis/redis.conf,此处你也可以理解为docker容器和宿主机共享这个文件。

5)-d redis:7.0.12 后台运行容器,不加-d就是直接在控制台输出,关闭窗口即停止容器。

6) redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的 redis.conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是宿主机下共享的 /home/dj/redis/redis.conf。

补充:如果有权限相关的问题,可以给容器一个特权模式。加一个 --privileged

7)--log-opt max-size=100m --log-opt max-file=3

max-size:指定日志文件大小上限

max-file:指定日志文件个数

查看启动日志

docker logs myredis # 后面跟容器名 or 容器ID 都可以
docker logs --since 30m <容器名> # --since 30m 是查看此容器30分钟之内的日志情况。

在这里插入图片描述

测试连接

使用交互方式进入到容器内部:

docker exec -it myredis bash
redis-cli
set k1 v1 #你会发现失败的
get k1
auth ningzaichun # 验证密码

在这里插入图片描述

外部测试连接,其实也一样

在这里插入图片描述

三、Docker 停止、删除、重启、启动容器

正常删除容器,一般是先停止容器,再进行删除

docker stop [容器名|容器ID] #停止容器
docker start   [容器名|容器ID]  #启动停止的容器
docker restart  [容器名|容器ID]  # 将容器重新启动
docker kill [容器名|容器ID] #强行终止
docker rm [容器名|容器ID]   # 删除停止的容器

在这里插入图片描述

在这里插入图片描述

其他的同等意思。

docker stop和 docker kill容器有一些区别,stop 是会等待容器内的应用终止的,但是kill不会给容器内应用任何时间,会直接kill掉,这一点和 linux中的 kill -15 和 kill -9 是类似的。

备注:kill -9 PID 是操作系统从内核级别强制杀死一个进程. kill -15 PID 可以理解为操作系统发送一个通知告诉应用主动关闭. SIGNTERM(15) 的效果是正常退出进程,退出前可以被阻塞或回调处理

强行删除

docker rm -f [容器名|容器ID]

在这里插入图片描述

四、Docker 搜索、拉取、删除、查看镜像

四行命令都很简单:

docker search redis #查找公开仓库中的redis镜像,这里貌似不能指定具体的版本号,只会提供最新的,上文已经谈过了
docker pull redis[:tag] #拉取镜像,tag 同上
docker rmi redis[:tag] #删除镜像,这里也可以跟镜像ID, 即 docker rmi 镜像ID
docker images #查看所有的镜像

备注:不添加[:tag]的情况下,默认是 latest 版本。

在这里插入图片描述

不加版本号的时候,默认就是 latest 版本
在这里插入图片描述
在这里插入图片描述

4.1、Untagged 和 Deleted

Untagged

我们首先都知道镜像的唯一标识是其 ID 和摘要,但一个镜像可以有多个标签

因此当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged 的信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 Delete 行为就不会发生。所以并非所有的 docker rmi 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。

Delated

当一个镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变动非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。所以delated命令触发的判断机制要比 untagged 要难上许多。

五、在评论区收集的问题

5.1、挂载参数问题&删除卷问题

在这里插入图片描述

1、回答第一个问题,我原版文章中使用的也是具名挂载。

具名挂载的语法是:-v hostPath:containerPath 有需求自己删除宿主机的目录即可。

2、这篇文章使用的是 7.0.12 版本,为了回答问题,我又再去尝试了一遍 redis:latest 版本。

docker pull redis # 默认会拉取最新的版本

# 启动命令如下
docker run --restart=always \
-p 6379:6379 \
--name myredis \
-v /home/dj/redis/redis.conf:/etc/redis/redis.conf \
-v /home/dj/redis/data:/data \
-d redis redis-server /etc/redis/redis.conf

完整的过程

在这里插入图片描述

从这个过程也可以看出来,我们是使用了自己宿主机挂载进去的配置文件的。

5.2、–restart=always 和 docker restart <容器ID or 容器名> 重启

--restart=always 参数能够使我们在重启 docker 时,自动启动相关容器。应用场景就是服务器关机重启了,不需要我们手动去启动每个容器。

docker restart 的意思就是重启容器,不需要添加其他参数,就是直接重启。

5.3、driver failed programming external connectivity on endpoint myredis

此错误我没有复现出来,但是我在网上查找了一番信息,说的是端口映射错误或者是网络方面的问题。

https://stackoverflow.com/questions/44414130/docker-on-windows-10-driver-failed-programming-external-connectivity-on-endpoinhttps://github.com/docker/for-win/issues/1038

他的方式是重启了 docker 并重启容器,执行:

systemctl restart docker
docker start .....

此回答出处来自于CSDN博主「SunnyJim」的原创文章https://blog.csdn.net/baobaoxiannv/article/details/96482560

5.4、挂载文件的问题

在这里插入图片描述

先抽取一下这个问题:

说的是 docker run -v 指令挂载针对是文件夹,所以我命令中所要挂载的 redis.conf 配置文件会转换为一个 redis.conf 的文件夹被挂载进去。这也就意味着 redis 启动的时候是没法加载自定义配置文件的。小伙伴的解决方案是新建一个 conf 文件夹,将redis.conf 放到conf文件夹下,然后挂载这个文件夹。

所以我在测试这一步的时候,我首先将我本地 redis 的容器和镜像全部删除掉,然后才执行的这条命令

docker run --restart=always \
-p 6379:6379 \
--name myredis \
-v /home/dj/redis/myredis.conf:/etc/redis/redis.conf \
-v /home/dj/redis/data:/data \
-d redis redis-server /etc/redis/redis.conf

执行的完整流程图:

在这里插入图片描述

容器内配置文件位置

在这里插入图片描述

首先说结论,是可以成功启动的,也是可以成功读取共享的配置文件的

现在我来回答第一个问题里面另一个小问题,小伙伴说的是 docker run -v 挂载针对的是配置文件,但实际上,在这条命令中,我成功将宿主机内的 myredis.conf 配置文件挂载到容器内,一同共享这个文件。

我在回答前,有去看了其他的博主的描述,也查了官方资料(没说这个问题),有说可以挂载的,也有说挂载是针对文件夹,我看到唯一感觉靠谱的答案,说的是更建议挂载文件夹,而不是挂载具体的某个文件而已。

最后补充一个底层原理,Docker 使用了文件系统的特性和 Linux 的挂载命令来实现卷的挂载。当使用 -v 参数时,Docker Daemon 将根据提供的路径信息,将宿主机上的文件或文件夹映射到容器中的指定位置。这种映射是通过 Linux 的 Mount Namespace 功能实现的,它允许在容器中看到宿主机的一部分文件系统,从而实现了挂载的效果

5.5、连接不上Redis

注意以下几点:

1、请先使用 docker exec -it <容器ID|容器名> bash,进入容器内部,使用 redis-cli 看是否可以进入

2、docker logs <容器ID|容器名> 查看相关日志

3、确保端口映射正确

4、虚拟机记得关闭防火墙,或者放行某个端口

5、云服务器,请去服务器管理界面,安全组管理,放开相关端口

6、是否允许远程连接,配置文件中的 bind 项是否做了修改等等。

5.6、关于是否需要添加–privileged=true问题

--privileged=true 准确的术语的称呼为 Docker 容器的特权模式,使用特权模式启动容器,可以获取大量设备文件访问权限。因为当 root 用户执行 docker run --privileged 时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。

当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。
关于是否需要开启特权模式,如果你报这个权限不足的问题,那就加上就好啦。但如果没有,我不建议你加。容器内可以操作宿主机的资源,这是非常不安全的一件事情。

一般更加适用的场景多半是docker容器需要调用到宿主机硬件资源或者某些特殊依赖,才会开启特权模式。

5.7、如何进行排错和定位问题

1、学会查看日志,学会查找关键字,定位问题,确定问题所在。

2、然后再学会如何合理使用各大搜索引擎或者GPT,帮助你提供相关的解决方案。

3、最后都解决不了时,请回忆自己做过的相关关键操作,提供于其他开发者,便于其他开发者快速复现错误。

以现在的Docker的发展程度,基本你在初级阶段遇上的错误,大都数都能在网上找到类似的错误

笔者后记

不知道还会不会有人回过头来阅读这篇文章,更不知道这部分的文字,会不会被人所认真阅读啦,但我还是写下来啦。

回头一望,这篇文章的初版还是编写于 2021年4月27日,一眨眼已经是2023年8月啦啊。现在再回头看看自己编写的文字,多少觉得有些稚嫩,也有些粗糙和不足,也多亏各位朋友谅解,先谢过了

断断续续有不少小伙伴可能询问过我这个问题,有些时候忙,回答的匆匆忙忙,不够细致,也有些不妥当。趁着这次想要重写的机会,把文章彻底重写啦,把该有的测试过程都完整的贴在文章中,并且在原文的基础上补充了一些知识,希望能够帮助到各位小伙伴。

我也终于在2023年8月6号的晚上,将这篇文章重写完成啦,原文我将会重新保存到我自己的本地文档中去,在原文的链接上将重写的文章更新出来。

希望重写的这篇文章,能带你们回到第一次看到这篇文章的时候,也希望未来的其他的小伙伴看到本文,可以不再踩坑

当然,我也是人,我也会犯错,即使我已经检查过文章,但我仍不能确保文章中的所有的一切都是正确的,所以文章中如有错误,请您一定要指正,我也会及时更改,以免误导了各位小伙伴


如果有问题,可以直接评论或联系我的微信:nzc_wyh,备注 csdn 或 掘金 docker redis,可以的话,也可以给个备注,比如 工作岗位-城市-昵称/学习-大几-昵称,拉你进群,一起探讨问题,私人问题,我也会回答。

真的感谢的话,记得点个赞,或者给我来一条真实评论,我就是真的开开心心啦

成功了的话,也记得评论一下,也算是帮我验证了文章的实用性啦,先谢谢各位啦~~

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐