远程VM上MongoDB Docker容器本地连接失败求助
问题:VM内无法连接本地部署的MongoDB容器,本地桌面可正常连接
我在远程VM上通过docker-compose部署了MongoDB容器,用init.sh创建了带密码的非管理员用户。本地桌面用MongoCompass能正常连接,但VM内用Python代码连接超时失败,相关信息如下:
docker-compose.yaml
version: '3.6' services: mongo: image: mongo:latest restart: always container_name: email-mongo ports: - 27017:27017 environment: MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE} MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME} MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD} MONGODB_DB: ${MONGODB_DB} MONGODB_USER: ${MONGODB_USER} MONGODB_PASSWORD: ${MONGODB_PASSWORD} volumes: - ./init.sh:/docker-entrypoint-initdb.d/init.sh:ro
.env
MONGODB_DB=someDatabase MONGODB_USER=someUsername MONGODB_PASSWORD=someInitialPassword
init.sh
set -e mongosh <<EOF use admin db.createUser({ user: '$MONGODB_USER', pwd: '$MONGODB_PASSWORD', roles: [{ role: 'readWrite', db: '$MONGODB_DB' }] }) EOF
本地可用连接字符串(MongoCompass)
mongodb://someUsername:someInitialPassword@vmaddress:27017/?authMechanism=DEFAULT&directConnection=true
VM内测试Python代码
from pymongo import MongoClient from pymongo.errors import ConnectionFailure # MongoDB-Connectiondetails mongo_host = "vmaddress" mongo_port = 27017 mongo_username = "someUsername" mongo_password = "someInitialPassword" try: # Create a MongoDB-Client client = MongoClient(f"mongodb://{mongo_username}:{mongo_password}@{mongo_host}:27017/?authMechanism=DEFAULT&directConnection=true") # Get List of DB db_list = client.list_database_names() print("MongoDB connection successfull.") print("Datenbases on Server:", db_list) except ConnectionFailure as e: print("Connection to MongoDB failed:", e) except Exception as e: print("An Error occurred:", e)
报错信息
Connection to MongoDB failed: vmaddress:27017: timed out (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms), Timeout: 30s, Topology Description: <TopologyDescription id: 667d0c03c495fd3d26fab99c, topology_type: Single, servers: [<ServerDescription ('vmaddress', 27017) server_type: Unknown, rtt: None, error=NetworkTimeout('vmaddress:27017: timed out (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms)')>]>
Docker容器状态
6c834ed695a4 mongo:latest "docker-entrypoint.s…" 2 days ago Up 2 days 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp email-mongo
排查与解决方向
VM内host解析问题
- 把Python代码里的
mongo_host替换为localhost、127.0.0.1或VM的内网IP再测试,VM内部可能无法解析vmaddress到自身。 - 执行
ping vmaddress验证解析和连通性,若失败检查/etc/hosts是否有正确映射。
- 把Python代码里的
VM防火墙/安全组限制
- 临时关闭VM防火墙(如
systemctl stop firewalld)测试是否能连通,若恢复正常则调整防火墙规则开放27017端口。 - 若为云VM,检查云服务商安全组的内网入站规则,确认允许27017端口访问。
- 临时关闭VM防火墙(如
MongoDB绑定地址验证
- 进入容器确认MongoDB绑定地址:
docker exec -it email-mongo mongosh --username ${MONGO_INITDB_ROOT_USERNAME} --password ${MONGO_INITDB_ROOT_PASSWORD} --authenticationDatabase admin db.adminCommand({getCmdLineOpts: 1}).argv - 若未绑定
0.0.0.0,在docker-compose的mongo服务中添加command: mongod --bind_ip_all,允许所有地址访问。
- 进入容器确认MongoDB绑定地址:
连接字符串补充认证库参数
- 非管理员用户在
admin库创建,连接时需指定authSource=admin,修改Python连接字符串:client = MongoClient(f"mongodb://{mongo_username}:{mongo_password}@{mongo_host}:27017/?authMechanism=DEFAULT&directConnection=true&authSource=admin")
- 非管理员用户在
直接用mongosh测试连通性
- 在VM内执行以下命令,排除Python环境问题:
mongosh "mongodb://someUsername:someInitialPassword@localhost:27017/?authSource=admin&directConnection=true" - 若该命令能正常连接,检查pymongo版本是否与MongoDB版本兼容,或Python环境是否有网络代理干扰。
- 在VM内执行以下命令,排除Python环境问题:
内容的提问来源于stack exchange,提问作者Maximus0000
相关产品推荐
相关产品推荐

