奇怪的neo4j-shell问题在docker实例中连接到Neo4j

时间:2015-03-10 21:40:16

标签: neo4j

我有一个非常奇怪的问题,连接到在docker实例中运行的Neo4j实例。但首先,这是我的设置:

一切都在MacOS上运行。我使用boot2docker,因此实际的Docker实例在VirtualBox中运行。我可以用Neo4j 2.1.5和Neo4j 2.2.0-M04重现这个问题。 另外,我通过自制软件在本地安装了Neo4j,版本为2.1.7。它安装有一个neo4j-shell可用。 可以从外部通过192.168.59.104访问docker实例。 docker实例本身具有172.17.0.x IP地址。

问题: 我尝试连接neo4j-shell,如下所示:neo4j-shell -v -host 192.168.59.104 -port 1337 -name shell。几分钟后,它失败了:

ERROR (-v for expanded information):
    Connection refused
java.rmi.ConnectException: Connection refused to host: 172.17.0.2; nested exception is:
    java.net.ConnectException: Operation timed out
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at com.sun.proxy.$Proxy1.welcome(Unknown Source)
    at org.neo4j.shell.impl.AbstractClient.sayHi(AbstractClient.java:215)
    at org.neo4j.shell.impl.RemoteClient.findRemoteServer(RemoteClient.java:63)
    at org.neo4j.shell.impl.RemoteClient.<init>(RemoteClient.java:55)
    at org.neo4j.shell.impl.RemoteClient.<init>(RemoteClient.java:43)
    at org.neo4j.shell.ShellLobby.newClient(ShellLobby.java:165)
    at org.neo4j.shell.StartClient.startRemote(StartClient.java:297)
    at org.neo4j.shell.StartClient.start(StartClient.java:175)
    at org.neo4j.shell.StartClient.main(StartClient.java:120)
Caused by: java.net.ConnectException: Operation timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:211)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
    ... 14 more

有趣的是,它通过尝试连接172.17.0.2而不是提供的IP地址而失败。

到目前为止我做了什么:

  • 仔细检查neo4j.properties是否正确
    • remote_shell_host=0.0.0.0已设置
    • remote_shell_port=1337已设置
  • 使用docker ps检查端口是否正确显示:
    CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS              PORTS                                            NAMES
    099cfd1b8018        daneroo/neo4j:latest   "/bin/bash -c /launc   3 minutes ago       Up 3 minutes        0.0.0.0:1337->1337/tcp, 0.0.0.0:7474->7474/tcp   neo4j
    
  • 一些Google和SO搜索,但没有任何成功。
  • 不同的neo4j版本和泊坞窗图片
  • 使用telnet 192.168.59.104 1337进行基本连接检查。这很成功。
  • 在今天的neo4j聚会上赶上Mark Needham

那么,我会错过什么吗?从理论上讲,每次你通过另一个IP地址访问Neo4j时都会发生这种情况,而不是Neo4j实例可以看到的(例如,如果你在家里运行Neo4j实例,在IP19.168.xy的机器上,你试图通过你的公共访问它你现在的IP)。 在Neo4j环境之外运行的客户端从哪里获取内部IP地址?有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为它可能与shell用来与Neo4j通信的RMI协议有关。 Afaik RMI还使用了一些额外的端口,它可能会重定向初始请求。 Java中有一个系统属性,您可能希望尝试在neo4j-wrapper.conf中设置:-Djava.rmi.server.hostname=192.168.59.104

请参阅: