MongoDB 8.0 Docker Compose 部署指南

使用 Docker Compose 一键部署 MongoDB 8.0(官方镜像 mongo:8.0),涵盖数据目录与配置文件持久化挂载、常用环境变量、鉴权与健康检查,并给出等价的 docker run 运行方式。

MongoDBMongoDB安装部署容器化文档型NoSQL2026/09/27

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.0MongoDB 8.0(当前最新稳定系列)官方维护,含全部小版本安全修复
mongo:7MongoDB 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_USERNAMEadmin初始管理员用户名(首次初始化生效)
MONGO_INITDB_ROOT_PASSWORD(必填,无默认)初始管理员密码
MONGO_INITDB_DATABASEapp_db首次初始化自动创建的默认数据库(并为管理员授权)
TZ镜像默认(UTC)容器时区,建议与宿主机一致

⚠️ 安全提醒:MONGO_INITDB_ROOT_PASSWORD 属于敏感值,务必通过环境变量注入,禁止写入 yaml 明文。生产环境可用 Docker secrets 或密码管理工具注入。

七、配置文件说明(conf/mongod.conf)

配置项默认值说明
storage.dbPath/data/db数据目录,与数据卷 ./data:/data/db 对应
net.port27017容器内监听端口(对外映射 17017)
net.bindIp0.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 平台开发