如果我启动官方的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
这就解释了!