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,无论是单机模式还是集群模式。根据你的具体需求,可以调整配置中的参数和选项。