无法从Docker容器内部连接到Redis群集

我有一个Node应用程序使用这个ioredis JavaScript客户端库。 我的问题是,我无法将这个也dockerized的应用程序连接到我的Redis群集(在端口7000到7005)及其容器。 这是我的设置和结果:

我克隆这个Docker-redis-cluster回购,并按照说明从Dockerfile构build图像。

 $ docker build -t gsccheng/redis-cluster . 

然而在build立之前,我唯一的改变是设置我自己的版本,我已经改变了

 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 

很远很远

除了以下几个警告外: WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. ,因此WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 。 为什么?:

  1. 这是输出的屏幕截图。
  2. 我可以使用redis-cli -c -p 7000进入CLI
  3. docker inspect [container id]我看到它有一个NetworkSettings> IP地址172.17.0.2和NetworkSettings>端口我看到

     "Ports": { "6379/tcp": null, "7000/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "7000" } ], ... } 

接下来,我停止并删除所有的容器。 我导航到我的web应用程序的根,我有一个Dockerfile和一个docker-compose.yml在这里:

泊坞窗,compose.yml

 version: '2.1' services: web: build: . ports: - '8080:8080' depends_on: - redis redis: image: gsccheng/redis-cluster ports: - '7000:7000' - '7001:7001' - '7002:7002' - '7003:7003' - '7004:7004' - '7005:7005' 

Dockerfile

 FROM node:4.4.7 # Create app directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # Install app dependencies COPY package.json /usr/src/app/ RUN npm install # Bundle app source COPY . /usr/src/app EXPOSE 8080 CMD [ "npm", "run", "prod" ] 

connect.js

 import Redis from 'ioredis'; console.log('I am totally in here'); // The commented out host options shows the many different configurations I tried too. const node = [{ // Just need to connect to at least one of the startup nodes in the cluster. Redis will find the rest of the nodes in the cluster. All nodes only have a single db of 0 and SELECT is disabled. port: 7000, // host: '0.0.0.0' // host: '127.0.0.1' // host: '172.18.0.4' host: 'redis' // host: 'gsccheng/redis-cluster' }, { port: 7001, // host: '0.0.0.0' // host: '127.0.0.1' // host: '172.18.0.4' host: 'redis' // host: 'gsccheng/redis-cluster' }] client = new Redis.Cluster(node, {}); ... 

然后我跑

 $ docker-compose build 

 $ docker-compose up 

输出是在这个要点 。 我从这里删除了一些不相关的行(用“…”表示)。

如果它有所不同,我的应用程序是从这个React-redux 样板构build的,但它不包含Redis。

完整性检查

  1. 使用docker-compose up运行,错误不断按照您在主要内容中看到的那样进行,我仍然可以在执行时从容器外部连接到群集:

     $ redis-cli -c -p 7000 
  2. $ docker ps显示这个截图 。

  3. $ docker exec 4b3ec3e53e32 ps aux | grep redis $ docker exec 4b3ec3e53e32 ps aux | grep redis显示此截图 。

  4. 以下是$ docker inspect 4b3ec3e53e32的完整输出 ,再次$ docker inspect 4b3ec3e53e32 redis容器。 请注意NetworkSettings下的"IPAddress": ""

进一步的问题

  1. …为什么现在这个空白? 这就是为什么我的Redis客户端无法连接到群集?
  2. 这个ip和"HostIp": "0.0.0.0",什么区别"HostIp": "0.0.0.0", 0.0.0.0绑定在redis.confconfiguration中,我认为这意味着服务器只会侦听来自该地址的请求。 这是否意味着在那里列出的IP必须与我的其他ctn_web_1容器的IP相匹配?
  3. 我们还从172.18.0.2的输出中看到,Redis服务器的性能达到了172.18.0.2 。 我注意到,这也改变了很多从实例到实例(例如172.18.0.3 )运行172.18.0.3 docker-compose 。 为什么? 是否因为在再次运行之前我还没有完全删除容器? 但是,我不应该在我的connect.js代码中使用这个ip地址,因为这个地址是在redis容器的内部(而我的web容器会感兴趣的是redis容器的地址)?

更新

A. $ docker-compose ps输出在这里 。 B.还要注意这个问题。 更具体的说

redis集群不支持docker(除非你主机联网) – >广告的IP地址将不同于他们可以通过

你应该删除该行

 host: '0.0.0.0' 

从你的connect.js。 您需要通过其DNS名称(redis)与其他容器build立连接,只要您在同一个泊坞窗networking中启动它们,就可以工作。 这是一个版本2 yml文件的docker-compose的默认行为。

容器可能以不同的IP开始。 我build议不要试图将一个容器的IP硬编码到任何configuration文件,因为通过devise目标容器可能来去。


从你引用的问题来看,上游作者不支持你所要做的事情。 我不确定这与redis-cli的最初发现如何协调。 我的回答是基于一个工作redis环境的假设。 回应一些其他的困惑:

  • 0.0.0.0是一个侦听的IP,指示应该侦听所有的接口。 您不能连接客户端的0.0.0.0,只能听到这个地址作为服务器。

  • 你看到的空的IP地址是重新组织一些json输出的结果,所有的IP现在只在他们特定的networking上列出,没有默认的IP在顶层列出。