【问题标题】:Mongodb connection error though docker in springbootMongodb连接错误虽然在spring boot中的docker
【发布时间】:2020-10-02 19:12:48
【问题描述】:

我正在学习 docker 并尝试为 springboot db 应用程序(jdk 10)创建一个 docker-compose.yml 文件。 Spring boot 选择 27017 作为 mongodb 的默认端口,所以如果我使用以下命令启动 mongo 容器:

docker run -d -p 27017:27017 mongo

然后在 intellij 中启动我的应用程序,一切正常。当我尝试使用 docker-compose.yml 时,出现连接异常。

这是我的 Dockerfile

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

这是我的 docker-compose.yml:

services:
  java:
    image: adoptopenjdk/openjdk10:latest
  mongo:
    image: mongo
    expose:
      - "27017"
    ports:
     - "0.0.0.0:27017:27017"
  spring_boot_mongo:
    build: .
    ports:
      - "8080:8080"
    links:
      - java
version: "2"

运行 docker-compose up 命令时出错:

localhost:27017
spring_boot_mongo_1  |
spring_boot_mongo_1  | com.mongodb.MongoSocketOpenException: Exception opening socket
spring_boot_mongo_1  |  at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67) ~[mongodb-driver-core-3.8.2.jar!/:na]
spring_boot_mongo_1  |  at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongodb-driver-core-3.8.2.jar!/:na]
spring_boot_mongo_1  |  at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.8.2.jar!/:na]
spring_boot_mongo_1  |  at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
spring_boot_mongo_1  | Caused by: java.net.ConnectException: Connection refused (Connection refused)
spring_boot_mongo_1  |  at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_212]
spring_boot_mongo_1  |  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_212]
spring_boot_mongo_1  |  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_212]
spring_boot_mongo_1  |  at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_212]
spring_boot_mongo_1  |  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_212]
spring_boot_mongo_1  |  at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_212]
spring_boot_mongo_1  |  at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) ~[mongodb-driver-core-3.8.2.jar!/:na]
spring_boot_mongo_1  |  at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:62) ~[mongodb-driver-core-3.8.2.jar!/:na]
spring_boot_mongo_1  |  ... 3 common frames omitted
spring_boot_mongo_1  |

这是我在运行 docker ps 时看到的:

CONTAINER ID        IMAGE                                          COMMAND                  CREATED             STATUS              PORTS                      NAMES
4da4948d04d9        spring-boot-mongodb-master_spring_boot_mongo   "java -jar /app.jar"     11 seconds ago      Up 10 seconds       0.0.0.0:8080->8080/tcp     spring-boot-mongodb-master_spring_boot_mongo_1
e9a79f3ba8ab        mongo                                          "docker-entrypoint.s…"   12 seconds ago      Up 10 seconds       0.0.0.0:27017->27017/tcp   spring-boot-mongodb-master_mongo_1

这意味着 mongo 映射按预期工作(当我使用上述 docker run 命令启动 mongodb 容器时,我看到相同的 o/p),但未实现应用程序端口映射。有人可以帮我吗??

谢谢!

【问题讨论】:

    标签: mongodb spring-boot docker docker-compose


    【解决方案1】:

    来自同一个 docker-compose 的服务连接到同一个默认网络。当你想访问另一个容器时,你应该在你的 url 中使用服务名称。容器名称将自动解析为容器 IP。您无法使用 localhost 访问另一个容器 - 请改用服务名称。在您的情况下,您可以为 spring_boot_mongo 服务设置环境变量:

    spring_boot_mongo:
        build: .
        ports:
          - "8080:8080"
        environment:
          - SPRING_DATA_MONGODB_.HOST=mongo
    

    如果您使用的是 Spring Data mongo。否则设置环境变量以覆盖应用程序容器中的 uri。

    【讨论】:

    • 非常感谢,设置环境变量解决了问题(SPRING_DATA_MONGODB_.HOST=mongo)。为了澄清我的理解,这是否意味着我们在这种情况下将 Spring Data mongodo 的主机设置为由“mongo”容器创建的主机(类似于本文中提到的响应:stackoverflow.com/questions/37226311/…)。同样对于您的第二个建议:设置环境变量以覆盖您的应用程序容器中的 uri - 我该怎么做?能详细点吗?
    • 1.你是对的,你的应用程序需要连接到你的 mongo 服务创建的 mongo 容器——这就是你改变它的原因。 2.您已经通过设置环境变量覆盖了mongo主机,并且它是由spring选择的。我不确定您如何配置 mongodb 连接(uri 属性或主机/端口属性),这就是我建议它的原因。
    猜你喜欢
    • 2020-02-11
    • 2016-09-13
    • 2020-11-27
    • 2019-07-27
    • 2021-10-03
    • 2018-06-09
    • 2020-10-21
    • 2017-11-10
    • 2021-06-14
    相关资源
    最近更新 更多