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
相关产品推荐
相关产品推荐

