求助:如何将Docker部署的单节点MongoDB转为Replica Set
将单节点MongoDB转换为副本集的操作步骤
1. 修改MongoDB启动配置(Dockerfile)
把原Dockerfile的启动命令改为副本集模式,需添加--replSet <副本集名称>(示例用rs0),同时加上--bind_ip_all确保容器内MongoDB能被正常访问:
FROM mongo:6.0 ENV MONGO_PORT=27017 ENV MONGO_REPLICA_SET=rs0 EXPOSE $MONGO_PORT HEALTHCHECK CMD echo 'db.runCommand("ping").ok' | mongosh 127.0.0.1:$MONGO_PORT/test --quiet || exit 1 ENTRYPOINT docker-entrypoint.sh mongod --port $MONGO_PORT --replSet $MONGO_REPLICA_SET --bind_ip_all
2. 重建镜像并重启容器
执行以下命令更新镜像并重启服务:
docker-compose build mongo docker-compose up -d mongo
3. 初始化副本集
进入MongoDB容器,用mongosh连接后执行初始化命令:
docker-compose exec mongo mongosh
在mongosh终端中运行:
rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "mongo:27017" } ] })
这里用docker-compose服务名
mongo作为主机名,容器内可通过服务名直接访问;执行后输入rs.status()查看状态,返回ok: 1即初始化成功。
4. 更新连接字符串
将原单节点连接串修改为副本集模式,添加replicaSet=rs0参数:
mongodb://${env('MONGO_USERNAME')}:${env('MONGO_PASSWORD')}@${env('MONGO_HOST')}:${env('MONGO_PORT')}/${env('MONGO_DATABASE')}?authSource=admin&replicaSet=rs0
(可选)扩展为多节点副本集
如果需要多节点部署,修改docker-compose.yaml添加secondary节点:
volumes: mongo.data: mongo.data.secondary1: mongo.data.secondary2: services: mongo: image: ${COMPOSE_PROJECT_NAME}/mongo container_name: ${COMPOSE_PROJECT_NAME}.mongo.docker restart: unless-stopped build: context: . dockerfile: ./mongo.Dockerfile env_file: envs/mongo.env volumes: - mongo.data:/data/db ports: - 127.0.0.1:${MONGO_PORT}:${MONGO_PORT} networks: - network mongo-secondary1: image: ${COMPOSE_PROJECT_NAME}/mongo container_name: ${COMPOSE_PROJECT_NAME}.mongo.secondary1.docker restart: unless-stopped env_file: envs/mongo.env volumes: - mongo.data.secondary1:/data/db networks: - network mongo-secondary2: image: ${COMPOSE_PROJECT_NAME}/mongo container_name: ${COMPOSE_PROJECT_NAME}.mongo.secondary2.docker restart: unless-stopped env_file: envs/mongo.env volumes: - mongo.data.secondary2:/data/db networks: - network networks: network: driver: bridge
启动所有节点后,进入主节点mongosh执行以下命令添加secondary节点:
rs.add("mongo-secondary1:27017") rs.add("mongo-secondary2:27017")
输入rs.status()可查看节点同步状态。
内容的提问来源于stack exchange,提问作者Majkon
相关产品推荐
相关产品推荐

