Docker部署的Mongo-rs无法通过MongoDB Compass连接求助
无法连接Docker中MongoDB副本集至MongoDB Compass
我查阅过若干类似问题,但未能解决自身问题,特此求助。我的docker-compose.yaml配置如下:
mongo-rs: image: mongo:4.4.21 restart: always container_name: mongo-rs command: ["--replSet", "rs0", "--bind_ip_all", "--port", "30001"] volumes: - ~/.docker/mongo-rs/data/:/data/db ports: - 30001:30001 healthcheck: test: test $$(echo "rs.initiate({_id:'rs0',members:[{_id:0,host:\"mongo-rs:30001\"}]}).ok || rs.status().ok" | mongo --port 30001 --quiet) -eq 1 interval: 10s start_period: 30s mongo-express-rs: image: mongo-express:0.54.0 restart: always ports: - 8086:8081 environment: ME_CONFIG_MONGODB_SERVER: mongo-rs ME_CONFIG_MONGODB_PORT: 30001
Docker Desktop中容器正常运行,我可连接至Mongo Express(http://localhost:8086/),但MongoDB Compass始终无法连接,尝试多种连接字符串均报错,请问该如何连接此Docker中的Mongo实例?
解决方案
1. 修正副本集成员的主机配置
你的副本集初始化命令使用了容器内部主机名mongo-rs:30001,而Compass从宿主机发起连接,无法识别该内部域名。需将副本集成员的主机调整为兼容内外访问的地址:
进入Mongo容器:
docker exec -it mongo-rs mongo --port 30001
在Mongo Shell中重新配置副本集:
var cfg = rs.conf(); // 同时添加容器内部和宿主机可访问的主机地址 cfg.members[0].host = "mongo-rs:30001,localhost:30001"; rs.reconfig(cfg, {force: true});
2. 使用正确的Compass连接字符串
副本集连接必须指定副本集名称,正确的连接字符串格式为:
mongodb://localhost:30001/?replicaSet=rs0
若后续添加了认证,格式为mongodb://<用户名>:<密码>@localhost:30001/?replicaSet=rs0。
3. 验证副本集状态
执行以下命令确认副本集正常运行:
docker exec -it mongo-rs mongo --port 30001 --quiet --eval "rs.status()"
输出中需包含ok: 1,且成员状态为PRIMARY。
4. 持久化配置(可选)
若希望容器重启后无需重复配置,可修改docker-compose.yaml中的healthcheck初始化命令,直接指定兼容内外访问的主机:
healthcheck: test: test $$(echo "rs.initiate({_id:'rs0',members:[{_id:0,host:\"mongo-rs:30001,localhost:30001\"}]}).ok || rs.status().ok" | mongo --port 30001 --quiet) -eq 1
内容的提问来源于stack exchange,提问作者Leron
相关产品推荐
相关产品推荐

