docker镜像未连接到mongodb

Posted

技术标签:

【中文标题】docker镜像未连接到mongodb【英文标题】:docker image not connecting to 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

【问题讨论】:

【参考方案1】:

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

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

    在属性文件中,我们必须将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

    为 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 容器的服务(以及主机名)。

【讨论】:

以上是关于docker镜像未连接到mongodb的主要内容,如果未能解决你的问题,请参考以下文章

运行 docker compose up 时 Postgres db 未连接到 docker

元数据库未连接到 MySQL(docker 容器)

Laravel Docker 容器未连接到本地 mysql

Keycloak Docker 容器未连接到 MySQL 数据库

Dockerizing springboot应用程序(在容器中)未连接到rabbitmq(在容器中):连接被拒绝

Docker mongo副本集环境搭建