Skip to content

Docker Compose 部署 MongoDB

Docker Compose 是部署 MongoDB 的理想工具,它可以通过一个简单的 YAML 文件定义和运行 MongoDB 容器。下面我将详细介绍如何使用 Docker Compose 部署 MongoDB,包括基础配置、生产环境优化以及集群部署方案。

1. 基础单机部署

1.1 创建项目目录结构

首先创建一个标准的目录结构来管理 MongoDB 配置和数据文件:

bash
mkdir mongodb-compose && cd mongodb-compose
mkdir -p data/db config

1.2 基础 docker-compose.yml 配置

在项目根目录创建docker-compose.yml文件,内容如下:

yaml
version: "3.8"
services:
  mongodb:
    image: mongo:6.0
    container_name: mongodb-server
    ports:
      - "27017:27017"
    volumes:
      - ./data/db:/data/db
      - ./config:/data/config
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin123
      - TZ=Asia/Shanghai
    command: --auth --config /data/config/mongod.conf
    restart: unless-stopped

这个配置定义了一个 MongoDB 服务,使用官方 6.0 镜像,将容器的 27017 端口映射到主机的 27017 端口,并挂载了数据目录和配置目录。

1.3 MongoDB 基础配置文件

config/mongod.conf中添加以下配置:

yaml
storage:
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1

net:
  bindIpAll: true
  port: 27017

security:
  authorization: enabled

2. 生产环境部署方案

2.1 完整生产环境配置

对于生产环境,建议使用以下增强配置:

yaml
version: "3.8"
services:
  mongodb:
    image: mongo:6.0
    container_name: production_mongodb
    environment:
      - MONGO_INITDB_ROOT_USERNAME=${MONGO_ROOT_USER}
      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD}
      - TZ=Asia/Shanghai
    ports:
      - "${MONGO_PORT}:27017"
    volumes:
      - mongodb_data:/data/db
      - ./config/mongod.conf:/data/config/mongod.conf:ro
      - ./backups:/backups
    networks:
      - mongodb_network
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 4G
    healthcheck:
      test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
      interval: 30s
      timeout: 5s
      retries: 3
    command:
      - --auth
      - --config /data/config/mongod.conf
      - --wiredTigerCacheSizeGB 1.5

volumes:
  mongodb_data:
    driver: local
    driver_opts:
      type: none
      device: ./data/db
      o: bind

networks:
  mongodb_network:
    driver: bridge

2.2 环境变量文件(.env)

创建.env文件管理敏感信息:

MONGO_ROOT_USER=admin
MONGO_ROOT_PASSWORD=your_strong_password_here
MONGO_PORT=27017

3. MongoDB 集群部署

3.1 副本集配置

要实现 MongoDB 副本集,可以使用以下配置:

yaml
version: "3.8"
services:
  mongodb-primary:
    image: mongo:6.0
    container_name: mongodb-primary
    command: mongod --replSet rs0 --bind_ip_all --auth
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin123
    ports:
      - "27017:27017"
    volumes:
      - ./primary/data:/data/db
      - ./primary/config:/data/config
    networks:
      - mongodb-cluster

  mongodb-secondary1:
    image: mongo:6.0
    container_name: mongodb-secondary1
    command: mongod --replSet rs0 --bind_ip_all --auth
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin123
    ports:
      - "27018:27017"
    volumes:
      - ./secondary1/data:/data/db
      - ./secondary1/config:/data/config
    depends_on:
      - mongodb-primary
    networks:
      - mongodb-cluster

  mongodb-secondary2:
    image: mongo:6.0
    container_name: mongodb-secondary2
    command: mongod --replSet rs0 --bind_ip_all --auth
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin123
    ports:
      - "27019:27017"
    volumes:
      - ./secondary2/data:/data/db
      - ./secondary2/config:/data/config
    depends_on:
      - mongodb-primary
    networks:
      - mongodb-cluster

networks:
  mongodb-cluster:
    driver: bridge

启动后需要初始化副本集:

bash
docker exec -it mongodb-primary mongosh -u admin -p admin123 --eval "rs.initiate({
  _id: 'rs0',
  members: [
    {_id: 0, host: 'mongodb-primary:27017'},
    {_id: 1, host: 'mongodb-secondary1:27017'},
    {_id: 2, host: 'mongodb-secondary2:27017'}
  ]
})"

4. 安全加固方案

4.1 安全配置示例

yaml
services:
  mongodb:
    image: mongo:6.0
    user: "mongodb:mongodb"
    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges:true
    environment:
      - MONGO_INITDB_ROOT_USERNAME=${MONGO_ROOT_USER}
      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD}
    command: >
      mongod 
      --auth 
      --bind_ip_all 
      --wiredTigerCacheSizeGB 1 
      --setParameter disableLogicalSessionCacheRefresh=true

4.2 网络隔离配置

yaml
networks:
  mongodb_internal:
    internal: true
  mongodb_external:
    driver: bridge

services:
  mongodb:
    networks:
      - mongodb_internal
  app:
    networks:
      - mongodb_internal
      - mongodb_external

5. 监控与维护

5.1 备份策略实现

yaml
services:
  mongodb-backup:
    image: mongo:6.0
    depends_on:
      - mongodb
    volumes:
      - ./backups:/backups
    command: >
      bash -c 'while true; do
        sleep 86400;
        mongodump --host mongodb --username $$MONGO_ROOT_USER --password $$MONGO_ROOT_PASSWORD --authenticationDatabase admin --out /backups/dump-$$(date +%Y%m%d);
      done'
    environment:
      MONGO_ROOT_USER: ${MONGO_ROOT_USER}
      MONGO_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD}

6. 常用命令参考

命令描述
docker-compose up -d启动服务(后台模式)
docker-compose down停止并移除容器
docker-compose logs -f mongodb查看 MongoDB 日志
docker-compose ps查看服务状态
docker-compose exec mongodb mongosh -u admin -p admin123进入 MongoDB Shell
docker-compose restart mongodb重启 MongoDB 服务

通过以上配置和最佳实践,你可以轻松地使用 Docker Compose 部署 MongoDB,无论是单机模式还是集群模式。根据你的具体需求,可以调整配置中的参数和选项。