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

Spring Boot容器无法连接Minikube中MongoDB的问题求助

Spring Boot容器化应用无法连接Minikube中的MongoDB

背景信息

  • 在Minikube中搭建了MongoDB集群
  • 通过NodePort类型Service暴露外部访问,Service配置如下:
apiVersion: v1
kind: Service
metadata:
  name: mongodb-external-service
spec:
  selector:
    app: mongodb
  type: NodePort
  ports:
  - port: 27017
    protocol: TCP
    targetPort: 27017
    nodePort: 32000
  • Minikube节点IP为192.168.49.2
  • 本地通过MongoDB Compass和Spring Boot应用均能正常连接192.168.49.2:32000的MongoDB

容器化配置

Dockerfile

FROM adoptopenjdk:11-jre-hotspot as builder   
ARG JAR_FILE=target/*.jar    
COPY ${JAR_FILE} tradeprocessor.jar   
RUN java -Djarmode=layertools -jar tradeprocessor.jar extract
FROM adoptopenjdk:11-jre-hotspot
COPY --from=builder dependencies/ ./
COPY --from=builder snapshot-dependencies/ ./
COPY --from=builder spring-boot-loader/ ./
COPY --from=builder application/ ./
ENTRYPOINT ["java",  "org.springframework.boot.loader.JarLauncher"]

docker-compose.yml

version: '3.7'

services:
  trdprocess:
    build:
      context: .
      dockerfile: Dockerfile
    image: tradeprocess:latest
    ports:
      - 8088:8088
    extra_hosts:
      - dockerhost:192.168.49.2
    environment:
      - spring_data_mongodb_authentication_database=admin
      - spring_data_mongodb_username=mongouser
      - spring_data_mongodb_password=mongopassword
      - spring_data_mongodb_database=transactions
      - spring_data_mongodb_port=32000
      - spring_data_mongodb_host=192.168.49.2

问题现象

容器启动后应用初始化成功,但抛出MongoDB连接超时异常:

Started TradeprocessingApplication in 2.09 seconds (JVM running for 2.973)
2023-01-04 20:16:13.529  INFO 1 --- [.168.49.2:32000] o.m.d.cluster                            : Exception in monitor thread while connecting to server 192.168.49.2:32000
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-4.6.1.jar:?]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:180) ~[mongodb-driver-core-4.6.1.jar:?]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:193) ~[mongodb-driver-core-4.6.1.jar:?]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:157) ~[mongodb-driver-core-4.6.1.jar:?]
at java.lang.Thread.run(Unknown Source) ~[?:?]
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[?:?]
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[?:?]
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[?:?]
at java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[?:?]
at java.net.SocksSocketImpl.connect(Unknown Source) ~[?:?]
at java.net.Socket.connect(Unknown Source) ~[?:?]
at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:107) ~[mongodb-driver-core-4.6.1.jar:?]

尝试修改extra_hosts、端口映射等配置均无效,需排查网络连通性问题。

排查与解决方案

1. 验证容器内网络连通性

先进入容器测试能否访问Minikube节点IP和端口:

# 进入运行中的容器
docker exec -it <容器ID/名称> bash
# 测试ping连通性
ping 192.168.49.2
# 测试端口可达性(需容器内有telnet/nc工具)
telnet 192.168.49.2 32000

如果无法ping通或端口不通,说明容器与Minikube节点之间的网络路由存在问题。

2. 替换为宿主机局域网IP(针对Windows/macOS环境)

Windows/macOS下Minikube运行在虚拟机内,192.168.49.2是虚拟机内部IP,Docker容器无法直接访问。此时改用宿主机的局域网IP(如192.168.1.100),并确保Minikube的NodePort端口在宿主机上可访问:
修改docker-compose中的环境变量:

environment:
  - spring_data_mongodb_host=192.168.1.100

3. 接入Minikube网络(推荐测试方案)

让Docker容器直接加入Minikube的网络,可直接使用内部Service名称访问MongoDB,避免跨网络问题:

# 获取Minikube网络名称
docker network ls | grep minikube

修改docker-compose配置接入该网络:

services:
  trdprocess:
    # 保留原有配置
    networks:
      - minikube-network

networks:
  minikube-network:
    external:
      name: <Minikube网络名称>

同时更新MongoDB连接配置为Minikube内部Service信息:

environment:
  - spring_data_mongodb_host=mongodb-external-service
  - spring_data_mongodb_port=27017

4. 检查Minikube端口访问规则

登录Minikube节点验证防火墙是否允许NodePort端口访问:

minikube ssh
sudo iptables -L | grep 32000

确保存在允许32000端口的入站规则。

内容的提问来源于stack exchange,提问作者Nagesh vruddula

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:55:37