проблема с подключением к MongoDB в Java Spring в контейнере Docker

Когда возник вопрос о том, как разместить бэк сайта на сервере, я решил использовать docker, но начали возникать ошибки. Я использую MongoDB в своем проекте и, вероятно, в первую очередь его нужно запустить, я все делаю через docker-compose.yml Я запускаю mongodb вот так:

version: "3.8"
services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: unless-stopped

    ports:
      - "27017:27017"
    volumes:
      - ./database-data:/data/db

после этого я был озадачен тем фактом, что мне нужно будет подключить mongo express и запустить его следующим образом:

mongo express:
image: mongo-express:last
container name: mongo-express
restart: unless - stopped
ports:
- "8081:8081"
environment:
ME_CONFIG_MONGODB_SERVER: mongodb

изначально ничего не получалось, но после просмотра видео на YouTube все заработало хорошо, mongo-express подключился к mongodb

далее нужно запустить программу, написанную в spring. мой код настолько кривой, насколько это возможно, так как я учусь, но в локалке всё работает, я запускаю его в yml-файле следующим образом:

my-final-app:
build: .
restart: unless-stopped
ports:
- "8080:8080"
environment:
- spring.data.mongodb.host=mongodb
depends_on:
- mongodb

и ничего не работает, код выдал ошибку:

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.6.RELEASE)
2023-05-02 17:28:13.094  INFO 1 --- [           main] com.example.demo.Application             : Starting Application v2.2.6.RELEASE on d2aee9dc2964 with PID 1 (/demo.jar started by root in /)
2023-05-02 17:28:13.097  INFO 1 --- [           main] com.example.demo.Application             : No active profile set, falling back to default profiles: default
2023-05-02 17:28:14.193  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (https)
2023-05-02 17:28:14.208  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-05-02 17:28:14.208  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.33]
2023-05-02 17:28:14.275  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-05-02 17:28:14.275  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1114 ms
2023-05-02 17:28:14.439  INFO 1 --- [localhost:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server localhost:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
        at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:73) ~[mongodb-driver-core-4.9.1.jar!/:na]
        at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:204) ~[mongodb-driver-core-4.9.1.jar!/:na]
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:199) ~[mongodb-driver-core-4.9.1.jar!/:na]
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:159) ~[mongodb-driver-core-4.9.1.jar!/:na]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111-internal]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_111-internal]
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_111-internal]
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_111-internal]
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_111-internal]
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_111-internal]
        at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_111-internal]
        at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:107) ~[mongodb-driver-core-4.9.1.jar!/:na]
        at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:82) ~[mongodb-driver-core-4.9.1.jar!/:na]
        at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:68) ~[mongodb-driver-core-4.9.1.jar!/:na]
        ... 4 common frames omitted
