MongoDB 8.0 Docker Compose 部署指南
使用 Docker Compose 一键部署 MongoDB 8.0(官方镜像 mongo:8.0),涵盖数据目录与配置文件持久化挂载、常用环境变量、鉴权与健康检查,并给出等价的 docker run 运行方式。
MongoDB 8.0 Docker Compose 部署指南
目标:使用 Docker Compose 一键部署 MongoDB 8.0(官方镜像
mongo:8.0),涵盖数据目录持久化、配置文件持久化(conf 挂载)、常用环境变量、鉴权与健康检查,并给出等价的docker run运行方式。本文档已在/opt/data/ops/mongodb目录实测通过(容器 healthy、重启数据保留、无凭据访问被拒绝)。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- 系统架构:x86_64
- Docker 版本:Docker Engine 27.x(含 Compose v2 插件)
- 镜像版本:
mongo:8.0(对应 MongoDB 8.0.32,与《Ubuntu 22.04 安装 MongoDB 8.0 指南》版本一致) - 容器名称:
mongo-8-0 - 端口映射:宿主机
17017→ 容器27017 - 数据目录:宿主机
/opt/data/ops/mongodb/data(挂载到容器/data/db) - 配置目录:宿主机
/opt/data/ops/mongodb/conf(挂载到容器/etc/mongod.conf) - 部署文件:
/opt/data/ops/mongodb/docker-compose.yaml
二、镜像选型说明
| 镜像标签 | 对应版本 | 特点 |
|---|---|---|
mongo:8.0 | MongoDB 8.0(当前最新稳定系列) | 官方维护,含全部小版本安全修复 |
mongo:7 | MongoDB 7.0 系列 | 上一代稳定版 |
mongo:latest | 最新稳定版(当前指向 8.0) | 版本会随上游变化,不建议生产锁定 |
💡 说明:官方镜像仓库为
docker.io/library/mongo。国内拉取可配置阿里云 / daocloud 镜像加速器,或通过中转节点拉取后docker load导入宿主机(本文档实测即采用此方式,镜像已 load 到宿主机)。
三、前置条件
- 已安装 Docker Engine 与 Docker Compose 插件:
docker --version && docker compose version - 已规划数据目录(建议放在独立磁盘,避免系统盘被数据占满)
- 已准备好强密码(禁止使用默认/弱密码,见"六、常用环境变量表"章节)
四、部署步骤
4.1 创建部署目录
sudo mkdir -p /opt/data/ops/mongodb
cd /opt/data/ops/mongodb
4.2 编写 docker-compose.yaml
将以下内容保存为 /opt/data/ops/mongodb/docker-compose.yaml:
# =============================================================================
# MongoDB 8.0 Docker Compose 部署文件
# 镜像版本:mongo:8.0(对应 MongoDB 8.0.32,与《Ubuntu 22.04 安装 MongoDB 8.0 指南》版本一致)
# 使用方式:cd /opt/data/ops/mongodb && docker compose up -d
# 密码等敏感值通过环境变量注入,请先 export(见文档"六、常用环境变量表"章节)
# =============================================================================
services:
mongodb:
# 镜像版本:8.0 官方镜像
image: mongo:8.0
# 容器名称,方便 docker ps / docker logs 定位
container_name: mongo-8-0
# 重启策略:容器异常退出时自动重启(除非手动 stop)
restart: unless-stopped
# ---- 常用环境变量配置(值由外部环境变量注入)----
environment:
- TZ=Asia/Shanghai # 容器时区(与宿主机一致)
- MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME:-admin} # 初始管理员用户名
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD:?请在环境变量中设置} # 初始管理员密码(首次初始化生效)
- MONGO_INITDB_DATABASE=${MONGO_INITDB_DATABASE:-app_db} # 自动创建的默认数据库
# ---- 端口映射:宿主机17017 -> 容器27017 ----
ports:
- "17017:27017"
# ---- 数据持久化(重要)----
# ./data 为宿主机数据目录,重启容器数据不丢失
volumes:
- ./data:/data/db
# ---- 配置文件持久化(重要)----
# ./conf 为宿主机配置目录,mongod 默认自动读取 /etc/mongod.conf,
# 编辑 ./conf/mongod.conf 后 docker compose restart mongodb 即可生效
- ./conf/mongod.conf:/etc/mongod.conf
# ---- 健康检查:mongosh ping 判断数据库就绪 ----
healthcheck:
test: ["CMD-SHELL", "mongosh --quiet --username $${MONGO_INITDB_ROOT_USERNAME} --password $${MONGO_INITDB_ROOT_PASSWORD} --authenticationDatabase admin --eval \"db.adminCommand('ping').ok\""]
interval: 10s # 每 10 秒检查一次
timeout: 5s # 单次检查超时
retries: 10 # 连续 10 次失败视为不健康
start_period: 30s # 启动后 30 秒才开始检查
# 容器日志大小限制,防止磁盘被日志占满
logging:
driver: json-file
options:
max-size: "50m"
max-file: "3"
💡 说明:
MONGO_INITDB_ROOT_*仅在首次初始化数据目录时创建管理员账号;数据目录已存在时这些变量不生效(与 MySQL 的MYSQL_ROOT_PASSWORD行为一致)。mongod默认自动读取/etc/mongod.conf,因此无需在command中额外指定配置路径。
4.3 创建自定义配置文件
将以下内容保存为 /opt/data/ops/mongodb/conf/mongod.conf:
# MongoDB 自定义配置文件(挂载到 /etc/mongod.conf,mongod 启动时自动读取)
# 修改后重启容器生效:docker compose restart mongodb
# 数据存储目录(对应数据卷 ./data:/data/db)
storage:
dbPath: /data/db
# 日志输出
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# 网络监听:0.0.0.0 监听所有网卡(配合端口映射供外部连接)
net:
port: 27017
bindIp: 0.0.0.0
# 进程运行配置
processManagement:
timeZoneInfo: /usr/share/zoneinfo
# 更多常用参数示例(按需取消注释):
# security:
# authorization: enabled # 启用账号鉴权(镜像在设置初始管理员时会自动追加 --auth)
# storage:
# wiredTiger:
# engineConfig:
# cacheSizeGB: 1 # WiredTiger 缓存大小(建议为物理内存的 50%)
# operationProfiling:
# mode: slowOp # 慢查询分析:off/slowOp/all
# slowOpThresholdMs: 100 # 慢查询阈值(毫秒)
# slowOpSampleRate: 1.0
💡 说明:镜像 entrypoint 在设置了
MONGO_INITDB_ROOT_*后会自动追加--auth参数启动,因此 conf 中无需显式开启security.authorization(保留注释示例供无环境变量场景使用)。
4.4 设置环境变量并启动
# 注入密码(首次初始化生效,容器重建后需保持一致才能正常读取数据目录)
export MONGO_INITDB_ROOT_PASSWORD='your-password'
docker compose up -d
💡 说明:
${MONGO_INITDB_ROOT_PASSWORD:?请在环境变量中设置}语法表示:若该环境变量未设置,docker compose up会直接报错退出,防止密码缺失导致初始化失败或使用默认值。
4.5 验证部署
# 查看容器状态(healthy 表示健康检查通过)
docker ps --filter name=mongo-8-0
# 使用管理员账号连接测试
docker exec -it mongo-8-0 mongosh -u admin -p "$MONGO_INITDB_ROOT_PASSWORD" --authenticationDatabase admin --eval "db.runCommand({ ping: 1 })"
# 验证鉴权生效(无凭据访问应被拒绝)
docker exec -it mongo-8-0 mongosh --eval "db.runCommand({ ping: 1 })"
执行结果(鉴权验证):
MongoServerError: Command find requires authentication
💡 说明:无凭据访问返回认证错误,确认鉴权已强制生效。健康检查每 10 秒用管理员凭据 ping 一次,失败 10 次容器标记为 unhealthy。
五、数据持久化说明
- 数据目录映射:
./data:/data/db,MongoDB 的集合数据、索引、journal 全部落在宿主机./data目录。 - 配置目录映射:
./conf/mongod.conf:/etc/mongod.conf,自定义配置落在宿主机./conf,修改后docker compose restart mongodb生效。 - 重启容器(
docker compose restart/docker compose up -d)数据不丢失(含 AOF/RDB 类似机制:journal 恢复)。 - 删除容器不会删除数据:
docker compose down只移除容器,卷目录./data与./conf仍在;只有docker compose down -v才会删除卷数据。 - 备份:对宿主机
./data目录做快照/rsync,或使用mongodump逻辑备份双保险。 - 权限说明:
mongo:8.0镜像内 mongod 以mongodb用户(uid 999)运行,首次启动时镜像会自动对挂载目录做chown,无需手动处理权限。
六、常用环境变量表
| 环境变量 | 默认值 | 说明 |
|---|---|---|
MONGO_INITDB_ROOT_USERNAME | admin | 初始管理员用户名(首次初始化生效) |
MONGO_INITDB_ROOT_PASSWORD | (必填,无默认) | 初始管理员密码 |
MONGO_INITDB_DATABASE | app_db | 首次初始化自动创建的默认数据库(并为管理员授权) |
TZ | 镜像默认(UTC) | 容器时区,建议与宿主机一致 |
⚠️ 安全提醒:
MONGO_INITDB_ROOT_PASSWORD属于敏感值,务必通过环境变量注入,禁止写入 yaml 明文。生产环境可用 Docker secrets 或密码管理工具注入。
七、配置文件说明(conf/mongod.conf)
| 配置项 | 默认值 | 说明 |
|---|---|---|
storage.dbPath | /data/db | 数据目录,与数据卷 ./data:/data/db 对应 |
net.port | 27017 | 容器内监听端口(对外映射 17017) |
net.bindIp | 0.0.0.0 | 监听所有网卡,配合端口映射供外部连接 |
security.authorization | 由镜像自动追加 --auth | 账号鉴权开关(默认已通过环境变量方案强制) |
storage.wiredTiger.engineConfig.cacheSizeGB | 物理内存 50% | WiredTiger 缓存上限(按需显式调整) |
八、等价 docker run 运行方式
不使用 Compose 时,可用以下 docker run 达到相同效果:
# 先注入环境变量
export MONGO_INITDB_ROOT_PASSWORD='your-password'
docker run -d \
--name mongo-8-0 \
--restart unless-stopped \
-e TZ=Asia/Shanghai \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD="$MONGO_INITDB_ROOT_PASSWORD" \
-e MONGO_INITDB_DATABASE=app_db \
-p 17017:27017 \
-v /opt/data/ops/mongodb/data:/data/db \
-v /opt/data/ops/mongodb/conf/mongod.conf:/etc/mongod.conf \
--health-cmd='mongosh --quiet --username "$MONGO_INITDB_ROOT_USERNAME" --password "$MONGO_INITDB_ROOT_PASSWORD" --authenticationDatabase admin --eval "db.adminCommand(\"ping\").ok"' \
--health-interval=10s \
--health-timeout=5s \
--health-retries=10 \
--health-start-period=30s \
mongo:8.0
参数对照:
| Compose 写法 | docker run 写法 |
|---|---|
image: mongo:8.0 | 末尾镜像名 mongo:8.0 |
container_name | --name |
restart: unless-stopped | --restart unless-stopped |
environment | -e KEY=value |
ports: "17017:27017" | -p 17017:27017 |
volumes: ./data:/data/db | -v /opt/data/ops/mongodb/data:/data/db |
volumes: ./conf/mongod.conf:/etc/mongod.conf | -v /opt/data/ops/mongodb/conf/mongod.conf:/etc/mongod.conf |
healthcheck | --health-cmd / --health-interval 等 |
💡 说明:
--health-cmd中"$MONGO_INITDB_ROOT_PASSWORD"会被 shell 展开为容器内环境变量值,故无需转义$(与 Compose 中需$$转义不同)。
九、常用运维命令
# 查看日志
docker logs -f mongo-8-0
# 重启容器(数据保留)
docker compose restart
# 停止并移除容器(保留数据)
docker compose down
# 彻底移除容器 + 数据目录(谨慎操作!)
docker compose down -v
# 进入 mongosh 交互
docker exec -it mongo-8-0 mongosh -u admin -p "$MONGO_INITDB_ROOT_PASSWORD" --authenticationDatabase admin
十、常见问题(FAQ)
10.1 容器反复重启(Exited / Restarting 循环)?
查看日志定位:docker logs mongo-8-0。常见原因:① 数据目录权限不对(sudo chown -R 999:999 /opt/data/ops/mongodb/data);② conf 中 dbPath 与挂载目录不一致;③ conf 为非法 YAML(禁止 Tab 缩进)。
10.2 端口映射失败:宿主机 17017 已被占用?
修改 ports 为其他宿主机端口,如 "17018:27017"。注意客户端连接地址随之变化。
10.3 修改密码后连接报 Authentication failed?
MONGO_INITDB_ROOT_PASSWORD只在首次初始化数据目录时生效;数据目录已存在时修改该变量不会改变管理员密码。- 已部署后改密请用命令:
docker exec -it mongo-8-0 mongosh -u admin -p 旧密码 --authenticationDatabase admin --eval 'db.changeUserPassword("admin", "新密码")'。
10.4 无凭据也能连上(鉴权未生效)?
确认环境变量已设置且数据目录是首次初始化;镜像只有在设置了 MONGO_INITDB_ROOT_* 且数据目录为空时才创建管理员并启用 --auth。已存在的旧数据目录需手动启用鉴权(见 conf 中 security.authorization 注释)。
10.5 容器重启后数据还在吗?
在:docker compose restart / down 后 up -d 都不会删除 ./data 目录。只有 docker compose down -v 会删除卷数据。
10.6 如何自定义更多参数?
直接编辑 ./conf/mongod.conf 追加配置段(如 operationProfiling、replication),然后 docker compose restart mongodb 即生效,无需改动 yaml。参数含义参考《MongoDB 8 配置参数详解》文档。
十一、参考链接
本文档由 www.quzuo.net 平台开发