SpringBoot在Docker中无法连接Docker中的Mongo。

8

我有一个基于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容器中,但无法使它们连接成功。

这是我在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的Entrypoint中,我能够成功连接到数据库而不需要上面提到的那行代码。我猜这是如果你想通过"链接"连接数据库时的情况。

但现在我能够通过网络连接了,这是我的代码:

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,还需要排除MongoAutoConfiguration!

@SpringBootApplication(exclude={MongoAutoConfiguration.class})

感谢大家的帮助。

可能是无法在Docker中将Mongodb连接到Springboot容器的重复问题。 - David Maze
兄弟,非常感谢。对我来说,只需要在application.properties中指定docker_mongo就可以让它工作了,不需要hostname: - chill appreciator
3个回答

6

编辑:

我从来没有做过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,这样就可以连接了。


由于:java.net.UnknownHostException: mongo - undefined

1
尝试使用以下的 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
尝试不定义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

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