2023-05-02 17:28:14.442  INFO 1 --- [           main] org.mongodb.driver.client                : MongoClient with metadata {"driver": {"name": "mongo-java-driver|sync", "version": "4.9.1"}, "os": {"type": "Linux", "name": "Linux", "architecture": "amd64", "version": "5.15.90.1-microsoft-standard-WSL2"}, "platform": "Java/Oracle Corporation/1.8.0_111-internal-alpine-r0-b14"} created with settings MongoClientSettings{readPreference=primary, writeConcern=WriteConcern{w=null, wTimeout=null ms, journal=null}, retryWrites=true, retryReads=true, readConcern=ReadConcern{level=null}, credential=null, streamFactoryFactory=null, commandListeners=[], codecRegistry=ProvidersCodecRegistry{codecProviders=[ValueCodecProvider{}, BsonValueCodecProvider{}, DBRefCodecProvider{}, DBObjectCodecProvider{}, DocumentCodecProvider{}, CollectionCodecProvider{}, IterableCodecProvider{}, MapCodecProvider{}, GeoJsonCodecProvider{}, GridFSFileCodecProvider{}, Jsr310CodecProvider{}, JsonObjectCodecProvider{}, BsonCodecProvider{}, EnumCodecProvider{}, com.mongodb.client.model.mql.ExpressionCodecProvider@1460a8c0, com.mongodb.Jep395RecordCodecProvider@4f638935]}, loggerSettings=LoggerSettings{maxDocumentLength=1000}, clusterSettings={hosts=[localhost:27017], srvServiceName=mongodb, mode=SINGLE, requiredClusterType=UNKNOWN, requiredReplicaSetName='null', serverSelector='null', clusterListeners='[]', serverSelectionTimeout='30000 ms', localThreshold='30000 ms'}, socketSettings=SocketSettings{connectTimeoutMS=10000, readTimeoutMS=0, receiveBufferSize=0, sendBufferSize=0}, heartbeatSocketSettings=SocketSettings{connectTimeoutMS=10000, readTimeoutMS=10000, receiveBufferSize=0, sendBufferSize=0}, connectionPoolSettings=ConnectionPoolSettings{maxSize=100, minSize=0, maxWaitTimeMS=120000, maxConnectionLifeTimeMS=0, maxConnectionIdleTimeMS=0, maintenanceInitialDelayMS=0, maintenanceFrequencyMS=60000, connectionPoolListeners=[], maxConnecting=2}, serverSettings=ServerSettings{heartbeatFrequencyMS=10000, minHeartbeatFrequencyMS=500, serverListeners='[]', serverMonitorListeners='[]'}, sslSettings=SslSettings{enabled=false, invalidHostNameAllowed=false, context=null}, applicationName='null', compressorList=[], uuidRepresentation=UNSPECIFIED, serverApi=null, autoEncryptionSettings=null, contextProvider=null}
com.mongodb.client.internal.FindIterableImpl@4387b79e
2023-05-02 17:28:14.460  INFO 1 --- [           main] org.mongodb.driver.cluster               : Cluster description not yet available. Waiting for 30000 ms before timing out
2023-05-02 17:28:44.461  WARN 1 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginController' defined in URL [jar:file:/demo.jar!/BOOT-INF/classes!/com/example/controller/LoginController.class]: Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
2023-05-02 17:28:44.465  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2023-05-02 17:28:44.479  INFO 1 --- [           main] ConditionEvaluationReportLoggingListener : 
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2023-05-02 17:28:44.483 ERROR 1 --- [           main] o.s.boot.SpringApplication               : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginController' defined in URL [jar:file:/demo.jar!/BOOT-INF/classes!/com/example/controller/LoginController.class]: Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1320) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1214) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:882) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) [spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
        at com.example.demo.Application.main(Application.java:11) [classes!/:2.2.6.RELEASE]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_111-internal]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_111-internal]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_111-internal]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_111-internal]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) [demo.jar:2.2.6.RELEASE]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) [demo.jar:2.2.6.RELEASE]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) [demo.jar:2.2.6.RELEASE]
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) [demo.jar:2.2.6.RELEASE]
Caused by: java.lang.ExceptionInInitializerError: null
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_111-internal]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_111-internal]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_111-internal]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_111-internal]
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:204) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1312) ~[spring-beans-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
        ... 25 common frames omitted
Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused (Connection refused)}}]
        at com.mongodb.internal.connection.BaseCluster.getDescription(BaseCluster.java:184) ~[mongodb-driver-core-4.9.1.jar!/:na]
        at com.mongodb.internal.connection.SingleServerCluster.getDescription(SingleServerCluster.java:46) ~[mongodb-driver-core-4.9.1.jar!/:na]
        at com.mongodb.client.internal.MongoClientDelegate.getConnectedClusterDescription(MongoClientDelegate.java:143) ~[mongodb-driver-sync-4.9.1.jar!/:na]
        at com.mongodb.client.internal.MongoClientDelegate.createClientSession(MongoClientDelegate.java:100) ~[mongodb-driver-sync-4.9.1.jar!/:na]
        at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.getClientSession(MongoClientDelegate.java:285) ~[mongodb-driver-sync-4.9.1.jar!/:na]
        at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:177) ~[mongodb-driver-sync-4.9.1.jar!/:na]
        at com.mongodb.client.internal.MongoCollectionImpl.executeCount(MongoCollectionImpl.java:224) ~[mongodb-driver-sync-4.9.1.jar!/:na]
        at com.mongodb.client.internal.MongoCollectionImpl.countDocuments(MongoCollectionImpl.java:194) ~[mongodb-driver-sync-4.9.1.jar!/:na]
        at com.mongodb.client.internal.MongoCollectionImpl.countDocuments(MongoCollectionImpl.java:189) ~[mongodb-driver-sync-4.9.1.jar!/:na]
        at com.mongodb.client.internal.MongoCollectionImpl.countDocuments(MongoCollectionImpl.java:184) ~[mongodb-driver-sync-4.9.1.jar!/:na]
        at com.example.DAO.ProductsDAO.NumberOfProducts(ProductsDAO.java:30) ~[classes!/:2.2.6.RELEASE]
        at com.example.controller.LoginController.<clinit>(LoginController.java:23) ~[classes!/:2.2.6.RELEASE]
        ... 32 common frames omitted

ошибка обращается к этому коду в ProductsDAO:

public class ProductsDAO {

    private static final String COLLECTION_NAME = "products";
    private static final String DATABASE_NAME = "products";

    // создаем объект MongoClientSettings с настройками клиента
    static MongoClientSettings settings = MongoClientSettings.builder()
            .applyConnectionString(new ConnectionString("mongodb://localhost:27017"))
            .build();

    // создаем объект MongoClient с помощью настроек
    static MongoClient mongoClient = MongoClients.create(settings);
    static MongoCollection<Document> collection = mongoClient.getDatabase(DATABASE_NAME).getCollection(COLLECTION_NAME);

    public static long NumberOfProducts() {
        System.out.println(collection.find());
        return collection.countDocuments();
    }

Dockerfile:

FROM java:8u111-alpine
ADD target/demo.jar demo.jar
ENTRYPOINT ["java", "-jar", "demo.jar"]

в чем может быть проблема и как я могу проверить, возможно ли вообще подключиться к mango внутри контейнера, я думаю, что если это получилось с помощью mongo-express, то база данных должна работать должным образом

  1. Я попытался изменить URL подключения в ProductsDAO: mongodb://localhost:27017 -> mongodb://mongodb:27017/
  2. удалял имя пользователя и пароль при запуске контейнера mongodb.
  3. перезапускал программу много раз

Ответы (0 шт):