连接不可用:尝试从 docker 应用程序连接本地托管的 Neo4j

问题描述

我有一个 neo4j 数据库 https://localhost:7474 (https://localhost:7474),我通过 py2neo 的图形对象(“bolt://127.0.0.1:7687”)连接它。如果不在 Docker 环境中,则一切正常。现在我想做的是连接到我的应用程序(使用 fastpi 构建:https://fastapi.tianGolo.com/deployment/docker/)。

我的问题是如何通过 docker 中托管的 docker 镜像(fastapi)镜像连接到本地托管(在我的 mac 中)neo4j db。

但是我收到以下错误

 docker run e7bf302e02ec


Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py",line 742,in acquire
    cx = self._free_list.popleft()
IndexError: pop from an empty deque

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/py2neo/wiring.py",line 162,in open
    s.connect(address)
ConnectionRefusedError: [Errno 111] Connection refused

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/bolt.py",line 212,in open
    wire = cls._connect(profile,on_broken=on_broken)
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/bolt.py",line 228,in _connect
    wire = Wire.open(profile.address,keep_alive=True,on_broken=on_broken)
  File "/usr/local/lib/python3.8/site-packages/py2neo/wiring.py",line 164,in open
    raise_from(WireError("Cannot connect to %r" % (address,)),error)
  File "<string>",line 3,in raise_from
py2neo.wiring.WireError: Cannot connect to IPv4Address(('127.0.0.1',7687))

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/bin/uvicorn",line 8,in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.8/site-packages/click/core.py",line 829,in __call__
    return self.main(*args,**kwargs)
  File "/usr/local/lib/python3.8/site-packages/click/core.py",line 782,in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.8/site-packages/click/core.py",line 1066,in invoke
    return ctx.invoke(self.callback,**ctx.params)
  File "/usr/local/lib/python3.8/site-packages/click/core.py",line 610,in invoke
    return callback(*args,**kwargs)
  File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py",line 362,in main
    run(**kwargs)
  File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py",line 386,in run
    server.run()
  File "/usr/local/lib/python3.8/site-packages/uvicorn/server.py",line 49,in run
    loop.run_until_complete(self.serve(sockets=sockets))
  File "/usr/local/lib/python3.8/asyncio/base_events.py",line 616,in run_until_complete
    return future.result()
  File "/usr/local/lib/python3.8/site-packages/uvicorn/server.py",line 56,in serve
    config.load()
  File "/usr/local/lib/python3.8/site-packages/uvicorn/config.py",line 308,in load
    self.loaded_app = import_from_string(self.app)
  File "/usr/local/lib/python3.8/site-packages/uvicorn/importer.py",line 20,in import_from_string
    module = importlib.import_module(module_str)
  File "/usr/local/lib/python3.8/importlib/__init__.py",line 127,in import_module
    return _bootstrap._gcd_import(name[level:],package,level)
  File "<frozen importlib._bootstrap>",line 1014,in _gcd_import
  File "<frozen importlib._bootstrap>",line 991,in _find_and_load
  File "<frozen importlib._bootstrap>",line 975,in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>",line 671,in _load_unlocked
  File "<frozen importlib._bootstrap_external>",line 783,in exec_module
  File "<frozen importlib._bootstrap>",line 219,in _call_with_frames_removed
  File "./app/main.py",in <module>
    from .database import Base
  File "./app/database.py",line 28,in <module>
    Base = Graph(DATABASE_URL,auth=(DATABASE_USERNAME,DATABASE_PASSWORD))
  File "/usr/local/lib/python3.8/site-packages/py2neo/database/__init__.py",line 358,in __init__
    self.service = GraphService(profile,**settings)
  File "/usr/local/lib/python3.8/site-packages/py2neo/database/__init__.py",line 189,in __init__
    self._connector = Connector(profile,**connector_settings)
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py",line 893,in __init__
    self.add_pools(self._profile)
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py",line 913,in add_pools
    pool = ConnectionPool.open(
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py",line 570,in open
    seeds = [pool.acquire() for _ in range(init_size or cls.default_init_size)]
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py",in <listcomp>
    seeds = [pool.acquire() for _ in range(init_size or cls.default_init_size)]
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py",line 749,in acquire
    cx = self.connect()
  File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py",line 706,in connect
    cx = Connection.open(self.profile,user_agent=self.user_agent,File "/usr/local/lib/python3.8/site-packages/py2neo/client/__init__.py",line 141,in open
    return Bolt.open(profile,user_agent=user_agent,File "/usr/local/lib/python3.8/site-packages/py2neo/client/bolt.py",line 223,in open
    raise_from(ConnectionUnavailable("Cannot open connection to %r" % profile),in raise_from
py2neo.client.ConnectionUnavailable: Cannot open connection to ConnectionProfile('bolt://neo4j@127.0.0.1:7687')

解决方法

这似乎是 docker 及其构建方式的问题。

基本上,如果您尝试从容器访问 localhost,您将访问容器的本地主机,而不是您的计算机!

这个想法是获取您网络的 docker 容器的 IP 地址并使用该地址。

以下是一些链接,根据您所在的平台显示如何操作(我也在考虑其他用户可能会找到此答案并依赖它)

localhost refuses connection with docker

How to access "http://localhost" from a Docker container in Windows?