You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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自定义网络连接(推荐)

  1. 创建Docker自定义网络:
docker network create neo4j-network
  1. 启动Neo4j容器并加入该网络,指定容器名称:
docker run -d --name neo4j-container --network neo4j-network -p 7687:7687 -p 7474:7474 neo4j:4.4.7
  1. 修改Node.js代码中的连接地址,将localhost替换为Neo4j容器名称neo4j-container:
const driver = neo4j.driver('bolt://neo4j-container:7687', neo4j.auth.basic('neo4j','pwd'))
  1. 重新构建Node.js镜像并启动容器,加入同一个网络:
docker build -t node-neo4j-app .
docker run -d --network neo4j-network node-neo4j-app

方法2:使用宿主机IP地址连接

  1. 查找宿主机在Docker网络中的IP(通常为172.17.0.1,可通过ifconfig或ip addr查看docker0网卡IP)。
  2. 修改Node.js代码中的连接地址为宿主机IP:
const driver = neo4j.driver('bolt://172.17.0.1:7687', neo4j.auth.basic('neo4j','pwd'))
  1. 确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:54:22