Mongodb + SpringBoot REST API + Docker Compose 不工作

Posted

技术标签:

【中文标题】Mongodb + SpringBoot REST API + Docker Compose 不工作【英文标题】:Mongodb + SpringBoot REST API + Docker Compose not working 【发布时间】:2021-10-18 03:59:52 【问题描述】:

我正在尝试使用 docker-compose 来运行我的 Springboot REST API,它使用 Mongo 作为数据库,但我收到以下错误。有人可以帮我解决这个问题吗?

当我的 spring-boot 应用程序尝试通过 Docker 容器连接到 MongoDB 时,它给了我一些问题。 Spring-boot 似乎无法连接到端口 27017 上的 MongoDB。

下面是部分代码和异常。

DockerFile

FROM adoptopenjdk/openjdk11:alpine-jre
ARG JAR_FILE=target/*.jar
COPY $JAR_FILE app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

Docker-Compose.yml


version: '3.8'

services:

      sprintpoker-springboot-container:
            image: sprintpoker-springboot
            build:
                  context: ./
                  dockerfile: Dockerfile
            volumes:
                  - /data/sprintpoker-springboot-container
            ports:
                  - 8080:8080
            depends_on:
                  - mongo

      mongo:
            image: mongo
            container_name: mongodb
            ports:
                  - 27017:27017
            volumes:
                  - data:/data
            environment:
                  MONGO_INITDB_ROOT_USERNAME: rootuser
                  MONGO_INITDB_ROOT_PASSWORD: rootpass

      mongo-express:
            image: mongo-express
            restart: always
            ports:
                  - 8081:8081
            environment:
                  ME_CONFIG_MONGODB_ADMINUSERNAME: rootuser
                  ME_CONFIG_MONGODB_ADMINPASSWORD: rootpass
                  ME_CONFIG_MONGODB_SERVER: mongo
volumes:
      data: 
networks:
      default:
            name: mongodb_network

我用来运行 docker 的命令:

docker-compose up -d --build --force-recreate --renew-anon-volumes

spring-boot docker 容器异常:

2021-08-16 03:16:02.453 INFO 1 --- [ main] org.mongodb.driver.cluster : Cluster created with settings hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms'

2021-08-16 03:16:02.545 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:70) ~[mongodb-driver-core-4.2.3.jar!/:na]

at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:143) ~[mongodb-driver-core-4.2.3.jar!/:na]

at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:188) ~[mongodb-driver-core-4.2.3.jar!/:na]

at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144) ~[mongodb-driver-core-4.2.3.jar!/:na]

at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]

Caused by: java.net.ConnectException: Connection refused (Connection refused)

at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]

at java.base/java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[na:na]

at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[na:na]

at java.base/java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[na:na]

at java.base/java.net.SocksSocketImpl.connect(Unknown Source) ~[na:na]

at java.base/java.net.Socket.connect(Unknown Source) ~[na:na]

at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:107) ~[mongodb-driver-core-4.2.3.jar!/:na]

at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[mongodb-driver-core-4.2.3.jar!/:na]

at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-4.2.3.jar!/:na]

... 4 common frames omitted

application.properties

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.username=rootuser
spring.data.mongodb.password=rootpass
spring.data.mongodb.database=sprint
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost
spring.data.mongodb.auto-index-creation=true

谢谢!

【问题讨论】:

能不能也分享一下spring boot sn -p,你在哪里配置spring boot连接mongodb? 根据错误,spring 使用的是 localhost:27017,因此尝试连接到自己,而不是mongo:27017,另一个容器 @RafafTahsin 我正在使用 JPA,所以你想让我分享 application.properties 文件吗? @OneCricketeer 我不明白,你在说哪一行。 他的意思是2021-08-16 03:16:02.545 INFO 1 --- [localhost:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server localhost:27017。地址应该是mongo:27017 【参考方案1】:

你的错误在这里

2021-08-16 03:16:02.545 INFO 1 --- [localhost:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server localhost:27017

Spring 应用容器没有在端口 27017 上运行任何东西,更不用说 MongoDB 服务器了。

改变

spring.data.mongodb.host=localhost

spring.data.mongodb.host=mongo

【讨论】:

我试过这样做,仍然得到同样的错误:``` 2021-08-18 04:51:33.254 INFO 1 --- [main] org.mongodb.driver.cluster : Cluster created设置 hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms' 2021-08-18 04:51:33.366 INFO 1 --- [localhost:27017] org.mongodb。 driver.cluster :连接到服务器 localhost:27017 com.mongodb.MongoSocketOpenException 时监控线程中的异常:在 com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) 处打开套接字时出现异常 ~[mongodb-driver-core -4.2.3.jar!/:na] ``` 请看***.com/a/34373673/2308683【参考方案2】:

感谢@OneCricketeer 和@Michał Krzywański (Mongodb connection error though docker in springboot),我能够解决问题。

解决方案: 在 docker-compose 文件中添加以下行:

environment:
      - SPRING_DATA_MONGODB_.HOST=mongo

 expose:
                  - 27017

【讨论】:

【参考方案3】:
    Application.yaml / 属性文件
spring:
        data:
          mongodb:
            database: test
            host: mymongodb
            port: 27017
        spring.data.mongodb.port=27017
        spring.data.mongodb.host=<mongo-image-name>
        spring.data.mongodb.database=<any-database-name>
    创建 mongo 图像:-

docker pull mongo:最新

    停止本地 Mongo 服务,因为它在同一端口上运行

    运行 docker 镜像:-

docker run -d -p 27017:27017 --name mymongodb mongo:latest --mymongodb 是容器名称,将是 yaml 或属性中的主机名 文件

    DockerFile 示例:-
FROM openjdk:11
      ADD target/springboot-mongo-docker.jar app.jar
      EXPOSE 8080
      ENTRYPOINT ["java","-jar","app.jar"]

    构建 jar:- mvn clean install

    构建 Docker 镜像:- docker build -t springboot-mongodb:1.0 .

    按如下方式运行链接容器:-

docker run -p 8080:8080 --name springboot-mongodb --link mymongodb:mongo -d springboot-mongodb:1.0

    docker-compose.yml :-

码头工人组成

> version: "3"      
     services:       mymongodb:
>          image: mongo:latest
>          container_name: "mymongodb"
>          ports:
>            - 27017:27017       springboot-mongodb:
>          image: springboot-mongodb:1.0
>          container_name: springboot-mongodb
>          ports:
>            - 8080:8080
>          links:
>            - mymongodb

【讨论】:

以上是关于Mongodb + SpringBoot REST API + Docker Compose 不工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Data MongoDB 的 Rest API - 存储库方法不起作用

使用spring boot在mongodb中进行多个搜索查询

如何在 Spring Boot 中从 mongodb 更改 geojson (GeoJsonPolygon) 的编组?

Mongodb监控

MongoDB 警告:--rest 是在没有 --httpinterface 的情况下指定的

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