Neo4j Docker连接失败

4

我在尝试运行neo4j代码时遇到连接问题;在docker外部工作正常,但在docker内部无法建立与neo4j数据库的连接。

错误信息:

    Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/neobolt/direct.py", line 835, in _connect
    s.connect(resolved_address)
OSError: [Errno 99] Cannot assign requested address

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    driver = GraphDatabase.driver(uri, auth=("neo4j", "admin"))
  File "/usr/local/lib/python3.7/site-packages/neo4j/__init__.py", line 116, in driver
    return Driver(uri, **config)
  File "/usr/local/lib/python3.7/site-packages/neo4j/__init__.py", line 157, in __new__
    return subclass(uri, **config)
  File "/usr/local/lib/python3.7/site-packages/neo4j/__init__.py", line 231, in __new__
    pool.release(pool.acquire())
  File "/usr/local/lib/python3.7/site-packages/neobolt/direct.py", line 719, in acquire
    return self.acquire_direct(self.address)
  File "/usr/local/lib/python3.7/site-packages/neobolt/direct.py", line 612, in acquire_direct
    connection = self.connector(address, error_handler=self.connection_error_handler)
  File "/usr/local/lib/python3.7/site-packages/neo4j/__init__.py", line 228, in connector
    return connect(address, **dict(config, **kwargs))
  File "/usr/local/lib/python3.7/site-packages/neobolt/direct.py", line 976, in connect
    raise last_error
  File "/usr/local/lib/python3.7/site-packages/neobolt/direct.py", line 966, in connect
    s = _connect(resolved_address, **config)
  File "/usr/local/lib/python3.7/site-packages/neobolt/direct.py", line 847, in _connect
    raise ServiceUnavailable("Failed to establish connection to {!r} (reason {})".format(resolved_address, error))
neobolt.exceptions.ServiceUnavailable: Failed to establish connection to ('::1', 11010, 0, 0) (reason [Errno 99] Cannot assign requested address)

我使用的代码如下:

from neo4j import GraphDatabase
uri = "bolt://localhost:11010/"
driver = GraphDatabase.driver(uri, auth=("neo4j", "admin"))
with driver.session() as session:
    result = session.run("MATCH (n) RETURN count(n)")
    print(result)
    session.close()

我的Bolt端口号为11010,就像代码中写的那样。这里有什么遗漏吗?我尝试了以下操作,但没有成功:

1)使用127.0.0.1代替localhost
2)关闭会话

我的Docker文件如下:

FROM python:3
ADD test.py /
RUN pip install pandas
RUN pip install pymysql
RUN pip install sqlalchemy
RUN pip install neo4j
CMD ["python","test.py"]

你在哪里运行Neo4j数据库? - Adiii
本地机器本身以及在本地运行的Docker @Adiii - Jack Daniel
这有帮助吗? - Adiii
2个回答

2

根据评论,我假设neo4j数据库正在其他容器中运行。

您无法使用URL localhost从一个容器连接到另一个容器。

本地主机名总是指当前容器的本地主机名,而不是其他容器(例如B)的本地主机名。

因此,有以下可能的替代方案和解决方案:

  • 如果两个容器都在运行,则可以使用Docker-compose,并且您将能够通过容器名称像neo4j:port这样访问neo4j数据库。
  • 如果neo4j在主机上运行,则需要在python容器内部使用主机IP来访问neo4j。
  • 如果您不想使用docker-compose,则可以使用旧版的链接功能。
 docker run -d -P --name web --link newdb:db training/webapp python app.py

现在您可以在Python容器内使用db作为主机引用它。

可以使用这些设置连接MYSQL,但无法连接Neo4j。而且Neo4j在主机上,我正在使用IP进行连接。但是连接失败了。 - Jack Daniel
你需要承载IP本地IP,例如192.*.,它应该可以工作。同时,你也可以从容器中使用telnet命令连接到new4g端口。 - Adiii
不仅仅是本地,我还在另一台服务器上运行了一个Neo4j。我正在使用那个IP地址。同样的代码在没有使用Docker的情况下也可以正常工作。 - Jack Daniel
然后telnet服务器的端口,或者连接字符串是否正确? - Adiii

2

如果您正在容器内运行Python,请使用以下命令:

    GraphDatabase.driver(host="<contaniner>", auth=basic_auth("neo4j", "myPass"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接