从主机上,连接到我自己添加的 Docker 中运行的 Redis 被拒绝,"Error: Server closed the connection"



如果我启动官方的redis容器,例如docker run -d -p 6379:6379 redis,我可以从主机访问它,而不会有任何问题。

但我的docker是基于alpine的,我添加了如下redis。这4行Dockerfile将重现我的问题。(它将像当前的官方redis容器一样添加redis_version:6.2.6(

FROM node:14-alpine3.14
RUN apk add redis bash
EXPOSE 6379
CMD ["redis-server"]

当我运行它docker run -p 6379:6379 mydocker并从主机访问redis服务器时,我可以连接到它,但收到错误";错误:服务器关闭了连接";

127.0.0.1:6379> info
Error: Server closed the connection

从主机连接到Docker Container中运行的Redis中接受的答案是,我应该bind 0.0.0.0,否则Redis只能在容器内访问。但我觉得这个答案并不能解释整个情况。例如,为什么可以从主机访问普通的redis容器?我在容器中没有看到redis.conf,我找不到它是如何bind 0.0.0.0的。

如何访问在我的高山集装箱内运行的redis?

---更新---

我知道如果我有redis.conf,我可以更改绑定设置。例如,在我的mac上,我在/opt/local/bin/安装redis,在/opt/local/etc/安装redis.conf,在它有这样的设置时,

# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT OUT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1 -::1

但在官方的redis docker容器中,我找不到redis.conf,所以我很困惑主机如何访问它(我问这个问题的原因之一(

我已经找到了无法从我的高山容器访问redis的原因,保护模式是yes。所以我不认为这是关于--bind 0.0.0.0的。

所以,如果我启动redis官方docker镜像,受保护的模式是否定的,所以我可以从主机访问它。

127.0.0.1:6379> config get protected-mode
1) "protected-mode"
2) "no"

我在官方图片中没有redis.conf(我用find搜索,但找不到(

但对于我自己的docker,它的保护模式是肯定的,所以我不能从主机访问。redis.conf实际上是etc/redis.conf,但redis服务器默认不使用它。

所以不用这个dockerfile

FROM node:14-alpine3.14
RUN apk add redis bash
RUN sed -i 's/bind 127.0.0.1 -::1/# bind 127.0.0.1 -::1/g; s/protected-mode no/protected-mode yes/' /etc/redis.conf
EXPOSE 6379
CMD ["redis-server","/etc/redis.conf"]

只使用以下内容更容易,我可以从主机访问它!

FROM node:14-alpine3.14
RUN apk add redis bash
EXPOSE 6379
CMD ["redis-server","--protected-mode no"]

我进一步查看了redis官方Dockerfile,https://github.com/docker-library/redis/blob/15ed0a0c1cb60c5193db45d8b59a8707507be307/6.2/Dockerfile#L55

# disable Redis protected mode [1] as it is unnecessary in context of Docker

这就解释了!

相关内容

  • 没有找到相关文章

最新更新