通过 Spring Boot 应用程序连接到 Docker Compose MongoDb

Posted

技术标签:

【中文标题】通过 Spring Boot 应用程序连接到 Docker Compose MongoDb【英文标题】:Connect To Docker Compose MongoDb Via Spring boot application 【发布时间】:2020-04-07 09:08:24 【问题描述】:

我的网络应用无法连接到 MongoDB 容器

这是我的 application.yml

spring:
  data:
    mongodb:
      uri: mongodb://mongo:27017
      host: mongo
      port: 27017
      database: my-db-name

这是我的 Docker-Compose

version: "3"
services:

  java:
    build:
      context: ./
    ports:
      - "8080:8080"
    links:
      - mongo
    depends_on:
      - mongo
    networks:
      - shared-net

  mongo:
    image: 'mongo'
    ports:
      - 27017:27017
    hostname: mongo
    volumes:
      - ./data/db:/data/db
    networks:
      - shared-net

networks:
  shared-net:
    driver: bridge

这是为运行 java 编写的 Dockerfile

FROM openjdk:11
COPY ./code/lemon-backend/target/lemon-0.0.1-SNAPSHOT.jar /usr/src/
WORKDIR /usr/src/
EXPOSE 8080
CMD ["java", "-jar", "lemon-0.0.1-SNAPSHOT.jar"]

我什至无法使用这些选项构建应用程序 我得到了这个例外:

org.mongodb.driver.cluster: Exception in monitor thread while connecting to server mongo:27017

如果可能,请尝试使用 docker-compose 提供解决方案,谢谢

【问题讨论】:

这种情况的常见原因是应用程序在数据库完全准备好之前启动;而 Compose 将启动服务,以便它知道何时“准备好”。如果你再次运行docker-compose up,一分钟左右可以工作吗? 不,它不会。我什至尝试docker-compose up -d db 仅运行数据库并尝试稍后运行应用程序。 除此之外,我还有depends_on 属性,这使得数据库服务优先 【参考方案1】:

旧版答案

重要提示: 旧版本的 MongoDB 忽略 application.properties 中的此配置,继续使用我添加的新解决方案


此解决方法用于忽略正常配置(uri 除外)的旧版本 spring 和 mongo

我收到一条警告,提示无法解析此属性 但希望它奏效了:)

dockerspring.data.mongodb.uri= mongodb://<your_mongodb_container_name>:27017/<name_of_your_db>

mongodb 部分不可更改,但端口号之前的 mongo 实际上是您在 docker-compose 中指定的容器女巫的名称


春季启动解决方案

spring:
  data:
    mongodb:
      host: <mongo-db-container-name>
      port: <mongo-db-port>
      database: <database-name>

码头工人解决方案

在您的 Dockerfile 中添加此选项以执行 Java

ENTRYPOINT [“java”,”-Dspring.data.mongodb.uri=mongodb://mongo:27017/name_of_your_db”, “-Djava.security.egd=file:/dev/./urandom”,”-jar”,”/<name_of_your_app>.jar”]

链接 Java 和 Mongo 容器 + 为它们命名

这是我最后的 docker-compose.yml, 希望对你有帮助

version: "3"
services:

  java:
    build:
      context: ./
    ports:
      - "8080:8080"
    container_name: java
    links:
      - mongo
    depends_on:
      - mongo
    networks:
      - shared-net
 
 mongo:
    image: 'mongo'
    ports:
      - 27017:27017
    container_name: mongo
    volumes:
      - /home/sinoed/data/db:/data/db
    networks:
      - shared-net

networks:
  shared-net:
    driver: bridge

仔细比较这个版本和问题中指定的版本

【讨论】:

太棒了!感谢您分享您的解决方案!我遇到了同样的问题并通过应用您的建议解决了它。我要添加到您的解决方案中的唯一一件事是数据库主机(在 Dockerfile 和 Java 应用程序 url 属性文件中指定)不一定命名为“mongo”;如果在您的 Docker 组合中,您将容器(container_name 属性)命名为 mongo_whatever,那么这就是您将必须使用的主机名。感谢您发布此内容。 我很高兴这很有用。是的,你是对的,我在 docker-compose.yml 中使用了 container_name,但我忘记在答案中提及它。感谢您提及它,我将编辑答案。

以上是关于通过 Spring Boot 应用程序连接到 Docker Compose MongoDb的主要内容,如果未能解决你的问题,请参考以下文章

无法将mysql连接到spring boot项目

Spring Boot 使用 SSL 连接到 Postgresql

无法从通过intellij运行的spring boot应用程序连接到我在docker上运行的kafka

通过 Java/Spring Boot 连接到 Docker Elasticsearch 实例

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

如何将 Spring Boot JAR 连接到远程 Oracle 数据库?