com.mongodb.MongoSocketOpenException: при подключении к Docker-контейнеру Mongodb - PullRequest
3 голосов
/ 16 мая 2019

У меня есть проект sbt, в котором есть код mongodb. Я делаю собственное изображение для этого проекта sbt и использую mongodb:2.6.11 общедоступное изображение докера https://hub.docker.com/_/mongo

вот файл docker моего проекта sbt

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"] 

а вот dockerfile изображения mongodb: 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 Ответ

1 голос
/ 16 мая 2019

Проблема в том, что вы используете localhost для db.url и db.hostname. Локальный хост ссылается на 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

В вашей докерной сети (mynetwork) контейнер базы данных доступен по имени контейнера (здесь mongodb)

Надеюсь, я смогу помочь.

Edit:

Другой (более простой) способ решить эту проблему - «связать» контейнеры. При этом вам не нужно заранее создавать сеть.

Как это сделать?

Запустите вашу базу данных Монго:

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

Запустите ваше приложение и создайте ссылку на ранее созданный контейнер mongo-db:

docker run --link mongodb myproject:v1
...