无法从另一个Docker容器连接到Redis

nis*_*ant 4 networking containers redis docker

我正在docker容器中运行redis-server。它在127.0.0.1端口6379上运行。

在容器中:在容器中时, 我能够连接到redis服务器,并且可以毫无问题地处理命令。

从主机: 当我使用redis-cli Monitor从主机到容器执行redis-cli时,出现错误:服务器关闭了连接。

如果我只是这样做redis-cli,它会提示您;

127.0.0.1:6379> 
127.0.0.1:6379> set www yee
Error: Server closed the connection
Run Code Online (Sandbox Code Playgroud)

似乎docker暴露了正确的端口,并且docker端口映射正在运行。失败不是在建立连接时发生的,而是连接很快就终止了。

从同一docker(网桥)网络上的另一个容器中:

redis.on('error', function(err) {    
        logger.error('Redis error: ' + err);
    } );

Redis error: Redis connection to 172.18.0.2:6379 failed - connect ECONNREFUSED 172.18.0.2:6379
Run Code Online (Sandbox Code Playgroud)

我的redis.conf档案有protected-mode no

日志记录设置为调试,但是日志上没有任何信息表明尝试建立连接并拒绝连接。

Redis客户端会继续重试超时,但是每次它被拒绝连接时。我尝试在docker网络上使用容器名称(作为主机名)和容器IP地址,在两种情况下,结果都是相同的。

docker network create redisnet
docker run --name redis -p 6379:6379 -d --net "redisnet" redis-server
docker run --name apiserver -p 81:8080 --net "redisnet" -d api-server

If I try to ping it from another container on the same net:
docker run -it --rm --net redisnet redis redis-cli -h redis ping
Could not connect to redis at redis:6379: Connection refused
Run Code Online (Sandbox Code Playgroud)

如果有任何调试技巧,将非常有帮助;

Ana*_*ain 6

-p在创建容器时使用选项将您的 redis 容器端口映射到主机端口。例子:

sudo docker run  -p 6379:6379 --name containername imageId
Run Code Online (Sandbox Code Playgroud)

然后您可以访问在主机上的容器内运行的 redis。


BMi*_*tch 6

要在主机与容器之间进行通信,您需要在主机上发布端口。例如docker run -p 6379:6379 redis。无需公开端口。这将使该服务可用于网络上的任何对象。您可以通过指定要监听的接口来限制它,例如:docker run -p 127.0.0.1:6379:6379 -d redis

要在容器之间进行通信,它们需要位于同一用户创建的docker网络上。例如:

docker network create my_app
docker run --net my_app -d --name redis redis
Run Code Online (Sandbox Code Playgroud)

然后,您将能够将其他容器连接到同一网络,并与“ redis:6379”进行通信。例如:

$ docker run -it --rm --net my_app redis redis-cli -h redis ping
PONG
Run Code Online (Sandbox Code Playgroud)


nis*_*ant 6

我通过注释中的以下行来解决此问题redis.conf

# bind 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

当在容器上启动Redis并将其连接到docker网络时,将在该网络上创建一个用于Redis的新接口,并且该接口具有其自己的IP地址。例如,泊坞窗网络可以分配范围内的地址,172.18.0.2/24而redis容器则可以分配172.18.0.2。除非总是在docker run命令中明确分配IP地址,否则并不总是能够预测将哪个IP地址分配给Redis。唯一的选择是注释bind in redis.conf,这将允许redis现在侦听6379所有接口上的请求。

这解决了问题,我能够从另一个容器连接到Redis。

  • 如果你这样做,不要用 docker 暴露你的端口 6379。任何拥有您 IP 的人都可以连接/尝试暴力破解您的 redis。感谢您的解决方案 (2认同)