【问题标题】:docker image not connecting to mongodbdocker镜像未连接到mongodb
【发布时间】:2021-12-25 16:32:53
【问题描述】:

当我构建我的 docker 映像并运行它时,它会给出这个和错误但是如果我运行 jar 文件,一切运行正常,如果我猜它与我的 docer-compose.yml 文件有关,但 idk

    com.mongodb.MongoSocketOpenException: Exception opening socket
        at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-4.2.3.jar!/:na]
        at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:143) ~[mongodb-driver-core-4.2.3.jar!/:na]
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:188) ~[mongodb-driver-core-4.2.3.jar!/:na]
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144) ~[mongodb-driver-core-4.2.3.jar!/:na]
        at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Caused by: java.net.ConnectException: Connection refused
        at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
        at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na]
        at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) ~[na:na]
        at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) ~[na:na]
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[na:na]
        at java.base/java.net.Socket.connect(Socket.java:633) ~[na:na]
        at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:107) ~[mongodb-driver-core-4.2.3.jar!/:na]
        at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[mongodb-driver-core-4.2.3.jar!/:na]
        at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-4.2.3.jar!/:na]
        ... 4 common frames omitted

Dockerfile

FROM openjdk:17
ADD target/docker-document-rest-api.jar docker-document-rest-api.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "docker-document-rest-api.jar"]

application.properties

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.username=rootuser
spring.data.mongodb.password=rootpass
spring.data.mongodb.database=example
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost

docer-compose.yml

version: "3.8"
services:
  mongodb:
    image: mongo
    container_name: mongodb
    ports:
      - 27017:27017
    volumes:
      - data:/data
    environment:
      - MONGO_INITDB_ROOT_USERNAME=rootuser
      - MONGO_INITDB_ROOT_PASSWORD=rootpass
  mongo-express:
    image: mongo-express
    container_name: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=rootuser
      - ME_CONFIG_MONGODB_ADMINPASSWORD=rootpass
      - ME_CONFIG_MONGODB_SERVER=mongodb

volumes:
  data: {}

networks:
  default:
    name: mongodb_network

【问题讨论】:

    标签: java mongodb spring-boot docker


    【解决方案1】:

    默认情况下,docker 容器使用bridge 网络,因此您无法从容器连接到localhost。有几种方法可以解决这个问题,一种是将运行 Java 应用程序的容器连接到放置 MongoDB 的网络。

    由于您在 docker-compose 中明确指定了网络名称 (mongodb_network),因此我们可以执行以下操作:

    1. 在属性文件中,我们必须将localhost 更改为mongodb,所以:
    spring.data.mongodb.authentication-database=admin
    spring.data.mongodb.username=rootuser
    spring.data.mongodb.password=rootpass
    spring.data.mongodb.database=example
    spring.data.mongodb.port=27017
    spring.data.mongodb.host=mongodb
    

    这样做的原因是,如果我们连接到放置容器的网络,容器的名称可以用作hostname

    1. 为 Java 应用程序重建 docker 镜像,运行它:
    docker run --network=mongodb_network -p 8080:8080 <docker-image-name>
    

    (在此处填写您的 docker 镜像名称)

    虽然这些步骤可能有效,但我建议将您的应用程序添加到 docker-compose:

    version: "3.8"
    services:
      mongodb:
        image: mongo
        container_name: mongodb
        expose:
          - 27017
        ports:
          - 27017:27017
        volumes:
          - data:/data
        environment:
          - MONGO_INITDB_ROOT_USERNAME=rootuser
          - MONGO_INITDB_ROOT_PASSWORD=rootpass
      mongo-express:
        image: mongo-express
        container_name: mongo-express
        restart: always
        ports:
          - 8081:8081
        environment:
          - ME_CONFIG_MONGODB_ADMINUSERNAME=rootuser
          - ME_CONFIG_MONGODB_ADMINPASSWORD=rootpass
          - ME_CONFIG_MONGODB_SERVER=mongodb
      spring_application:
        build: .
        container_name: spring_application
        ports:
          - 8080:8080
        depends_on:
          mongodb:
            condition: service_started
    
    volumes:
      data: {}
    
    networks:
      default:
        name: mongodb_network
    

    这必须首先使用docker-compose build 构建,然后才能使用docker-compose up 执行。

    【讨论】:

      【解决方案2】:

      您必须使用 docker 内部主机网络来连接 mongodb。因此,从您的 dockerized 应用程序中,您必须连接服务名称(因为那是主机名)而不是连接 localhost。在您的情况下:http://mongodb:27017 是您的 mongo db 容器的服务(以及主机名)。

      【讨论】:

        猜你喜欢
        • 2017-03-07
        • 2018-06-09
        • 2017-02-22
        • 2017-06-01
        • 1970-01-01
        • 2019-02-04
        • 1970-01-01
        • 2018-06-19
        • 2021-08-05
        相关资源
        最近更新 更多