我是 Docker Compose 的新手,我正在尝试让两个镜像(一个是 Node 应用程序,另一个是 Neo4j 数据库)在本地协同工作。我的操作系统是Ubuntu。虽然每个图像单独工作正常,但我无法让 Node 应用程序图像连接到数据库图像。
我几乎可以肯定这与端口连接有关;准确地说,使用我在驱动程序连接中使用的 URL 参数:
var driver = neo4j.driver("bolt://neo4j:7687", neo4j.auth.basic("tester", "tester"));
其中“7687”是 docker-compose.yml 中 Neo4j 的 Bolt 端口,“neo4j”是我分配给 Neo4j 镜像的名称(见下文)。
我正在关注(使用不同的 JS 驱动程序)我能找到的唯一 Node+Neo4j+Docker 教程 ( https://medium.com/@slavahatnuke/neo4j-node-js-docker-docker-compose-fdc1cc9cf405 ),并且那里的用户评论似乎确认错误位于我的连接 URL 中。
尝试总结一下:
- Node 应用程序正在使用官方 neo4j-javascript-driver 通过 Bolt 连接到 Neo4j 数据库。具体代码为:
"use strict"; var express = require('express'); var neo4j = require('neo4j-driver').v1; const PORT = 8080; var app = express(); //below is a test of the Neo4j connection, with which I have trouble connecting from in a Docker container router.get('/test', function (req, res) { var driver = neo4j.driver("bolt://neo4j:7687", neo4j.auth.basic("tester", "tester")); var session = driver.session(); console.log(session); var countPromise = session.readTransaction(function(transaction) { var result = transaction.run("MATCH (n) RETURN COUNT(n) AS c") .then(function(result) { console.log(result); return result.records[0].get("c"); }); return result; }); countPromise.then(function(result) { res.json(result); session.close(); driver.close(); }); }); app.listen(PORT); console.log("Running on " + PORT); module.exports = app;
Neo4j 镜像是 Docker 的官方 Neo4j 镜像。
我正在使用以下 docker-compose.yml 文件:
nodeapp: image: node:latest volumes: - ./nodeapp:/nodeapp links: - neo4j ports: - "18080:8080" working_dir: /nodeapp entrypoint: node index.js neo4j: image: neo4j ports: - "17474:7474" - "17687:7687" volumes: - ./db/dbms:/data/dbms
当我运行它时(使用“docker-compose up”),我可以:
A.通过将浏览器指向:“localhost:17474”,可以正常访问 Neo4j 浏览器控制台。我使用提供的用户凭据登录并可以正常运行 Cypher 查询。
B.如果我不尝试创建 Neo4j 驱动程序,我可以通过将浏览器指向“localhost:18080”来运行 Node 中的任何常规 GET 函数。
C.输出显示以下内容:“Bolt 在 0.0.0.0:7687 上启用。”
所以我一直专注于 Node 内的连接 URL。
但它还没有连接。具体来说,根据日志,程序只是不断尝试创建驱动程序,但失败了(它不断重复“这是 Neo4j 连接测试”这一行)。
我确信 Docker Compose 缺少一些简单的东西。
在没有 Docker 的情况下,我使用 URL“bolt://localhost:7687”成功将应用程序连接到数据库。现在已经在 Docker 中了,我不知道应该使用什么。
感谢您的指导。
更新:
恐怕这些建议都不起作用。
这里有一些更多信息:
- 当我运行“docker-compose ps”时,我得到了这个,所以看起来端口映射正确。
Name Command State Ports ------------------------------------------------------------------------- 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 node index.js Up 0.0.0.0:18080->8 app_1 080/tcp
- 我在运行时检查了 Neo4j 镜像,以下是一些相关结果:
"NetworkMode": "default", "PortBindings": { "7474/tcp": [ { "HostIp": "", "HostPort": "17474" } ], "7687/tcp": [ { "HostIp": "", "HostPort": "17687" } ] }, ... "ExposedPorts": { "7473/tcp": {}, "7474/tcp": {}, "7687/tcp": {} }, ... "NetworkSettings": { "Bridge": "", "SandboxID": "5eb2b7805cc802391c08be8c85cdbb19fd42de6cc794e76e57f5214c6763c140", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "7473/tcp": null, "7474/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "17474" } ], "7687/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "17687" } ] }, ... "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "8ffa640b707301bb9b8b6c2a1cfb6f5deac8c1a5f5de9e9de0976697b01027ef", "EndpointID": "941911b65cf0b714fa13ac45ca967478a513fe5c282283aa0bfe20afcc0df06f", "Gateway": "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: Unhandled promise rejection (rejection id: 2): Error: Connection was closed by server\n","stream":"stderr","time":"2017-05-05T16:21:32.301674097Z"}
我有一个同事能够连接,但他必须使用一个粗略的第三方库,而且他无法通过 Bolt 连接,只有 7474。
最佳答案
看来该问题是由于我的个人计算机设置造成的,这解释了为什么其他人没有遇到此问题。
除了 Docker Neo4j 镜像之外,我还运行了 Neo4j 的本地版本,并且它们都使用相同的端口。
这导致连接被拒绝。
我的案例的解决方案是:
- 停止我的本地版本 Neo4j(当我启动计算机时它会自动启动)
- 然后使用任何建议的 URL 运行 docker-compose(我只使用“bolt:neo4j:,因为 Docker 镜像自动将 Bolt 映射到 7687)。
关于node.js - Bolt连接,Docker Compose + Neo4j + Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667574/