Windows环境Docker中MongoDB无法连接问题及docker rm命令疑问
问题描述
我在Windows机器上运行了MongoDB的Docker实例,容器信息如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8fa2abece6fc mongo:latest "docker-entrypoint.s…" 2 hours ago Up 42 seconds 27017/tcp, 0.0.0.0:27017->27107/tcp mongo-container
创建网络和容器使用的命令:
docker network create --atachable -d overlay springBankNet docker run -it -d --name mongo-container -p 27017:27107 --network springBankNet --restart always -v mongodb_data_container:/data/db mongo:latest
可以成功进入容器:
docker exec -it mongo-container bash
但使用Studio 3T或MongoDB Compass连接时失败,报错:
Connection failed.
SERVER [localhost:27017] (Type: UNKNOWN)
|_/ Connection error (MongoSocketReadException): Prematurely reached end of streamDetails:
Timed out after 5000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketReadException: Prematurely reached end of stream}}]
Spring项目连接时执行mvn clean install也出现相同类型错误:
2022-07-20 19:40:22.636 INFO 5768 --- [ main] org.mongodb.driver.client : MongoClient with metadata {"driver": {"name": "mongo-java-driver|sync|spring-boot", "version": "4.6.1"}, "os": {"type": "Windows", "name": "Windows 10", "architecture": "amd64", "version": "10.0"}, "platform": "Java/Oracle Corporation/15.0.2+7-27"} 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{}, IterableCodecProvider{}, MapCodecProvider{}, GeoJsonCodecProvider{}, GridFSFileCodecProvider{}, Jsr310CodecProvider{}, JsonObjectCodecProvider{}, BsonCodecProvider{}, EnumCodecProvider{}, com.mongodb.Jep395RecordCodecProvider@186d8a71]}, 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=JAVA_LEGACY, serverApi=null, autoEncryptionSettings=null, contextProvider=null} 2022-07-20 19:40:22.718 INFO 5768 --- [localhost:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server localhost:27017 com.mongodb.MongoSocketReadException: Prematurely reached end of stream at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:112) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:135) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:713) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:571) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:410) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:337) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:101) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:45) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:131) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnectionInitializer.startHandshake(InternalStreamConnectionInitializer.java:73) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:182) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:193) ~[mongodb-driver-core-4.6.1.jar:na] at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:157) ~[mongodb-driver-core-4.6.1.jar:na] at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]
注:未使用用户名或密码,仅尝试普通连接。
解决方案
1. 端口映射错误修正
从容器端口信息可以看到,你把宿主机的27017端口映射到了容器的27107端口,但MongoDB默认监听容器内的27017端口。这是连接失败的核心原因:客户端尝试连接宿主机27017端口,但该端口实际指向容器内未被MongoDB使用的27107端口,导致连接异常。
修正步骤:
- 停止并删除现有容器:
docker stop mongo-container docker rm mongo-container - 使用正确的端口映射重新创建容器(宿主机端口:容器端口,容器端必须是27017):
docker run -it -d --name mongo-container -p 27017:27017 --network springBankNet --restart always -v mongodb_data_container:/data/db mongo:latest - 重新尝试用Studio 3T、MongoDB Compass或Spring项目连接localhost:27017即可。
2. 其他潜在检查点
- 确认Windows防火墙未阻止27017端口的入站连接。
- 检查Spring项目的MongoDB配置,确保连接地址为
mongodb://localhost:27017/(对应正确的端口)。
Docker命令疑问:docker rm <name> vs docker container rm <name>
两者功能完全一致,都是用于删除指定的Docker容器。docker rm是docker container rm的简写形式,Docker支持这种简化命令来减少输入量。在实际使用中,两种命令效果没有任何区别,可根据个人习惯选择使用。
内容的提问来源于stack exchange,提问作者Pent Terry

