docker - 无法从另一个 docker 容器连接到 redis

标签 docker networking redis containers

我在 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/

相关文章:

java - 如何保护用户不应读取的客户端数据

Java 从 url 下载 mp4

networking - 同一台计算机上的多个应用程序可以接收 UDP 广播吗?

python-3.x - 如何将 celery 任务添加到队列顶部?

macos - 服务 'nginx'无法构建:…只读文件系统

windows - 我可以在运行Windows/WSL2的远程主机上的容器中使用VS Code进行开发吗?

linux - Gentoo Linux : Docker container doesn't start: cgroup v2

javascript - 在 python 和 node.js 中复制 java.lang.String.hashCode() 输出的函数

python - 如何使用密码将 Superset 连接到 Redis?

docker - 如何在gcloud gcr.io中提供对特定镜像的访问?