连接 MongoDB Docker 容器时出现 com.mongodb.MongoSocketOpenException 错误

4

我有一个sbt项目,其中包含mongodb代码。我正在制作这个sbt项目的自定义镜像,并使用mongodb:2.6.11 公共docker镜像。https://hub.docker.com/_/mongo

这是我的sbt项目的docker文件:

FROM hseeberger/scala-sbt:11.0.2_2.12.8_1.2.8 as stripecommon

MAINTAINER sara <sarawaheed3191@gmail.com>

WORKDIR /myproject

ADD myprojectcode .

CMD ["sbt","reload","clean","compile","run"] 

这里是mongodb镜像mongodb:2.6.11的dockerfilehttps://github.com/ky13R/mongo-2.6.11-docker-image/blob/master/Dockerfile

这是我如何运行我的容器

docker create network mynetwork

启动 MongoDB 容器

docker run -p 27017 --network mynetwork mongo:2.6.11

启动我的项目容器

docker run --network mynetwork myproject:v1

我的项目无法连接到 MongoDB 服务器,以下是异常日志:

com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.connection.SocketStream.open(SocketStream.java:63)
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:114)
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:128)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
    at java.base/java.net.Socket.connect(Socket.java:591)
    at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:50)
    at com.mongodb.connection.SocketStream.open(SocketStream.java:58)
    ... 3 common frames omitted

我已经按照这个教程连接到了 MongoDB 服务器 https://dzone.com/articles/using-docker-to-shove-an-existing-application-into 但是我在哪里出错了?

连接 MongoDB 服务器的代码如下:

private val DATABASE:String   = config.getString("db.dbname")
  private val SERVER:ServerAddress = {
      val hostName=config.getString("db.hostname")
      val port=config.getString("db.port").toInt
    new ServerAddress(hostName,port)
      } 
  val connectionMongo = MongoClient(SERVER)
  log.debug("mongo connection created "+connectionMongo)
  def collectionMongo(name:String) = connectionMongo(DATABASE)(name)
  log.debug("getting collection from mongodb")
} 

这里是配置文件。

db.url="mongodb://Localhost:27017"
db.hostname="Localhost"
db.dbname=testdb
db.port=27017
1个回答

2
问题在于你正在使用 localhost 作为 db.urldb.hostname。 localhost 指的是 Docker 容器中的应用程序,而不是主机。你可以将MongoDB容器命名为具体名称,像这样启动:

问题在于您正在为db.urldb.hostname使用localhost。 localhost指的是Docker容器中的应用程序,而不是主机机器。您可以使用具体的名称启动MongoDB容器,例如:

docker run -p 27017 --name mongodb --network mynetwork mongo:2.6.11

请在您的应用程序中使用以下配置:

并使用以下配置:

最初的回答
db.url="mongodb://mongodb:27017"
db.hostname="mongodb"
db.dbname=testdb
db.port=27017

在你的Docker网络(mynetwork)中,可以通过容器名称(这里是mongodb)访问数据库容器。
希望我能帮到你。 编辑: 另一种(更简单)解决方法是“链接”容器。这样做,您无需事先创建网络。 如何做到呢? 启动您的mongo数据库:
docker run -p 27017 --name mongodb mongo:2.6.11

启动你的应用程序并链接到之前创建的mongo-db容器:

docker run --link mongodb myproject:v1

我收到了相同的异常。 - swaheed
0:08:47.533 12894 [cluster-ClusterId{value='5cde882e46e0fb0062fea051', description='null'}-mongodb:27017] cluster INFO - 监视线程连接至服务器 mongodb:27017 时发生异常 com.mongodb.MongoSocketException: mongodb: 名称或服务未知 - swaheed
嗯,这是我无法回答的问题。如果我例如启动一个Ubuntu容器docker run --link mongodb --rm -it ubuntu:latest bash并执行netcat -v mongodb 27017(在使用apt安装后),我会得到一个连接:mongodb [172.17.0.2] 27017 (?) open。在容器内部,netcatJava解析主机名的方式肯定有所不同。 - Florian Schlag
那我应该在自定义镜像中安装MongoDB,而不是使用它在Docker Hub上的公共镜像吗? - swaheed
我认为错误不是来自mongodb镜像。Java使用不同的方式来解析主机名,而不是标准的Linux工具。也许你可以在Dockerfile中添加解决方案:https://dev59.com/r4_ea4cB1Zd3GeqPJAoq#32550032 - Florian Schlag

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