螺栓连接,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中。
尝试和总结:
- 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;
-
Neo4j镜像是Docker官方的Neo4j镜像。
-
我正在使用以下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
-
当我运行它(“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议都没有奏效。
这里是一些更多的信息:
- 当我运行“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
- 运行时我检查了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” } } } ...
- 我检查了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是:
- 停止我的本地版本的Neo4j(启动电脑时会自动启动)
- 然后使用几乎所有build议的URL运行docker-compose(我只使用“bolt:neo4j:因为Docker映像自动将Bolt映射到7687)。