Docker部署MongoDB副本集遇MongoServerError问题求助
解决Mongo副本集Docker Compose部署错误:
MongoServerError: no replset config has been received 你当前的Docker Compose配置存在几个关键问题,导致副本集无法正常初始化,以下是修正方案:
问题分析
- 副本集初始化逻辑错误
RoteMongoSecond里的命令用mongod && rs.initiate,但mongod默认前台运行,后面的初始化命令根本不会执行。而且副本集初始化应该在主节点完成,不是从节点。 - 绑定IP限制容器间通信
bind_ip设为localhost,容器名,其实直接绑定0.0.0.0更方便容器间和外部访问,避免IP限制问题。 - 依赖启动不代表服务就绪
depends_on只保证容器启动顺序,不保证Mongo服务完全就绪,直接初始化会失败。
修正后的docker-compose配置
version: "3.8" services: RoteMongoFirst: image: mongo:5 command: mongod --replSet roteReplicaSet --bind_ip 0.0.0.0 container_name: RoteMongoFirst ports: - "27017:27017" environment: - MONGO_INITDB_DATABASE=Rote volumes: - ./mongodb/RoteMongoFirst:/data/db networks: - rote-network healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5 RoteMongoSecond: image: mongo:5 command: mongod --replSet roteReplicaSet --bind_ip 0.0.0.0 container_name: RoteMongoSecond ports: - "27018:27017" environment: - MONGO_INITDB_DATABASE=Rote volumes: - ./mongodb/RoteMongoSecond:/data/db networks: - rote-network depends_on: RoteMongoFirst: condition: service_healthy networks: rote-network:
操作步骤
- 清理之前的Mongo数据目录(避免旧数据干扰):
rm -rf ./mongodb/RoteMongoFirst ./mongodb/RoteMongoSecond - 启动容器:
docker-compose up -d - 进入主节点初始化副本集:
docker exec -it RoteMongoFirst mongosh --eval "rs.initiate({ _id: 'roteReplicaSet', members: [ { _id: 0, host: 'RoteMongoFirst:27017' }, { _id: 1, host: 'RoteMongoSecond:27017' } ]})" - 检查副本集状态,确认节点正常:
docker exec -it RoteMongoFirst mongosh --eval "rs.status()"
内容的提问来源于stack exchange,提问作者Rabithua
相关产品推荐
相关产品推荐

