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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/45742999/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 02:09:05  来源:igfitidea点击:

com.mongodb.MongoSocketOpenException: Exception opening socket(MongoDB, Docker)

javamongodbspring-bootdocker-composenetflix-eureka

提问by bsuart

I try to starting my application(Spring Boot + Spring Cloud + Eureka + MongoDB) with using docker image, but i can't get connection to MongoDB.

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

Exception:

例外:

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

I starting my application with execute command: docker-compose up --build

我使用执行命令启动我的应用程序:docker-compose up --build

Docker log:

码头工人日志:

enter image description here

在此处输入图片说明

application.yml:

应用程序.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:

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"

Why I have exception opening a socket? How to fix this problem?

为什么我打开套接字时出现异常?如何解决这个问题?

采纳答案by barbakini

You are setting mongodb host in property file as localhost. In a container localhost address itself, but your mongodb is notin that container(car-service) which car-service run in. While you are using docker compose, you can address a container with its name. In your case it is mongodb.

您正在属性文件中将 mongodb 主机设置为localhost。在容器本地主机地址本身中,但您的 mongodb不在运行汽车服务的那个容器(汽车服务)中。当您使用 docker compose 时,您可以使用其名称来寻址容器。在您的情况下,它是mongodb

回答by user1668635

to clarify @barbakini's answer, to define it in applications.yaml use:

澄清@barbakini 的答案,在applications.yaml 中定义它使用:

spring.data.mongodb.host: mongodb