Javascript 无法从Docker容器内部连接到Redis群集
我有一个使用这个javascript客户端库的节点应用程序。我的问题是,我无法将这个也已停靠的应用程序连接到我的Redis群集(端口7000到7005)及其容器。以下是我的设置和结果: 我克隆此repo并按照说明从Javascript 无法从Docker容器内部连接到Redis群集,javascript,node.js,docker,redis,redis-cluster,Javascript,Node.js,Docker,Redis,Redis Cluster,我有一个使用这个javascript客户端库的节点应用程序。我的问题是,我无法将这个也已停靠的应用程序连接到我的Redis群集(端口7000到7005)及其容器。以下是我的设置和结果: 我克隆此repo并按照说明从Dockerfile构建映像 $ docker build -t gsccheng/redis-cluster . 然而,在构建之前,我唯一的改变是设置我自己的版本,我已经更改为 ARG redis_version=3.2.1 按照指示我运行 docker run -i -t -p
Dockerfile
构建映像
$ docker build -t gsccheng/redis-cluster .
然而,在构建之前,我唯一的改变是设置我自己的版本,我已经更改为
ARG redis_version=3.2.1
按照指示我运行
docker run -i -t -p 7000:7000 -p 7001:7001 -p 7002:7002 -p 7003:7003 -p 7004:7004 -p 7005:7005 -p 7006:7006 -p 7007:7007 gsccheng/redis-cluster
到目前为止还不错……
除了一些警告外,如:警告:由于/proc/sys/net/core/somaxconn设置为较低的值128,因此无法强制执行TCP backlog设置511。
,目前为止效果良好。为什么
docker inspect[container id]
我看到它的NetworkSettings>IPAddress为172.17.0.2,在NetworkSettings>Ports中我看到了它
"Ports": {
"6379/tcp": null,
"7000/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "7000"
}
],
...
}
Dockerfile
和一个dockercompose.yml
,在这里:
docker compose.yml
Dockerfile
connect.js
然后我就跑
$ docker-compose build
及
输出是在这里。对于这个例子,我删除了一些不相关的行(用“…”表示)
如果有区别的话,我的应用程序就是从这个React redux构建的,但它不包括Redis
健全性检查
docker compose up
的运行以及gist中所示的错误持续记录,我仍然可以在执行以下操作时从容器外部连接到集群:
$ redis-cli -c -p 7000
$docker ps
显示了这一点$docker exec 4b3ec3e53e32 ps aux | grep redis
显示了这一点$docker inspect 4b3ec3e53e32
。请注意网络设置下的IPAddress:“
”
“HostIp”:“0.0.0.0”和之间有什么区别?0.0.0.0
绑定在redis.conf
配置中,我认为这意味着服务器将只侦听来自该地址的请求。这是否意味着此处列出的IP必须与我的另一个ctn\u web\u 1
容器的IP匹配
docker compose up
的输出中看到,Redis服务器的运行速度为172.18.0.2
。我注意到,这也改变了我运行docker compose
的许多实例(例如172.18.0.4
,172.18.0.3
)。为什么?是因为我在再次运行之前没有完全删除容器吗?但是,我不应该在我的connect.js
代码中正确使用这个ip地址,因为这个地址是redis容器的内部地址(而我的web容器感兴趣的接口是redis容器的地址)更新: A.
$docker compose ps
输出为。
B.同时注意问题。更具体地说
redis cluster还不支持docker(除非您进行主机联网)->公布的ip地址将不同于他们可以通过的ip地址
你应该拆下这条线
host: '0.0.0.0'
从你的connect.js。您需要通过其他容器的DNS名称(redis)连接到其他容器,只要您在同一docker网络中旋转它们,该名称就可以工作。这是docker compose在版本2 yml文件中的默认行为
容器可以从不同的IP开始。我建议不要尝试将容器的IP硬编码到任何配置文件中,因为通过设计,目标容器可能会来来去去去
从您提到的问题来看,上游作者似乎不支持您正在尝试的操作。我不确定这与您关于redis cli工作的最初发现是如何协调的。我的回答基于一个工作redis环境的假设。为了回应其他一些困惑:
- 0.0.0.0是一个侦听IP,指示应侦听所有接口。您不从客户端连接到0.0.0.0,只侦听此地址作为服务器
- 您看到的空IP地址是重新组织一些json输出的结果,所有IP现在只列出它们的特定网络,并且在顶层不再列出默认IP
host
,但是你明白了。不幸的是,使用host:redis
,我似乎仍然有相同的错误输出。因此,DNS名称是指我在Dockerfile右侧的dependens\u on
下引用的相同名称?DNS将是服务的名称,在您的示例中是“redis”,这也是dependens\u所指向的值。基于DNS的发现将在docker内部同一网络上的不同容器之间工作。您的评论让我研究如何从一个容器中检查它是否可以在同一网络中找到另一个容器。这使我用第8项和第9项更新了底部的问题。在我更新之前,运行主机:'redis'
似乎可以使docker compose下的工作正常(其他一切看起来都正常)?我的前两次更新是否引发了任何新的想法,以寻求可能的解决方案?您当前的更新显示了我建议删除的行,作为唯一未注释的行。您似乎没有尝试过上述建议。谢谢您的帮助。我将您的答案标记为解决方案,因为它是这两者的组合,并且我没有重建码头
$ docker-compose build
$ docker-compose up
$ redis-cli -c -p 7000
host: '0.0.0.0'