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

Docker Compose中自定义端口MongoDB无法通过Compass连接求助

Docker Compose部署的MongoDB自定义端口无法被Compass连接,报ECONNREFUSED

我使用Docker Compose部署了两个MongoDB数据库,分别运行在自定义端口:27310和:27311。我的Node.js应用无论是在本地桌面还是Docker Compose环境中都能成功连接这些数据库,但使用MongoDB Compass或其他UI工具连接时却遇到问题,每次尝试都会收到“connection refused”(connect ECONNREFUSED)错误。

以下是我的MongoDB容器的Docker Compose相关配置:

app-mongo-db:
    container_name: app-mongo-db
    image: mongo:6.0.6
    command: ["--replSet", "rs0", "--bind_ip_all"]
    ports:
      - "27310:27017"
    environment:
      - TZ=UTC
    volumes:
      - mongo-app-data:/data/db
    restart: unless-stopped
    networks:
      - app-network

  feed-mongo-db:
    container_name: feed-mongo-db
    image: mongo:6.0.6
    command: ["--replSet", "rs1", "--bind_ip_all"]
    ports:
      - "27311:27017"
    environment:
      - TZ=UTC
    volumes:
      - mongo-feed-data:/data/db
    restart: unless-stopped
    networks:
      - app-network

有趣的是,当我修改Docker Compose配置使用MongoDB默认端口(27017)时,一切正常,数据库可以通过MongoDB Compass正常访问。

请问我的配置中是否遗漏了什么,或者需要额外步骤才能允许MongoDB Compass连接这些数据库?


问题原因

核心问题是MongoDB副本集的成员配置与宿主机端口映射不匹配:

  • 开启副本集模式后,MongoDB初始化的成员默认使用容器内部地址(容器名/内部IP)和内部端口27017
  • 当Compass连接时,MongoDB会返回这些内部成员地址,Compass尝试直接连接该地址(而非你映射的宿主机端口27310/27311),导致宿主机无法访问,触发ECONNREFUSED
  • 使用默认端口27017时,内部端口和宿主机端口一致,所以Compass能正常连接

解决方案

方案1:修改副本集成员配置为宿主机可访问地址(推荐长期使用)

针对每个MongoDB容器执行以下步骤:

  1. 进入容器内部的Mongo Shell:
# 操作app-mongo-db
docker exec -it app-mongo-db mongosh
# 操作feed-mongo-db
docker exec -it feed-mongo-db mongosh
  1. 查看当前副本集配置:
rs.conf()
  1. 修改成员的host为宿主机可访问的地址:
// 针对app-mongo-db(端口27310)
cfg = rs.conf()
cfg.members[0].host = "localhost:27310"
rs.reconfig(cfg)

// 针对feed-mongo-db(端口27311)
cfg = rs.conf()
cfg.members[0].host = "localhost:27311"
rs.reconfig(cfg)
  1. 验证配置生效:
rs.status()

之后用Compass连接mongodb://localhost:27310或mongodb://localhost:27311即可正常访问。

方案2:连接Compass时添加directConnection=true参数(快速测试)

在Compass的连接字符串末尾添加该参数,强制直接连接指定端口,忽略副本集返回的拓扑信息:

mongodb://localhost:27310/?directConnection=true
mongodb://localhost:27311/?directConnection=true

此方法无需修改副本集配置,适合临时测试场景。

额外检查

确保宿主机防火墙/安全组没有阻止27310和27311端口的访问,可通过以下命令验证端口监听状态:

# Linux/macOS
netstat -anp | grep 27310
netstat -anp | grep 27311

# Windows
netsh advfirewall firewall show rule name=all | findstr 27310
netsh advfirewall firewall show rule name=all | findstr 27311

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:23:12