首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过springboot中的docker连接Mongodb时出现错误

通过springboot中的docker连接Mongodb时出现错误
EN

Stack Overflow用户
提问于 2020-06-13 06:17:17
回答 1查看 516关注 0票数 1

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

代码语言:javascript
复制
docker run -d -p 27017:27017 mongo

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

这是我的Dockerfile

代码语言:javascript
复制
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

这是我的docker-compose.yml:

代码语言:javascript
复制
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命令时出错:

代码语言:javascript
复制
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时看到的:

代码语言:javascript
复制
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 ),但应用程序端口映射没有实现。有人能帮帮我吗??

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-13 07:20:01

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

代码语言:javascript
复制
spring_boot_mongo:
    build: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_DATA_MONGODB_.HOST=mongo

如果你使用的是spring data mongo。否则,设置环境变量以覆盖应用程序容器中的uri。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62353247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档