com.mongodb.MongoSocketOpenException: 打开套接字时出现异常(MongoDB,Docker)

12

我尝试使用Docker镜像启动我的应用程序(Spring Boot + Spring Cloud + Eureka + MongoDB),但是无法连接到MongoDB。

异常:

exception "com.mongodb.MongoSocketOpenException: Exception opening socket."

我用以下命令启动我的应用程序: docker-compose up --build

Docker 日志:

com.mongodb. MongoSocket0penException: Exception opening socket at com.mongodb. connection. SocketStream.open(SocketStream.java: 63) ~|mongo-java-driver-3.2.2.jar!/:naj
  at com. monsoob: connection. berettaberverwontortser/ersonito-kunnablearancerainitservertonitolnava:1203-dionso-java-driver*3?2.2.jarl/:nal
  at : java. lang. Thread.run (Thread. java: 745) Lna:1.8.0_111]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
  at java.net.PlainSocketImpl.socketConnect (Native Method) ~ [na: 1.8.0_1111 at java.net.AbstractPlainSocketImp1.doConnect (AbstractplainSocketImpl.java:350) ~ [na: 1.8.0_111]
  at java.net.AbstractPlainSocketImp1.connectToAddress(AbstractPlainSocketImp1.java:206)~[na:1.8.0_1111 
  at java.net .AbstractPlainSocketImp1.connect (AbstractPlain5ocket Imp],java:188) ~[na:1.8.0_111]
  at java.net.SocksSocketImpl.connect (SocksSocketImpl.java:392) ~|na:1.8.0_111] java.net Socket. connect (Socket, java: 589) ~[na:1.8:0-111]
  at com.mongodb.connection. SocketStreamHelper.initialize(SocketStreamHelper. java: 50) ~ [mongo-java-driver-3.2.2.ar!/:na] at com. mongodb. connection. SocketStream.open(SocketStream. java:58) ~ [mongo-java-driver-3.2.2.jar!/:na]
3 common frames omitted

应用配置文件 (application.yml):

# Spring properties
spring:
  application:
    name: car-service
  data:
    mongodb.host: localhost
    mongodb.port: 32769
    mongodb.uri: mongodb://localhost/test
    mongo.repositories.enabled: true


# Discovery Server Access
eureka:
    client:
      serviceUrl:
        defaultZone: http://localhost:8761/eureka/

# HTTP Server (Tomcat) Port
server: 
  port: 2220

error:
  whitelabel:
    enabled: false

docker-compose.yml:

eureka:
  build: ./eureka-discovery-service
  ports:
    - "8761:8761"

mongodb:
  image: mongo:3.0.4
  ports:
    - "32769:32769"

postgresql:
  image: postgres:9.6.1
  ports:
    - "32770:32770"

gateway-service:
  build: ./gateway-service
  ports:
    - "9090:9090"
  links:
    - eureka
  environment:
    SPRING_APPLICATION_NAME: gateway-service
    SPRING_PROFILES_ACTIVE: enableEureka
    EUREKA_INSTANCE_PREFER_IP_ADDRESS: "true"
    EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka:8761/eureka/

airplane-service:
  build: ./airplane-service
  ports:
    - "2222:2222"
  links:
    - eureka
    - postgresql
  environment:
    SPRING_APPLICATION_NAME: airplane-service
    SPRING_PROFILES_ACTIVE: enableEureka
    EUREKA_INSTANCE_PREFER_IP_ADDRESS: "true"
    EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka:8761/eureka/
    SPRING_SLEUTH_ENABLED: "true"
    SPRING_DATASOURCE_POSTGRESQL_URL: jdbc:postgresql://localhost:32770/postgres

car-service:
  build: ./car-service
  ports:
    - "2220:2220"
  links:
    - eureka
    - mongodb
  environment:
    SPRING_APPLICATION_NAME: car-service
    SPRING_PROFILES_ACTIVE: enableEureka
    EUREKA_INSTANCE_PREFER_IP_ADDRESS: "true"
    EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka:8761/eureka/
    SPRING_SLEUTH_ENABLED: "true"
    SPRING_DATA_MONGODB_URI: mongodb://localhost:32769/test


machine-service:
  build: ./machine-service
  ports:
    - "2224:2224"
  links:
    - eureka
  environment:
    SPRING_APPLICATION_NAME: machine-service
    SPRING_PROFILES_ACTIVE: enableEureka
    EUREKA_INSTANCE_PREFER_IP_ADDRESS: "true"
    EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka:8761/eureka/
    SPRING_SLEUTH_ENABLED: "true"

我为什么在打开套接字时会遇到异常?如何解决这个问题?

4个回答

15

您正在属性文件中将mongodb主机设置为localhost。在容器中,localhost地址指向容器本身,但是您的mongodb不在该容器(car-service)中运行。当您使用docker compose时,可以使用容器名称来寻址。在您的情况下,它是mongodb


9
为了澄清@barbakini的答案,在applications.yaml中定义它,请使用以下内容:
spring.data.mongodb.host: mongodb

2
这个答案与之前的答案有何不同? - Akin Okegbile
12
它是明确的,而不是暗示的 :) - Tim

0

您的mongoDB服务未启动,

请通过以下命令检查其状态

sudo service mongodb status

sudo service mongodb start

希望它能够正常工作,但也可能有几个原因, 例如您在应用程序中为mongodb服务定义的配置不正确,比如端口号。

可能Mongo还没有安装。 - Ajay Takur
mongodb:未识别的服务。 - Darksymphony
永远不会起作用,因为您没有在 Docker 容器内搜索,而是仅在主机上搜索,而且 MongoDB 可能已安装(并且可能是不同的版本),或者根本没有安装。这就是为什么有些人会收到“未识别的服务”或“连接被拒绝”的消息。 - BendaThierry.com

0
尝试在docker-compose.yml中为所有需要连接到mongo或eureka或postgresql的服务添加network_mode: host,并移除links: .... 这样做可以使其连接到docker本地主机。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接