简体   繁体   English

docker 图像未连接到 mongodb

[英]docker image not connecting to mongodb

when I build my docker image and run it it gives this and error however if I run the jar file everything runs fine if I had it guess it would have to do with my docer-compose.yml file but idk当我构建我的 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 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

You must use docker internal host network to connect with mongodb.您必须使用 docker 内部主机网络来连接 mongodb。 So from your dockerized application you have to connect with the service name (as that is the hostname) instead of connecting with localhost.因此,从您的 dockerized 应用程序中,您必须使用服务名称(因为这是主机名)而不是与 localhost 连接。 In your case: http://mongodb:27017 is the service (and thus hostname) of your mongo db container.在您的情况下: http://mongodb:27017是您的 mongo db 容器的服务(因此是主机名)。

By default docker containers are using bridge networking, so you cannot connect to localhost from a container.默认情况下,docker 容器使用bridge网络,因此您无法从容器连接到localhost There can be several ways to solve this, one would be to connect your container, which is running the Java application, to the network where MongoDB is placed.有几种方法可以解决这个问题,一种方法是将运行 Java 应用程序的容器连接到放置 MongoDB 的网络。

Since in your docker-compose you explicitly specify the name of the network ( mongodb_network ), we can do the following:由于在您的docker-compose您明确指定了网络名称( mongodb_network ),我们可以执行以下操作:

  1. In the properties file we have to change localhost to mongodb , so:在属性文件中,我们必须将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

The reason for this is that name of the container can be used as hostname if we connect to the network in which the container is placed.这样做的原因是,如果我们连接到放置容器的网络,容器的名称可以用作hostname

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

(fill in your docker image name there) (在那里填写您的 docker 镜像名称)

While these steps might work, I suggest to add the your application to the docker-compose :虽然这些步骤可能有效,但我建议将您的应用程序添加到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

This has to be build first with docker-compose build and afterwards can be executed with docker-compose up .这必须首先使用docker-compose build ,然后可以使用docker-compose up执行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM