使用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版本
  • 检查安全补丁
  • 优化配置参数
相关推荐
功德+n1 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
小敬爱吃饭2 小时前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘
木子欢儿2 小时前
Docker Hub 镜像发布指南
java·spring cloud·docker·容器·eureka
coppher3 小时前
Ubuntu 22.04 amd64 离线安装 Docker 完整教程
linux·docker
虚伪的空想家5 小时前
k8s集群configmap和secrets备份脚本
linux·容器·kubernetes
SXJR5 小时前
k8s中的Pod
云原生·容器·kubernetes
文静小土豆5 小时前
K8s 滚动更新在 Java 应用中的实践与优化
java·容器·kubernetes
w6100104665 小时前
CKA-2026-Ingress
云原生·容器·kubernetes·cka
bloglin999996 小时前
docker logs 如何一直监听日志输出
运维·docker·容器
说实话起个名字真难啊6 小时前
Docker 入门之网络基础
网络·docker·php