从另一个容器访问Neo4J



我正在docker容器中运行一个neo4j图形数据库。我在Go中编写了另一个服务,它应该能够从相应的容器中执行查询。然而,我无法建立这两个容器之间的联系。

我的数据库的dockerfile

version: "3"
services:
neo4j-db:
image: neo4j:latest
ports:
- "7474:7474"
- "7473:7473"
- "7687:7687"
expose:
- 7474
networks:
app_net:
ipv4_address: 172.18.18.10
volumes:
- //C/Users/<user>/Desktop/neoj4/4.0/config:/conf
networks:
app_net:
driver: bridge
driver_opts:
com.docker.network.enable_ipv6: "false"
ipam:
driver: default
config:
- subnet: 172.18.18.0/24

我的neo4j.conf:

dbms.connector.https.advertised_address=localhost:7473
dbms.default_listen_address=0.0.0.0
dbms.connector.http.advertised_address=localhost:7474
dbms.memory.pagecache.size=512M
dbms.connector.bolt.advertised_address=127.18.18.10:7687
dbms.tx_log.rotation.retention_policy=100M size
dbms.directories.logs=/logs

最后在我的Go容器中:

uri := "bolt://127.18.18.10:7687"
username := "neo4j"
password := "test" 
var (
err      error
driver   neo4j.Driver
session  neo4j.Session
result   neo4j.Result
greeting interface{}
)
fmt.Println("Connecting to Neo4j")
driver, err = neo4j.NewDriver(uri, neo4j.BasicAuth(username, password, ""), useConsoleLogger(neo4j.ERROR))
if err != nil {
fmt.Println("ERROR:" , err)
}
defer driver.Close()
fmt.Println("Getting Session")
session, err = driver.Session(neo4j.AccessModeWrite)
if err != nil {
fmt.Println("ERROR:" , err)
}
defer session.Close()

当调用函数时,执行在fmt.Println("Getting Session")之后停滞30秒,没有抛出任何错误,然后简单地终止。

我还确保两个容器都在同一个网络上(app_net(。我可以毫无问题地在集装箱之间来回穿梭。然而,尝试从go容器到neo4j的telnet会产生Unable to connect to remote host: Connection refused

我不确定我做错了什么。在neo4j上进行浏览器访问是可行的,据我所见,容器位于同一网络上。

任何建议或想法都将不胜感激。

在花了一些额外的时间之后,我设法使它工作起来。我采取了以下步骤:

  1. 使用容器的主机名作为uri(即"bolt://container_name"(
  2. 删除加密以防止TLS错误:
if driver, err = neo4j.NewDriver(uri, neo4j.BasicAuth(username, password, ""), func(config *neo4j.Config) {
config.Log = neo4j.ConsoleLogger(neo4j.ERROR)
config.Encrypted = false
}); err != nil {
return err
}
defer driver.Close()

最新更新