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

远程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

排查与解决方向

  1. VM内host解析问题

    • 把Python代码里的mongo_host替换为localhost、127.0.0.1或VM的内网IP再测试,VM内部可能无法解析vmaddress到自身。
    • 执行ping vmaddress验证解析和连通性,若失败检查/etc/hosts是否有正确映射。
  2. VM防火墙/安全组限制

    • 临时关闭VM防火墙(如systemctl stop firewalld)测试是否能连通,若恢复正常则调整防火墙规则开放27017端口。
    • 若为云VM,检查云服务商安全组的内网入站规则,确认允许27017端口访问。
  3. 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,允许所有地址访问。
  4. 连接字符串补充认证库参数

    • 非管理员用户在admin库创建,连接时需指定authSource=admin,修改Python连接字符串:
      client = MongoClient(f"mongodb://{mongo_username}:{mongo_password}@{mongo_host}:27017/?authMechanism=DEFAULT&directConnection=true&authSource=admin")
      
  5. 直接用mongosh测试连通性

    • 在VM内执行以下命令,排除Python环境问题:
      mongosh "mongodb://someUsername:someInitialPassword@localhost:27017/?authSource=admin&directConnection=true"
      
    • 若该命令能正常连接,检查pymongo版本是否与MongoDB版本兼容,或Python环境是否有网络代理干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:24:50