在 Docker 上使用 MongoDB 进行 Spring Boot

Posted

技术标签:

【中文标题】在 Docker 上使用 MongoDB 进行 Spring Boot【英文标题】:Spring Boot with MongoDB on Docker 【发布时间】:2016-11-22 04:53:51 【问题描述】:

这些天来,我正在尝试部署我的 Spring Boot OAuth2 项目。它有 3 个不同的模块。(身份验证服务器、资源服务器和前端) 身份验证和资源服务器有自己的 *.yml 文件用于配置,例如 mongodb name-port、server profile-ip 等。 我到底想做什么?我想在 docker 上部署 spring boot 应用程序,但我不想将我的数据库(mongodb)作为容器放在 docker 上。 我不确定这种结构是否可行? 因为当我在我的本地(localhost:27017)上运行我的 mongodb 之后尝试在本地 docker 上部署 spring boot 应用程序作为容器时,我得到 MongoDB 超时异常。应用程序无法连接到外部 mongoDB(非 docker 容器)。

我该怎么办?我应该在 docker 上运行 mongodb 吗?我也试过了,Mongo 运行成功,但是 spring 容器仍然无法运行并连接到 mongo。 我尝试在没有 mongodb 的情况下运行另一个 spring boot 应用程序,它运行成功,我通过 ip&port 从浏览器发出请求,我得到了应用程序的响应,正如我所料。

*** MONGO 网址 *** mongodb://127.0.0.1:27017/db-localhost **** 认证服务器 .yml 文件 **** 服务器: 端口:9080 上下文路径:/auth-服务 雄猫: access_log_enabled:真 basedir:目标/tomcat 安全: 基本的: 启用:假 春天: 简介: 活跃:发展 百里香叶: 缓存:假 蒙哥: D b: 服务器:127.0.0.1 港口:27017 记录: 等级: org.springframework.security:调试 --- 春天: 简介:发展 数据: 蒙哥达: 数据库:db-localhost --- 春天: 型材:生产 数据: 蒙哥达: 数据库:db-prod --- ***** 码头文件 ***** 来自 java:8 音量/tmp 添加 auth-server-1.0-SNAPSHOT.jar app.jar 暴露 9080 运行 bash -c 'touch /app.jar' 入口点 ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] **** 码头工人命令 ***** docker run -it -P --name authserver authserver

【问题讨论】:

两种方式都可以。你可以分享你的 mongodb 和 springboot 的 docker 文件以及 docker run 命令吗? 您使用哪个 url 从容器连接到 mongo? 【参考方案1】:

您的配置问题是从 127.0.0.1 上的 authservice 内部引用 mongodb,这是 authservice 容器内的环回适配器。所以你告诉你的 spring 应用 mongodb 和 authservice spring 应用在同一个容器中运行,事实并非如此。

您将数据库作为自己的容器运行(这需要正确处理数据卷)并使用容器名称作为主机名(通过链接)引用它,或者您需要使用正确的地址引用外部运行的 mongodb 实例.这将是运行 docker 守护程序的机器的 IP 地址(我假设您的本地环境类似于 192.168.0.xxx)。

【讨论】:

你说,我的mongo url应该是这样的; mongodb://192.168.99.100:27017/db-localhost 因为我的 mongodb 在 docker 外部运行,在我的本地 pc 上,而不是在 docker 容器内部,对吧? 这看起来像是 docker 主机 vm 的 ip 地址。我假设您使用的是 boot2docker 之类的东西。所以有你真正的主机,运行 docker 的 vm 和容器本身。如果您的 mongodb 直接安装在您的主机上,这不是正确的地址。尝试从您的主机终端连接到您的 mongodb 实例,而不是使用 localhost 或 127 地址。这也是从内部使用的 ip。 好的我明白你的意思,但我仍然不清楚,因为我的 mongodb 运行在我的本地,而不是任何其他服务器或主机上。这意味着IP是127.0.0.1。我如何告诉 docker 容器中的 spring 应用程序,请 spring 应用程序使用我的本地 mongodb(127.0.0.1) 而不使用 127.address ?在这一点上我有点困惑 127地址就像在说“在同一台主机上”。所以想想我邀请你到“我的房子”,你肯定不会住在自己的房子里,因为这就是“我的房子”对你的意义。因此,与其告诉 spring 使用“我的地址”,不如告诉它你真实主机的地址。您可以通过在本地计算机上的新终端窗口中运行ifconfig 来找出您的真实主机的名称。在大多数情况下,有一些 eth0 或 wlan1 的条目,地址为 192.168.0.x 或 192.168.1.x。 非常感谢@ajaegle。我理解我的错误。现在它的工作。我只将 mongo ip 从 127.0.0.1 更改为 192.168.0.15【参考方案2】:

问题:我该怎么办?

至少出于开发目的,我建议您也将 docker 用于您的 mongodb 实例。此外,我还使用 RabbitMQ 进行了类似的设置,当我使用 docker 时,它也解决了很多问题。使用docker-compose 来设置一切会更容易。稍后您仍然可以通过 spring 属性指定要使用的 mongodb 实例。

问题:我也试过了,mongo运行成功但是spring容器还是无法运行并连接mongo

问题可能是因为您没有为您的服务设置任何网络或主机名。您的 spring 应用程序无法解析您的 mongo 服务器的主机名,因为您在属性中为您的 mongodb 服务器指定了127.0.0.1

我建议为您的 mongodb 使用 docker,并使用像这样的 docker-compose.yml 文件来设置所有内容:

version: '3.7'
services:
  resource-server:
    image: demo/resource-server:latest
    container_name: resource-server
    depends_on:
      - mongodb-example
    networks:
      - your-network
    ports:
      - 8080:8080

  auth-server:
    image: demo/auth-server:latest
    container_name: auth-server
    depends_on:
      - mongodb-example
    networks:
      - your-network
    ports:
      - 8081:8080

  mongodb-example:
    image: mongo:latest
    container_name: mongo-example
    hostname: mongo-example
    networks:
      - your-network
    ports:
      - 27017:27017

networks:
  your-network:
    name: network-name

当然你需要调整你的属性文件或通过你的docker-compose.yml文件指定环境变量。

【讨论】:

以上是关于在 Docker 上使用 MongoDB 进行 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

如何在 docker-compose 上使用 nodejs 在 mongoDB 上设置身份验证?

使用 mongodb compass GUI 连接到 docker 内的 Mongodb

在 Docker 容器上使用 mongo 命令时看不到我的 mongodb 数据库

从 docker 容器连接到主机 mongodb

在 docker 上添加 MongoDB Sink 连接器?

Spring Boot 应用程序和 MongoDB 在不同的 Docker 容器上。应用程序未启动