проблема с подключением к 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, то база данных должна работать должным образом
- Я попытался изменить URL подключения в ProductsDAO:
mongodb://localhost:27017->mongodb://mongodb:27017/ - удалял имя пользователя и пароль при запуске контейнера mongodb.
- перезапускал программу много раз