SpringBoot в Docker не подключается к Mongo в Docker - PullRequest
1 голос
/ 08 июля 2019

У меня есть приложение Spring Boot, и я разработал его с помощью базы данных mongo, которая работала в сервисах brew.

Чтобы получить соединение с БД, мне просто нужно было поместить следующее в application.properties в Spring Boot

spring.data.mongodb.uri=mongodb://localhost:27017/db

изменение свойств приложения на

spring.data.mongodb.uri=mongodb://mongo:27017/db

ничего не изменил, ошибка та же, что и раньше.

Теперь я пытаюсь поместить приложение SpringBoot и MongoDB в Docker-контейнеры, но не могу заставить работать любое соединение.

Итак, это мой Dockerfile в приложении SpringBoot:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
EXPOSE 8080
ADD /build/libs/dg-0.0.1-SNAPSHOT.jar dg-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/dg-0.0.1-SNAPSHOT.jar"]

Это мой файл Docker-Compose.yml:

version: '3'

services:

mongo:
 container_name: docker-mongo
 image: mongo:latest
 ports:
   - "27017:27017"
 volumes:
  - ./data/db:/data/db

spring:
 depends_on:
   - mongo
 image:
   docker-spring-http-alpine
 ports:
   - "8080:8080"
 links:
   - mongo

После выполнения Docker-Compose с помощью

docker-compose up

Я получаю следующую ошибку: (это фактическое сообщение об ошибке)

2019-07-08 23:10:19.990  INFO 1 --- [localhost:27017] org.mongodb.driver.cluster: Exception in monitor thread while connecting to server localhost:27017


    com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67) ~[mongodb-driver-core-3.8.2.jar!/:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongodb-driver-core-3.8.2.jar!/:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.8.2.jar!/:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_212]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_212]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_212]
at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) ~[mongodb-driver-core-3.8.2.jar!/:na]
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:62) ~[mongodb-driver-core-3.8.2.jar!/:na]
... 3 common frames omitted

Кто-нибудь знает, в чем здесь проблема? В среде разработки это работает как шарм.

Заранее спасибо

Добавление следующей строки в Dockerfile

"-Dspring.data.mongodb.uri=mongodb://mongo:27017/dg"

в Entrypoint, как это решило проблему подключения

ENTRYPOINT ["java", "-Dspring.data.mongodb.uri=mongodb://mongo:27017/dg","-Djava.security.egd=file:/dev/./urandom","-jar","/dg-0.0.1-SNAPSHOT.jar"]

Мне удалось установить соединение с БД без указанной выше строки в Entrypoint в Dockerfile. Я думаю, это если вы хотите подключить свою БД через "ссылки"

Но теперь я смог подключиться по сети, это мой код:

version: '3.6'

services:

 mongo:
 container_name: docker_mongo
 networks:
   - gateway
 ports:
   - "27017:27017"
 hostname: mongo
 image: mongo:latest
 volumes:
   - ./data/db:/data/db

 spring:
 container_name: docker-spring
 networks:
   - gateway
 ports:
   - "8080:8080"
 hostname: spring
 depends_on:
   - mongo
 image: dg-docker-spring-http-alpine-j
 networks:
gateway:
driver: "bridge"

и следующие в свойствах приложения

spring.data.mongodb.host=docker_mongo
spring.data.mongodb.port=27017
spring.data.mongodb.database=db

Похоже, теперь соединение работает по сети. Тот же код не работал с версией 3.0

Чтобы запретить SpringBoot автоматически подключаться к mongo через localhost, также необходимо исключить MongoAutoConfiguration!

@SpringBootApplication(exclude={MongoAutoConfiguration.class})

Спасибо всем за помощь

Ответы [ 4 ]

3 голосов
/ 08 июля 2019

РЕДАКТИРОВАТЬ:

Я никогда не занимался весенней загрузкой, но ошибка, о которой вы говорите, отображается, вполне может быть не связана с проблемой монго.Однако, вот объяснение того, почему ваше монго-соединение не работает:


docker-compose создает виртуальную сеть, если она не была указана в файле (как в вашем случае).

Все ваши приложения работают внутри этой сети, полностью изолированные друг от друга.Таким образом, localhost в вашем подпружиненном контейнере фактически ссылается на себя.Это означает, что ваше подпружиненное приложение ожидает, что экземпляр mongo будет запущен внутри своего контейнера (а это не так, он находится в другом контейнере).

Это было бы хорошо, если бы база данных и приложение былиработает в сети вашего ноутбука.Но, как уже упоминалось, они теперь работают в сети docker-compose в полной изоляции.

Однако, docker-compose действительно умный!Он создает DNS для каждого из ваших контейнеров, который использует имя службы (в вашем случае mongo и spring), указанное в вашем файле docker-compose, чтобы обеспечить легкий доступ к контейнерам внутри сети.

Итак, вы должны иметь возможность изменить spring.data.mongodb.uri=mongodb://localhost:27017/db на spring.data.mongodb.uri=mongodb://mongo:27017/db, и это должно позволить ему подключаться.

0 голосов
/ 11 июля 2019

Попробуйте следующее docker-compose.yml.hostname должен решить вашу проблему

version: '3'
services:
  mongo:
    container_name: docker-mongo
    image: mongo:latest
    ports:
     - "27017:27017"
    volumes:
     - ./data/db:/data/db
    hostname: mongo

 spring:
   depends_on:
    - mongo
   image:docker-spring-http-alpine
   ports:
    - "8080:8080"
   hostname: spring
   links:
    - mongo
0 голосов
/ 09 июля 2019

Попробуйте не определять порты Монго.

version: '3'

services:

mongo:
 container_name: docker-mongo
 image: mongo:latest
 volumes:
  - ./data/db:/data/db

spring:
 depends_on:
   - mongo
 image:
   docker-spring-http-alpine
 ports:
   - "8080:8080"
 links:
   - mongo
0 голосов
/ 09 июля 2019

Если вы используете container name в качестве имени хоста для подключения к mongodb, то ваш контейнер приложения и mongodb контейнер должны находиться в одной сети.

В вашем файле docker-compose.yml вы создаете общую сеть для обоих контейнеров и присоединяете их к этой недавно созданной сети для поиска.

mongo:
 container_name: docker-mongo #If this still not works, try using this name as the mongodb hostname.
 image: mongo:latest
 ports:
   - "27017:27017"
 volumes:
  - ./data/db:/data/db
 networks:
  - my-net

spring:
 depends_on:
   - mongo
 image: docker-spring-http-alpine
 ports:
   - "8080:8080"
 networks:
   - my-net

networks:
  my-net:

Вы должны использовать имя контейнера в качестве имени хоста, даже если ваши контейнеры находятся в одной сети. Поэтому попробуйте каждый раз использовать имена контейнеров, если у вас есть свойство container_name. Также проверьте встроенный комментарий.

UPDATE:

Свойства подключения MongoDB для application.properties файла.

# MongoDB
spring.data.mongodb.host=<container_name>
spring.data.mongodb.port=27017
spring.data.mongodb.database=app1

Это минимальные настройки подключения, необходимые для подключения MongoDB. Ваше host должно быть именем контейнера, если ваши контейнеры находятся в одной сети.

...