Docker中的Spring Boot未连接到Docker中的Mongo

Posted

技术标签:

【中文标题】Docker中的Spring Boot未连接到Docker中的Mongo【英文标题】:SpringBoot in Docker not connecting to Mongo in Docker 【发布时间】:2019-11-18 04:20:14 【问题描述】:

我有一个 Spring Boot 应用程序并使用在 brew 服务中运行的 mongo db 开发它。

要获得与数据库的连接,我只需将以下内容放入 Spring Boot 中的 application.properties

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

将应用程序属性更改为

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

没有改变任何东西,和以前一样的错误。

现在我正在尝试将 SpringBoot 应用程序和 MongoDB 放入 Docker-Containers,但无法使任何连接正常工作。

这是我在 SpringBoot 应用程序中的 Dockerfile:

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 ["java", "-Dspring.data.mongodb.uri=mongodb://mongo:27017/dg","-Djava.security.egd=file:/dev/./urandom","-jar","/dg-0.0.1-SNAPSHOT.jar"]

我能够在 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 通过 localhost 自动连接到 mongo,还需要排除 MongoAutoConfiguration!

@SpringBootApplication(exclude=MongoAutoConfiguration.class)

谢谢大家的帮助

【问题讨论】:

Can't Connect Mongodb to Springboot Container in docker的可能重复 老兄,非常感谢。对我来说,我只需要在application.properties 中指定docker_mongo 即可使其正常工作。没有hostname: 【参考方案1】:

试试下面的docker-compose.ymlhostname 应该可以解决您的问题

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

【讨论】:

【参考方案2】:

尽量不要定义 Mongo 的端口。

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

【讨论】:

【参考方案3】:

编辑:

我从来没有做过spring-boot开发,但是你说的显示的错误很可能与mongo问题无关。但是,这里解释了您的 mongo 连接失败的原因:


docker-compose 如果未在文件中指定虚拟网络(如您的情况),则会创建一个虚拟网络。

您的所有应用程序都在此网络内运行,彼此完全隔离。因此,您的 spring-boot 容器中的 localhost 实际上是指它自己。这意味着您的 spring-boot 应用程序期望 mongo 实例在其容器内运行(它不是,它在不同的容器中)。

当数据库和应用程序都在笔记本电脑的网络上运行时,这会很好。但如前所述,它们现在完全隔离在 docker-compose 网络中运行。

不过,docker-compose 真的很聪明!它为您的每个容器创建一个 DNS,该 DNS 使用在您的 docker-compose 文件中指定的服务名称(在您的情况下为 mongospring),以便轻松访问网络内部的容器。

因此,您应该能够将 spring.data.mongodb.uri=mongodb://localhost:27017/db 更改为 spring.data.mongodb.uri=mongodb://mongo:27017/db 并且应该允许它连接。

【讨论】:

以上是关于Docker中的Spring Boot未连接到Docker中的Mongo的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 应用程序未连接到 Mongodb 的 application.property 中指定的数据库

Spring Boot无法连接到同一网络的docker中的mysql

Spring Boot 应用程序无法连接到 Docker 中的 Redis 副本

Spring boot JDBC无法连接到docker容器中的mysql

Docker 中的 Postgres 服务器无法连接到 Spring Boot 应用程序

Angular 无法连接到 docker compose 中的 Spring Boot 端点