螺栓连接,Docker Compose + Neo4j + Node

我是Docker Compose的新手,我试图获取两个图像(一个Node应用程序,另一个是Neo4j数据库)在本地协同工作。 我的操作系统是Ubuntu。 虽然每个图像单独工作正常,我无法获得节点应用程序图像连接到数据库图像。

我几乎可以确定是与港口连接有关; 准确地说,我在驱动程序连接中使用了URL参数:


     var driver = neo4j.driver(“bolt:// neo4j:7687”,neo4j.auth.basic(“tester”,“tester”));

其中“7687”是docker-compose.yml中的Neo4j的螺栓端口,“neo4j”是我分配给Neo4j映像的名称(见下文)。

我正在使用(使用不同的JS驱动程序)我能find的唯一的Node + Neo4j + Docker教程( https://medium.com/@slavahatnuke/neo4j-node-js-docker-docker-compose-fdc1cc9cf405 ),以及那里的用户评论似乎确认错误在我的连接URL中。

尝试和总结:

  1. Node应用程序使用官方的neo4j-javascript-driver通过Bolt连接到Neo4j数据库。 确切的代码是:

     “严格使用”;

     var express = require('express');
     var neo4j = require('neo4j-driver')。v1;
     const PORT = 8080;

     var app = express();

     //下面是Neo4j连接的一个testing,我在Docker容器中连接时遇到了问题

     router.get('/ test',function(req,res){
         var driver = neo4j.driver(“bolt:// neo4j:7687”,neo4j.auth.basic(“tester”,“tester”));

         var session = driver.session();
        的console.log(会话);
         var countPromise = session.readTransaction(function(transaction){
         var result = transaction.run(“MATCH(n)RETURN COUNT(n)AS c”)
             .then(function(result){
                的console.log(结果);
                 return result.records [0] .get(“c”);
             });
            返回结果;
         });
         countPromise.then(function(result){
             res.json(结果);
             session.close();
             driver.close();
         });

     });


     app.listen(PORT);
     console.log(“正在运行”+ PORT);

     module.exports = app;

  1. Neo4j镜像是Docker官方的Neo4j镜像。

  2. 我正在使用以下docker-compose.yml文件:

 nodeapp:
   image:节点:最新
  卷:
    -  ./nodeapp:/nodeapp
  链接:
    -  neo4j
  端口:
    - “18080:8080”
   working_dir:/ nodeapp
  入口点:节点index.js

 Neo4j的:
  图片:neo4j
  端口:
    - “17474:7474”
    - “17687:7687”
  卷:
   -  ./db/dbms:/data/dbms
  1. 当我运行它(“docker-up up”)时,我可以:

    A.通过将浏览器指向“localhost:17474”来访问Neo4j浏览器控制台。 我用提供的用户凭据login,可以运行Cypher查询罚款。

    B.如果我不试图创build一个Neo4j驱动程序,我可以通过将浏览器指向“localhost:18080”来运行Node中的任何常规GET函数。

    C.输出显示如下:“在0.0.0.0:7687上启用了螺栓”。

所以我一直在关注Node内的连接URL。

但是它还没有连接。具体来说,根据日志,程序只是试图创build驱动程序(它不断重复“这是一个Neo4j连接testing”)。

我确定Docker Compose有一些简单的缺失。

没有Docker,我使用URL“bolt:// localhost:7687”成功地将应用程序连接到数据库。 现在,它在Docker中,我不知道我应该使用什么。

感谢您的任何指导。

更新

恐怕这些build议都没有奏效。

这里是一些更多的信息:

  1. 当我运行“docker-compose ps”时,我得到了这个,所以看起来好像端口映射得很好。
      名称命令状态端口       
 -------------------------------------------------- -----------------------
 initialnode_neo4 / docker-Up 7473 / tcp,0.0.0。 
 j_1 entrypoint.sh 0:17474-> 7474 / tc 
                    neo4j p,0.0.0.0:17687 
                                                          - > 7687 / TCP       
 initialnode_node节点index.js Up 0.0.0.0:18080->8 
 app_1 080 / tcp  
  1. 运行时我检查了Neo4j镜像,这里有一些相关的结果:

      “NetworkMode”:“默认”,
                 “PortBindings”:{
                     “7474 / tcp”:[
                         {
                             “HostIp”:“”,
                             “HostPort”:“17474”
                         }
                     ]
                     “7687 / tcp”:[
                         {
                             “HostIp”:“”,
                             “HostPort”:“17687”
                         }
                     ]
                 },

     ...
     “ExposedPorts”:{
                     “7473 / tcp”:{},
                     “7474 / tcp”:{},
                     “7687 / tcp”:{}
                 },
     ...
     “networking设置”: {
                 “桥”:“”,
                 “SandboxID”:“5eb2b7805cc802391c08be8c85cdbb19fd42de6cc794e76e57f5214c6763c140”,
                 “HairpinMode”:false,
                 “LinkLocalIPv6Address”:“”,
                 “LinkLocalIPv6PrefixLen”:0,
                 “端口”:{
                     “7473 / tcp”:null,
                     “7474 / tcp”:[
                         {
                             “HostIp”:“0.0.0.0”,
                             “HostPort”:“17474”
                         }
                     ]
                     “7687 / tcp”:[
                         {
                             “HostIp”:“0.0.0.0”,
                             “HostPort”:“17687”
                         }
                     ]
                 },

     ...

     “网关”:“172.17.0.1”,
                 “GlobalIPv6Address”:“”,
                 “GlobalIPv6PrefixLen”:0,
                 “IPAddress”:“172.17.0.2”,
                 “IPPrefixLen”:16,
                 “IPv6Gateway”:“”,
                 “MacAddress”:“02:42:ac:11:00:02”,
                 “networking”:{
                     “桥”:{
                         “IPAMConfig”:null,
                         “链接”:null,
                         “别名”:null,
                         “NetworkID”:“8ffa640b707301bb9b8b6c2a1cfb6f5deac8c1a5f5de9e9de0976697b01027ef”,
                         “EndpointID”:“941911b65cf0b714fa13ac45ca967478a513fe5c282283aa0bfe20afcc0df06f”,
                         “网关”:“172.17.0.1”,
                         “IPAddress”:“172.17.0.2”,
                         “IPPrefixLen”:16,
                         “IPv6Gateway”:“”,
                         “GlobalIPv6Address”:“”,
                         “GlobalIPv6PrefixLen”:0,
                         “MacAddress”:“02:42:ac:11:00:02”
                     }
                 }
             }
     ...

  1. 我检查了Neo4j问题的日志,而且我总是得到这个:

     {“log”:“_writeConnectionHolder:\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.37931736Z”}
     {“log”:“ConnectionHolder {\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379324034Z”}
     {“log”:“_mode:'WRITE',\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379330305Z”}
     {“log”:“_connectionProvider:\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379353139Z”}
     {“log”:“DirectConnectionProvider {\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379363823Z”}
     {“log”:“_address:'neo4j:7687',\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.3793706Z”}
     {“log”:“_connectionPool:[Object],\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379377162Z”}
     {“log”:“_driverOnErrorCallback:[Function:bound _driverOnErrorCallback]},\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379384507Z”}
     {“log”:“_referenceCount:0,\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379391793Z”}
     {“log”:“_connectionPromise:Promise {null}},\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379398668Z”}
     {“log”:“_open:true,\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379405771Z”}
     {“log”:“_hasTx:false,\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379412739Z”}
     {“log”:“_lastBookmark:undefined,\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379437046Z”}
     {“log”:“_transactionExecutor:\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379445641Z”}
     {“log”:“TransactionExecutor {\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379452547Z”}
     {“log”:“_maxRetryTimeMs:30000,\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379459251Z”}
     {“log”:“_initialRetryDelayMs:1000,\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379466191Z”}
     {“log”:“_multiplier:2,\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379472573Z”}
     {“log”:“_jitterFactor:0.2,\ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379478888Z”}
     {“log”:“_inFlightTimeoutIds:[]}} \ n”,“stream”:“stdout”,“time”:“2017-05-05T16:20:59.379485201Z”}
     {“log”:“(node:1)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:2):错误:连接已被服务器closures\ n”,“stream”:“stderr”,“time”:“ -05T16:21:32.301674097Z“}

我有一个能够连接的同事,但他不得不使用一个粗略的第三方库,他不能通过螺栓连接,只有7474。

尝试: var driver = neo4j.driver("bolt://neo4j:7687", neo4j.auth.basic("neo4j", "neo4j"));

端口应该是7687,并且login凭证是默认的,除非在容器启动后手动更改了这些凭证。

还有一件事,neo4j将需要几秒钟的时间来启动,所以如果你尝试立即连接,最有可能的连接将失败。

看来这个问题是由于我的个人电脑设置,这就解释了为什么没有人有这个问题。

除了 Docker Neo4j镜像之外,我还运行了一个本地版本的Neo4j,它们都使用相同的端口。

这导致连接被拒绝。

我的解决scheme是:

  1. 停止我的本地版本的Neo4j(启动电脑时会自动启动)
  2. 然后使用几乎所有build议的URL运行docker-compose(我只使用“bolt:neo4j:因为Docker映像自动将Bolt映射到7687)。