我在 docker 容器中运行 redis-server。它在 127.0.0.1 端口 6379 上运行。
在容器中: 我能够在容器内连接到 redis-server 并毫无问题地处理命令。
来自主持人: 当我使用 redis-cli 监视器从主机到容器执行 redis-cli 时,它给出了 错误:服务器关闭了连接。
如果我只是执行 redis-cli
,它会给出提示;
127.0.0.1:6379>
127.0.0.1:6379> set www yee
Error: Server closed the connection
这似乎是 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
我的 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
如果有任何调试提示,这将非常有帮助;
最佳答案
我通过在 redis.conf
中注释掉以下行来解决这个问题。
# bind 127.0.0.1
当redis在容器上启动并连接到docker网络时,会在该网络上为redis创建一个新接口(interface),这个接口(interface)有自己的ip地址。例如,docker 网络可以分配 172.18.0.2/24
范围内的地址,而 redis 容器可以分配 172.18.0.2
。并非总是可以预测哪个 IP 地址将分配给 redis,除非有人在 docker run 命令中明确分配了 ip 地址。唯一的选择是在 redis.conf
中注释绑定(bind),这将允许 Redis 现在在所有接口(interface)上监听对 6379
的请求。
这解决了问题,我可以从另一个容器连接到 redis。
关于docker - 无法从另一个 docker 容器连接到 redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50559985/