Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法从Docker容器内部连接到Redis群集_Javascript_Node.js_Docker_Redis_Redis Cluster - Fatal编程技术网

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

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

我有一个使用这个javascript客户端库的节点应用程序。我的问题是,我无法将这个也已停靠的应用程序连接到我的Redis群集(端口7000到7005)及其容器。以下是我的设置和结果:

我克隆此repo并按照说明从
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。
,目前为止效果良好。为什么

  • 这是一个屏幕截图
  • 我可以使用redis CLI-c-p 7000进入CLI
  • 使用
    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"
                    }
                ],
                ...
             }
    
  • 接下来,我停止并删除所有容器。我导航到我的web应用程序的根目录,其中有一个
    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
    显示了这一点

  • 这是redis容器的完整信息,来自
    $docker inspect 4b3ec3e53e32
    。请注意
    网络设置下的
    IPAddress:“

  • 其他问题

  • …为什么现在是空白?这就是我的Redis客户端无法连接到群集的原因吗
  • 该ip与
    “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


    Oops我没有在那里正确地注释配置,并且意外地在那里留下了两行
    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'