com.mongodb.MongoSocketOpenException:连接到mongodb docker容器时

时间:2019-05-16 11:07:12

标签: mongodb docker mongodb-java

我有一个带有mongodb代码的sbt项目,我正在为此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映像的dockerfile mongodb:2.6.11 https://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 我在这里做错了什么?

连接到mongo服务器的代码是

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 个答案:

答案 0 :(得分:0)

问题是您在localhostdb.url中使用db.hostname。 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