Docker容器内Node.js应用的Neo4j-driver无法连接Neo4j容器求助
问题:Docker容器内Node.js应用无法连接同主机的Neo4j容器
我在一个Docker容器运行Neo4j 4.4.7,另一个容器运行Node.js应用(依赖neo4j-driver 4.4.7)。应用在Docker外运行能正常连接Neo4j,但容器内运行时连接失败。以下是相关代码、Dockerfile和日志:
应用代码 app_test_neo4j.js
const http = require('http'); const neo4j = require('neo4j-driver'); // neo4j-driver version 4.7.7 const koa = require('koa'); const driver = neo4j.driver('bolt://localhost:7687', neo4j.auth.basic('neo4j','pwd')) const test = async ()=>{ try { await driver.verifyConnectivity() console.log('Driver created') } catch (error) { console.log(`connectivity verification failed. ${error}`) } const session = driver.session() try { let res = await session.run('RETURN 1',{}) console.log('res records='+JSON.stringify(res.records)); } catch (error) { console.log(`unable to execute query. ${error}`) } finally { await session.close() } // ... on application exit: await driver.close() } test();
Dockerfile
FROM node:18.4-alpine3.16 AS package RUN addgroup geo && \ adduser -D -G geo -h /home/geo -s /bin/ash geo && \ chmod 755 /home/geo && \ echo 'geo ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers # Set the working directory to geo' user home directory WORKDIR /home/geo # Specify the user to execute all commands below USER geo ADD . . EXPOSE 8080 7867 CMD ["node", "app_test_neo4j.js"]
运行日志
外部运行成功日志
$ node app_test_neo4j.js Driver created res records=[{"keys":["1"],"length":1,"_fields":[{"low":1,"high":0}],"_fieldLookup":{"1":0}}]
容器内运行失败日志
Successfully built e125b52e147c $ docker run -it -d -p 8080:8080 e125b52e147c c74971794be9c26af6e4d491d76b99a249a718b3b2c268a6499c98b574fe4178 $ docker logs c74971794be9c26af6e4d491d76b99a249a718b3b2c268a6499c98b574fe4178 connectivity verification failed. Neo4jError: Failed to connect to server. Please ensure that your database is listening on the correct host and port and that you have compatible encryption settings both on Neo4j server and driver. Note that the default encryption setting has changed in Neo4j 4.0. Caused by: connect ECONNREFUSED 127.0.0.1:7687
解决方案
问题根源
容器内的localhost指向容器自身的网络栈,而非宿主机的网络。Node.js容器尝试连接自己的7687端口,但该端口未运行Neo4j服务,导致连接被拒绝。
修复步骤
方法1:使用Docker自定义网络连接(推荐)
- 创建Docker自定义网络:
docker network create neo4j-network
- 启动Neo4j容器并加入该网络,指定容器名称:
docker run -d --name neo4j-container --network neo4j-network -p 7687:7687 -p 7474:7474 neo4j:4.4.7
- 修改Node.js代码中的连接地址,将
localhost替换为Neo4j容器名称neo4j-container:
const driver = neo4j.driver('bolt://neo4j-container:7687', neo4j.auth.basic('neo4j','pwd'))
- 重新构建Node.js镜像并启动容器,加入同一个网络:
docker build -t node-neo4j-app . docker run -d --network neo4j-network node-neo4j-app
方法2:使用宿主机IP地址连接
- 查找宿主机在Docker网络中的IP(通常为
172.17.0.1,可通过ifconfig或ip addr查看docker0网卡IP)。 - 修改Node.js代码中的连接地址为宿主机IP:
const driver = neo4j.driver('bolt://172.17.0.1:7687', neo4j.auth.basic('neo4j','pwd'))
- 确保Neo4j容器已映射7687端口到宿主机(启动命令包含
-p 7687:7687),再重新构建并启动Node.js容器。
方法3:使用host网络模式(不推荐)
启动Node.js容器时添加--network host参数,让容器直接使用宿主机网络栈:
docker run -d --network host node-neo4j-app
此时代码中的localhost会指向宿主机,无需修改连接地址。但该方式会破坏容器网络隔离性,不建议生产环境使用。
内容的提问来源于stack exchange,提问作者HieroB
相关产品推荐
相关产品推荐

