使用docker 创建MongoDB副本集配置完整指南

一、准备工作

  1. 创建项目目录
bash 复制代码
mkdir mongodb-replica
cd mongodb-replica
  1. 创建必要的子目录
bash 复制代码
mkdir scripts
mkdir data

二、生成密钥文件

  1. 生成MongoDB密钥文件
bash 复制代码
openssl rand -base64 756 > mongodb-keyfile
chmod 400 mongodb-keyfile

三、创建初始化脚本

  1. 创建setup.sh脚本
bash 复制代码
touch scripts/setup.sh
chmod +x scripts/setup.sh
  1. 编写setup.sh内容
bash 复制代码
#!/bin/bash
sleep 30 
mongosh --host mongo1:27017 -u root -p example --authenticationDatabase admin <<EOF
rs.initiate({
  _id: "myReplicaSet",
  members: [
    { _id: 0, host: "mongo1:27017" },
    { _id: 1, host: "mongo2:27017" },
    { _id: 2, host: "mongo3:27017" }
  ]
})
EOF

四、配置Docker Compose

  1. 创建docker-compose.yml文件
yaml 复制代码
version: '3.8'
services:
  mongo1:
    image: mongo:latest
    container_name: mongo1
    command: mongod --replSet myReplicaSet --bind_ip 0.0.0.0 --keyFile /data/mongodb-keyfile
    networks:
      - mongo-replica
    ports:
      - "27017:27017"
    volumes:
      - ./data/mongo1:/data/db
      - ./mongodb-keyfile:/data/mongodb-keyfile:ro
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongosh --quiet --eval "db.runCommand('ping').ok" localhost:27017/admin -u root -p example
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s

  mongo2:
    image: mongo:latest
    container_name: mongo2
    command: mongod --replSet myReplicaSet --bind_ip 0.0.0.0 --keyFile /data/mongodb-keyfile
    networks:
      - mongo-replica
    ports:
      - "27018:27017"
    volumes:
      - ./data/mongo2:/data/db
      - ./mongodb-keyfile:/data/mongodb-keyfile:ro
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongosh --quiet --eval "db.runCommand('ping').ok" localhost:27017/admin -u root -p example
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s
    depends_on:
      mongo1:
        condition: service_healthy

  mongo3:
    image: mongo:latest
    container_name: mongo3
    command: mongod --replSet myReplicaSet --bind_ip 0.0.0.0 --keyFile /data/mongodb-keyfile
    networks:
      - mongo-replica
    ports:
      - "27019:27017"
    volumes:
      - ./data/mongo3:/data/db
      - ./mongodb-keyfile:/data/mongodb-keyfile:ro
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongosh --quiet --eval "db.runCommand('ping').ok" localhost:27017/admin -u root -p example
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s
    depends_on:
      mongo1:
        condition: service_healthy

  mongo-setup:
    image: mongo:latest
    container_name: mongo-setup
    restart: on-failure
    networks:
      - mongo-replica
    depends_on:
      mongo1:
        condition: service_healthy
      mongo2:
        condition: service_healthy
      mongo3:
        condition: service_healthy
    volumes:
      - ./scripts:/scripts
      - ./mongodb-keyfile:/data/mongodb-keyfile:ro
    entrypoint: [ "bash", "/scripts/setup.sh" ]

networks:
  mongo-replica:
    driver: bridge

五、启动服务

  1. 启动MongoDB副本集
bash 复制代码
docker-compose up -d
  1. 查看服务状态
bash 复制代码
docker-compose ps

六、验证配置

  1. 检查副本集状态
bash 复制代码
docker exec mongo1 mongosh --eval "rs.status()" -u root -p example
  1. 测试写入操作
bash 复制代码
docker exec mongo1 mongosh -u root -p example --eval '
db = db.getSiblingDB("test");
db.test.insertOne({x: 1});
'

七、重要说明

  1. 端口映射
  • mongo1: 27017
  • mongo2: 27018
  • mongo3: 27019
  1. 认证信息
  • 用户名:root
  • 密码:example
  • 认证数据库:admin
  1. 数据持久化
  • 数据存储在 ./data 目录下
  • 每个节点有独立的子目录
  1. 安全注意事项
  • 密钥文件权限必须为400
  • 生产环境建议修改默认密码
  • 建议配置防火墙规则

八、常见问题处理

  1. 服务无法启动
  • 检查端口占用
  • 检查目录权限
  • 检查密钥文件权限
  1. 副本集初始化失败
  • 检查网络连接
  • 检查认证信息
  • 检查setup.sh脚本权限
  1. 数据同步问题
  • 检查节点健康状态
  • 检查网络连接
  • 检查日志信息

九、维护建议

  1. 定期备份
  • 使用mongodump进行数据备份
  • 保存配置文件
  • 记录集群状态
  1. 监控
  • 监控节点状态
  • 监控数据同步
  • 监控系统资源
  1. 更新维护
  • 定期更新MongoDB版本
  • 检查安全补丁
  • 优化配置参数
相关推荐
三坛海会大神5551 小时前
k8s(六)Pod的资源控制器
云原生·容器·kubernetes
缘的猿1 小时前
Docker 与 K8s 网络模型全解析
docker·容器·kubernetes
Super Rookie2 小时前
MongoDB 自动化脚本安装方案
数据库·mongodb·自动化
Code哈哈笑2 小时前
【MongoDB 基本语法】数据库和集合的基本操作--探秘 MongoDB
数据库·mongodb
运维栈记2 小时前
使用Grafana监控K8S中的异常Pod
docker·kubernetes·grafana
荣光波比2 小时前
K8S(十二)—— Kubernetes安全机制深度解析与实践:从认证到RBAC授权
安全·容器·kubernetes
liming4952 小时前
k8s 安装 kuboardV3 报错
云原生·容器·kubernetes
东城绝神4 小时前
《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.21.5容器版集群》
linux·运维·docker·架构·consul
小醉你真好5 小时前
17、Centos9 安装 1Panel
linux·docker·运维开发
明灯L9 小时前
《Kubernetes 集群搭建全指南:从核心概念到环境部署!》
云原生·容器·kubernetes