Docker Compose配置下Spring应用无法连接MongoDB容器
问题描述
尝试在Docker中同时连接MySQL和MongoDB容器,MySQL连接正常,但MongoDB连接失败,报错UnknownHostException: mongocontainer。
配置文件信息
application.properties
# SERVER server.port = 5555 spring.datasource.url=jdbc:mysql://mysqldb:3306/shopdb spring.datasource.username=root spring.datasource.password=root spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect #spring.jpa.hibernate.ddl-auto=update spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.show-sql=true spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl application.security.jwt.secret-key=404E635266556A586E3272357538782F413F4428472B4B6250645367566B5970 application.security.jwt.expiration=7200000 application.security.jwt.refresh-token.expiration=604800000 spring.data.mongodb.host=mongocontainer spring.data.mongodb.port=27017 spring.data.mongodb.database=ShopDb
Dockerfile
FROM openjdk:17-alpine WORKDIR /app COPY target/myproject-0.0.1-SNAPSHOT.jar /app/myproject.jar EXPOSE 5555 CMD ["java","-jar","myproject.jar"]
docker-compose.yml
version: "5" services: mysqldb: image: mysql:latest ports: - "3307:3306" networks: - netshop environment: MYSQL_DATABASE: shopdb MYSQL_USER: root MYSQL_PASSWORD: root volumes: - type: bind source: /C/Users/tim/Documents/mysqldata target: /var/lib/mysql mongocontainer: image: mongo:latest container_name: mongocontainer restart: always ports: - 27017:27017 myproject: image: timqwert09/myproject:latest ports: - "5555:5555" networks: - netshop depends_on: - mysqldb links: - mongocontainer networks: netshop: driver: bridge
错误日志
resources-myproject-1 | com.mongodb.MongoSocketException: mongocontainer: Try again resources-myproject-1 | at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:217) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:78) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:68) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:183) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:198) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:158) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at java.base/java.lang.Thread.run(Thread.java:831) ~[na:na] resources-myproject-1 | Caused by: java.net.UnknownHostException: mongocontainer: Try again resources-myproject-1 | at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) ~[na:na] resources-myproject-1 | at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:932) ~[na:na] resources-myproject-1 | at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1517) ~[na:na] resources-myproject-1 | at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:851) ~[na:na] resources-myproject-1 | at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1507) ~[na:na] resources-myproject-1 | at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1366) ~[na:na] resources-myproject-1 | at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1300) ~[na:na] resources-myproject-1 | at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:209) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | ... 6 common frames omitted resources-myproject-1 | resources-myproject-1 | 2023-10-01T07:05:22.194Z INFO 1 --- [container:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server mongocontainer:27017 resources-myproject-1 | resources-myproject-1 | com.mongodb.MongoSocketException: mongocontainer resources-myproject-1 | at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:217) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:78) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:68) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:183) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:198) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:158) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | at java.base/java.lang.Thread.run(Thread.java:831) ~[na:na] resources-myproject-1 | Caused by: java.net.UnknownHostException: mongocontainer resources-myproject-1 | at java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:800) ~[na:na] resources-myproject-1 | at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:886) ~[na:na] resources-myproject-1 | at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1507) ~[na:na] resources-myproject-1 | at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1366) ~[na:na] resources-myproject-1 | at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1300) ~[na:na] resources-myproject-1 | at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:209) ~[mongodb-driver-core-4.8.2.jar!/:na] resources-myproject-1 | ... 6 common frames omitted resources-myproject-1 |
额外疑问
宿主机(Windows)安装了MongoDB但未运行,是否会影响Docker容器内的MongoDB连接?
解决方案
1. 核心问题
mongocontainer未加入netshop网络,导致myproject容器无法通过服务名解析到它。MySQL能正常连接是因为它和myproject处于同一网络。
2. 修复步骤
修改docker-compose.yml
给mongocontainer添加网络配置,同时调整myproject的依赖:
version: "5" services: mysqldb: image: mysql:latest ports: - "3307:3306" networks: - netshop environment: MYSQL_DATABASE: shopdb MYSQL_USER: root MYSQL_PASSWORD: root volumes: - type: bind source: /C/Users/tim/Documents/mysqldata target: /var/lib/mysql mongocontainer: image: mongo:latest container_name: mongocontainer restart: always ports: - 27017:27017 networks: - netshop # 加入netshop网络 myproject: image: timqwert09/myproject:latest ports: - "5555:5555" networks: - netshop depends_on: - mysqldb - mongocontainer # 依赖MongoDB容器,保证启动顺序 networks: netshop: driver: bridge
关于宿主机MongoDB的说明
宿主机未运行的MongoDB不会影响Docker容器内的连接,因为Docker容器拥有独立网络栈,与宿主机网络隔离。
3. 验证修复
- 停止当前容器:
docker-compose down - 重新启动容器:
docker-compose up -d - 查看应用日志:
docker-compose logs myproject,确认MongoDB连接成功。
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

