MongoDB 副本集容器化配置

使用 Docker Compose 部署带认证的 MongoDB 副本集,包含 keyfile 生成和初始化脚本的幂等性处理。以下配置示例支持快速搭建三节点副本集。

Docker Compose 文件

version: '3.8'

services:
  mongo1:
    image: mongo:5.0
    container_name: mongo1
    restart: always
    ports:
      - "27017:27017"
    volumes:
      - ./keyfile:/data/keyfile
      - ./init.js:/docker-entrypoint-initdb.d/init.js
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    command: mongod --replSet rs0 --keyFile /data/keyfile --auth

  mongo2:
    image: mongo:5.0
    container_name: mongo2
    restart: always
    ports:
      - "27018:27017"
    volumes:
      - ./keyfile:/data/keyfile
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    command: mongod --replSet rs0 --keyFile /data/keyfile --auth

  mongo3:
    image: mongo:5.0
    container_name: mongo3
    restart: always
    ports:
      - "27019:27017"
    volumes:
      - ./keyfile:/data/keyfile
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    command: mongod --replSet rs0 --keyFile /data/keyfile --auth

Keyfile 生成步骤

在宿主机生成 keyfile 并设置权限:

openssl rand -base64 756 > keyfile
chmod 400 keyfile

初始化脚本 (init.js)

幂等性初始化脚本,放置在 docker-entrypoint-initdb.d/ 目录下自动执行:

// 检查是否已初始化
rs.status().ok || rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "mongo1:27017" },
    { _id: 1, host: "mongo2:27017" },
    { _id: 2, host: "mongo3:27017" }
  ]
});

// 创建应用数据库用户(幂等操作)
try {
  db.getSiblingDB("appdb").createUser({
    user: "appuser",
    pwd: "apppass",
    roles: [{ role: "readWrite", db: "appdb" }]
  });
} catch (e) {
  // 用户已存在时忽略错误
  if (e.code !== 51003) throw e;
}

操作命令

启动副本集:

docker-compose up -d

手动连接验证(主节点):

docker exec -it mongo1 mongosh -u root -p example

强制重新配置副本集(故障恢复时):

rs.reconfig(cfg, {force: true})

注意事项

  • 所有容器必须共享相同的 keyfile
  • 初始化脚本仅在主节点首次启动时执行
  • 生产环境应使用更复杂的密码和权限配置
  • 网络延迟可能导致初始化需要等待节点完全启动

该配置实现了带认证的MongoDB副本集容器化方案,初始化过程具有幂等性,适合快速搭建开发测试环境。

ilo.n8d3po3s.INFo

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