You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:15:54