從零搭建到生產(chǎn)環(huán)境配置詳解Docker部署MongoDB的完整流程
1. 引言
在容器化技術(shù)日益普及的今天,使用 Docker 部署 MongoDB 已經(jīng)成為開(kāi)發(fā)和生產(chǎn)環(huán)境的標(biāo)配方案。通過(guò)容器化部署,我們可以快速創(chuàng)建隔離的數(shù)據(jù)庫(kù)環(huán)境,確保在不同系統(tǒng)間的一致性和可移植性。MongoDB 官方在 Docker Hub 上維護(hù)了官方鏡像,拉取即用,大大簡(jiǎn)化了安裝配置流程。
本文將從基礎(chǔ)到進(jìn)階,帶你全面掌握 Docker 部署 MongoDB 的核心技能:
- 單節(jié)點(diǎn) MongoDB 快速部署
- 數(shù)據(jù)持久化與用戶認(rèn)證配置
- 使用 Docker Compose 編排完整服務(wù)棧
- 生產(chǎn)環(huán)境性能優(yōu)化與安全管理
- 副本集(Replica Set)集群搭建
無(wú)論你是開(kāi)發(fā)環(huán)境搭建,還是準(zhǔn)備將 MongoDB 容器化上生產(chǎn),本文都能提供實(shí)用的參考。
2. 環(huán)境準(zhǔn)備
開(kāi)始之前,請(qǐng)確保 Docker 已正確安裝并運(yùn)行:
# 檢查 Docker 服務(wù)狀態(tài) sudo service docker status # 確認(rèn) Docker 已安裝 docker --version
如果 Docker 尚未安裝,請(qǐng)參考官方文檔進(jìn)行安裝(Ubuntu/CentOS 等主流發(fā)行版均有詳細(xì)指南)。
3. 快速部署:?jiǎn)喂?jié)點(diǎn) MongoDB
3.1 拉取鏡像
# 拉取最新官方鏡像 docker pull mongo # 拉取指定版本(如 7.0.14) docker pull mongo:7.0.14
3.2 運(yùn)行容器(基礎(chǔ)版)
docker run -d --name mongodb -p 27017:27017 mongo
參數(shù)說(shuō)明:
-d:后臺(tái)運(yùn)行容器--name mongodb:指定容器名稱-p 27017:27017:將宿主機(jī)的 27017 端口映射到容器的 MongoDB 默認(rèn)端口
3.3 連接驗(yàn)證
# 進(jìn)入容器交互式 Shell docker exec -it mongodb mongosh
如果成功進(jìn)入 MongoDB Shell,說(shuō)明部署已完成。
4. 數(shù)據(jù)持久化:讓數(shù)據(jù)不丟失
容器默認(rèn)將數(shù)據(jù)存儲(chǔ)在容器內(nèi)部的 /data/db 目錄中,容器一旦刪除,所有數(shù)據(jù)都會(huì)丟失。Docker 提供了兩種數(shù)據(jù)持久化方式:
| 方式 | 說(shuō)明 | 適用場(chǎng)景 |
|---|---|---|
| 綁定掛載(Bind Mount) | 將宿主機(jī)目錄直接映射到容器 | 需要直接訪問(wèn)宿主機(jī)文件 |
| 命名卷(Named Volume) | Docker 管理的獨(dú)立存儲(chǔ)空間 | 生產(chǎn)環(huán)境推薦,便于備份遷移 |
4.1 綁定掛載(Bind Mount)
# 創(chuàng)建宿主機(jī)數(shù)據(jù)目錄 mkdir -p /data/mongodb # 啟動(dòng)容器并掛載目錄 docker run -d --name mongodb \ -p 27017:27017 \ -v /data/mongodb:/data/db \ mongo
關(guān)鍵點(diǎn):宿主機(jī)目錄必須存在且有正確權(quán)限,否則 MongoDB 容器可能因權(quán)限不足而啟動(dòng)失敗。
4.2 命名卷(Named Volume)
# 創(chuàng)建命名卷 docker volume create mongodb_data # 掛載卷啟動(dòng)容器 docker run -d --name mongodb \ -p 27017:27017 \ -v mongodb_data:/data/db \ mongo
為什么推薦命名卷? 命名卷完全由 Docker 管理,不依賴宿主機(jī)目錄結(jié)構(gòu),更易于備份、遷移和多容器共享。
5. 用戶認(rèn)證與安全配置
生產(chǎn)環(huán)境必須啟用身份認(rèn)證,確保數(shù)據(jù)庫(kù)不被未授權(quán)訪問(wèn)。
5.1 環(huán)境變量初始化(推薦方式)
MongoDB 官方鏡像支持通過(guò)環(huán)境變量在首次啟動(dòng)時(shí)自動(dòng)創(chuàng)建 Root 用戶:
docker run -d --name mongodb \ -p 27017:27017 \ -v mongodb_data:/data/db \ -e MONGO_INITDB_ROOT_USERNAME=admin \ -e MONGO_INITDB_ROOT_PASSWORD=your_secure_password \ mongo
重要提醒:
- 兩個(gè)變量必須同時(shí)設(shè)置,缺一不可,否則鏡像不會(huì)啟用鑒權(quán)。
- 變量名是固定的:
MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD是 MongoDB 官方鏡像定義的標(biāo)準(zhǔn)變量,不能改名。 - 僅在首次啟動(dòng)生效:如果數(shù)據(jù)目錄已有數(shù)據(jù),環(huán)境變量不會(huì)觸發(fā)初始化。如需重新初始化,必須刪除數(shù)據(jù)卷后再重啟。
5.2 驗(yàn)證鑒權(quán)是否生效
# 使用管理員憑證連接 docker exec -it mongodb mongosh -u admin -p your_secure_password --authenticationDatabase admin
連接后執(zhí)行以下命令驗(yàn)證權(quán)限:
# 切換至測(cè)試庫(kù)
use test
# 嘗試寫(xiě)入 - 應(yīng)報(bào)錯(cuò) "not authorized"(普通用戶無(wú)權(quán)限)
db.test.insertOne({x:1})
如果鑒權(quán)未生效,show dbs 等命令會(huì)直接列出所有數(shù)據(jù)庫(kù),說(shuō)明容器沒(méi)有啟用 --auth 模式。
6. Docker Compose 高級(jí)配置
使用 Docker Compose 可以更優(yōu)雅地管理多容器服務(wù)。以下是一個(gè)完整的 docker-compose.yml 示例,包含 MongoDB 數(shù)據(jù)庫(kù)和 Mongo Express 可視化管理界面:
version: '3.8'
services:
mongodb:
image: mongo:7.0.14
container_name: mongodb
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: your_secure_password
MONGO_INITDB_DATABASE: app_db
TZ: Asia/Shanghai
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
networks:
- mongodb_network
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 10s
timeout: 5s
retries: 5
mongo-express:
image: mongo-express:latest
container_name: mongo-express
restart: always
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: admin
ME_CONFIG_MONGODB_ADMINPASSWORD: your_secure_password
ME_CONFIG_MONGODB_SERVER: mongodb
ports:
- "8081:8081"
depends_on:
- mongodb
networks:
- mongodb_network
networks:
mongodb_network:
driver: bridge
volumes:
mongodb_data:6.1 自動(dòng)初始化腳本
上述配置中掛載了 init-mongo.js 腳本,該腳本會(huì)在 MongoDB 初始化時(shí)自動(dòng)執(zhí)行,可用于創(chuàng)建額外的數(shù)據(jù)庫(kù)和業(yè)務(wù)用戶:
// init-mongo.js
db = db.getSiblingDB('app_db');
db.createUser({
user: 'app_user',
pwd: 'app_user_password',
roles: [{ role: 'readWrite', db: 'app_db' }]
});
// 可選:創(chuàng)建集合或索引
db.createCollection('users');6.2 啟動(dòng)服務(wù)
# 后臺(tái)啟動(dòng)所有服務(wù) docker-compose up -d # 查看服務(wù)狀態(tài) docker-compose ps # 查看實(shí)時(shí)日志 docker-compose logs -f mongodb
啟動(dòng)成功后:
- MongoDB 服務(wù)監(jiān)聽(tīng)
27017端口 - Mongo Express 管理界面訪問(wèn)
http://localhost:8081,使用配置的管理員賬號(hào)登錄
7. 生產(chǎn)環(huán)境優(yōu)化與安全加固
7.1 內(nèi)存管理優(yōu)化
MongoDB 默認(rèn)使用 WiredTiger 存儲(chǔ)引擎,其緩存大小默認(rèn)為系統(tǒng)內(nèi)存的 50%–70%。在 Docker 容器中運(yùn)行時(shí),需要同時(shí)限制容器內(nèi)存和 WiredTiger 緩存。
容器級(jí)限制:
docker run -d --name mongodb \ -m 4g \ # 限制容器最大內(nèi)存 4GB --memory-swap 4g \ # 禁用 swap(可選) -v mongodb_data:/data/db \ mongo --wiredTigerCacheSizeGB 2 # 限制 WT 緩存為 2GB
核心原則:WiredTiger 緩存大小應(yīng)始終小于容器的內(nèi)存上限,并為操作系統(tǒng)和其他進(jìn)程預(yù)留 10%–20% 的空間。在 Docker 或 Kubernetes 環(huán)境中,建議按可用內(nèi)存比例的 50%–60% 配置 cacheSizeGB。
Docker Compose 中的配置:
services:
mongodb:
image: mongo:7.0.14
deploy:
resources:
limits:
memory: 4G
command: ["--wiredTigerCacheSizeGB", "2"]7.2 常見(jiàn)性能問(wèn)題定位
| 現(xiàn)象 | 可能原因 | 排查方法 |
|---|---|---|
| 內(nèi)存占用持續(xù)增長(zhǎng) | WiredTiger 緩存未限制 | db.serverStatus().wiredTiger.cache 查看 bytes currently in the cache |
| 寫(xiě)入延遲抖動(dòng) | 臟頁(yè)過(guò)多,檢查點(diǎn)卡頓 | bytes dirty in the cache 持續(xù)偏高,可調(diào)低 vm.dirty_ratio |
| 高并發(fā)下連接失敗 | 連接池耗盡 | db.serverStatus().connections 查看連接數(shù),應(yīng)用端優(yōu)化連接復(fù)用 |
7.3 跨服務(wù)依賴與健康檢查
當(dāng) MongoDB 作為依賴服務(wù)(如與 Spring Boot、Node.js 等應(yīng)用共享網(wǎng)絡(luò))時(shí),需要在 docker-compose.yml 中配置健康檢查,確保依賴容器在數(shù)據(jù)庫(kù)完全就緒后才啟動(dòng)。
services:
mongodb:
image: mongo:7.0.14
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 10s
timeout: 5s
retries: 5
myapp:
image: myapp:latest
depends_on:
mongodb:
condition: service_healthy # 等待 MongoDB 健康后再啟動(dòng)7.4 安全加固清單
- 啟用身份認(rèn)證(設(shè)置 Root 用戶密碼)
- 使用非默認(rèn)端口(通過(guò)
-p映射) - 將密碼通過(guò)環(huán)境變量或 Docker Secrets 注入,避免寫(xiě)死在鏡像中
- 定期執(zhí)行
docker exec <container> mongodump備份數(shù)據(jù) - 考慮使用 TLS/SSL 加密客戶端與服務(wù)端通信(需掛載證書(shū)文件)
8. 備份與恢復(fù)
8.1 數(shù)據(jù)備份(mongodump)
# 進(jìn)入容器執(zhí)行備份 docker exec mongodb mongodump --out /data/db/backup # 將備份文件復(fù)制到宿主機(jī) docker cp mongodb:/data/db/backup ./mongodb_backup
備份文件默認(rèn)生成在 dump 目錄下,包含 BSON 格式的數(shù)據(jù)文件。
8.2 數(shù)據(jù)恢復(fù)(mongorestore)
# 將備份文件復(fù)制到容器 docker cp ./mongodb_backup mongodb:/data/db/backup # 進(jìn)入容器執(zhí)行恢復(fù) docker exec mongodb mongorestore /data/db/backup
定期備份腳本:可將上述命令寫(xiě)成定時(shí)任務(wù)(cron job),每日自動(dòng)備份,并將備份文件同步到遠(yuǎn)程存儲(chǔ)。
9. 副本集(Replica Set)集群搭建(進(jìn)階)
對(duì)于需要高可用的生產(chǎn)環(huán)境,單節(jié)點(diǎn) MongoDB 存在單點(diǎn)故障風(fēng)險(xiǎn)。副本集(Replica Set)是有自動(dòng)故障恢復(fù)功能的主從集群,包含一個(gè) Primary 節(jié)點(diǎn)和一個(gè)或多個(gè) Secondary 節(jié)點(diǎn),主節(jié)點(diǎn)故障時(shí)集群會(huì)自動(dòng)選舉新主節(jié)點(diǎn)。
使用 Docker Compose 搭建一主兩從副本集的完整配置如下:
version: '3.8'
services:
mongo-primary:
image: mongo:7.0
container_name: mongo-primary
command: ["--replSet", "rs0", "--bind_ip_all"]
ports:
- "27017:27017"
volumes:
- mongo_primary_data:/data/db
networks:
- mongo_cluster
mongo-secondary-1:
image: mongo:7.0
container_name: mongo-secondary-1
command: ["--replSet", "rs0", "--bind_ip_all"]
ports:
- "27018:27017"
volumes:
- mongo_secondary1_data:/data/db
networks:
- mongo_cluster
depends_on:
- mongo-primary
mongo-secondary-2:
image: mongo:7.0
container_name: mongo-secondary-2
command: ["--replSet", "rs0", "--bind_ip_all"]
ports:
- "27019:27017"]
volumes:
- mongo_secondary2_data:/data/db
networks:
- mongo_cluster
depends_on:
- mongo-primary
networks:
mongo_cluster:
driver: bridge
volumes:
mongo_primary_data:
mongo_secondary1_data:
mongo_secondary2_data:9.1 初始化副本集
容器啟動(dòng)后,需要手動(dòng)執(zhí)行初始化命令:
# 進(jìn)入主節(jié)點(diǎn)容器
docker exec -it mongo-primary mongosh
# 在 MongoDB Shell 中執(zhí)行
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo-primary:27017" },
{ _id: 1, host: "mongo-secondary-1:27017" },
{ _id: 2, host: "mongo-secondary-2:27017" }
]
})
初始化后,可通過(guò) rs.status() 查看集群狀態(tài)。當(dāng)主節(jié)點(diǎn)故障時(shí),剩余節(jié)點(diǎn)會(huì)自動(dòng)選舉新的 Primary,實(shí)現(xiàn)高可用。
10. 常見(jiàn)問(wèn)題排查
| 問(wèn)題 | 原因 | 解決方案 |
|---|---|---|
容器啟動(dòng)失敗,日志顯示 permission denied | 宿主機(jī)掛載目錄權(quán)限不足 | 使用命名卷而非綁定掛載,或手動(dòng)設(shè)置目錄權(quán)限 |
MONGO_INITDB_ROOT_USERNAME 環(huán)境變量不生效 | 數(shù)據(jù)目錄非空時(shí)不會(huì)觸發(fā)初始化 | 刪除數(shù)據(jù)卷后重新創(chuàng)建:docker-compose down -v |
| MongoDB 連接超時(shí)或拒絕連接 | 端口映射錯(cuò)誤或容器未就緒 | 檢查 docker ps 確認(rèn)容器狀態(tài),配合健康檢查確保服務(wù)完全啟動(dòng) |
| 副本集節(jié)點(diǎn)無(wú)法加入集群 | 容器間網(wǎng)絡(luò)不通或 bind_ip 配置錯(cuò)誤 | 確保所有容器在同一 Docker 網(wǎng)絡(luò),且 command 中設(shè)置了 --bind_ip_all |
11. 總結(jié)
通過(guò)本文,你應(yīng)該已經(jīng)掌握了 Docker 部署 MongoDB 的核心技能。核心回顧:
- 數(shù)據(jù)持久化:區(qū)分綁定掛載(Bind Mount)和命名卷(Named Volume),生產(chǎn)環(huán)境優(yōu)先選擇命名卷
- 用戶認(rèn)證:務(wù)必同時(shí)設(shè)置
MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD,兩個(gè)變量缺一不可 - 資源管理:同時(shí)限制容器內(nèi)存和 WiredTiger 緩存,緩存大小建議為容器內(nèi)存的 50%–60%
- 自動(dòng)化部署:使用 Docker Compose + 初始化腳本,實(shí)現(xiàn)一鍵啟動(dòng)和數(shù)據(jù)庫(kù)初始化
- 高可用:副本集(Replica Set)主從集群實(shí)現(xiàn)自動(dòng)故障轉(zhuǎn)移
Docker 容器化部署讓 MongoDB 變得前所未有的輕量和可移植,無(wú)論是開(kāi)發(fā)測(cè)試環(huán)境還是生產(chǎn)環(huán)境,都能快速交付一致可靠的數(shù)據(jù)庫(kù)服務(wù)。
以上就是從零搭建到生產(chǎn)環(huán)境配置詳解Docker部署MongoDB的完整流程的詳細(xì)內(nèi)容,更多關(guān)于Docker部署MongoDB的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
jenkins+gitlab+nginx部署前端應(yīng)用實(shí)現(xiàn)
在日常開(kāi)發(fā)中,往往可能同時(shí)多個(gè)項(xiàng)目并行進(jìn)行開(kāi)發(fā),本文介紹了jenkins+gitlab+nginx部署前端應(yīng)用實(shí)現(xiàn),感興趣的可以了解一下2021-05-05
docker-compose集成Jenkins部署,打包,發(fā)布方式
在Docker環(huán)境中安裝配置Jenkins,需掛載JDK、Maven等至容器指定路徑,設(shè)置國(guó)內(nèi)鏡像提升下載速度,并添加插件與憑據(jù)完成環(huán)境配置2024-10-10
Docker load命令進(jìn)行鏡像恢復(fù)與遷移的完整指南
docker load 是 Docker 鏡像生命周期管理的關(guān)鍵命令,它與 docker save 配合實(shí)現(xiàn)鏡像的離線遷移和環(huán)境復(fù)制,是企業(yè)級(jí)容器化部署的基礎(chǔ)工具,下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧2025-09-09
詳解用Docker搭建Laravel和Vue項(xiàng)目的開(kāi)發(fā)環(huán)境
這篇文章主要介紹了詳解用Docker搭建Laravel和Vue項(xiàng)目的開(kāi)發(fā)環(huán)境,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
Docker創(chuàng)建MongoDB容器并添加root密碼驗(yàn)證與更多用戶詳細(xì)步驟
MongoDB是一個(gè)著名的面向文檔的數(shù)據(jù)庫(kù),被許多現(xiàn)代Web應(yīng)用程序使用,下面這篇文章主要給大家介紹了關(guān)于Docker創(chuàng)建MongoDB容器并添加root密碼驗(yàn)證與更多用戶的相關(guān)資料,需要的朋友可以參考下2023-01-01
rocketmq-streams的ILeaseService使用示例詳解
這篇文章主要為大家介紹了rocketmq-streams的ILeaseService使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Docker訪問(wèn)容器中的Spring Boot日志的幾種方法
在本文中,我們將演示如何在Docker容器中訪問(wèn)Spring Boot日志,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04
Docker Compose容器編排深度解析與實(shí)戰(zhàn)小結(jié)
Docker Compose 是 Docker 官方推出的開(kāi)源項(xiàng)目,用于定義和運(yùn)行多個(gè) Docker 容器的應(yīng)用工具,簡(jiǎn)化了多容器應(yīng)用的部署和管理,本文介紹Docker Compose:容器編排深度解析與實(shí)戰(zhàn)指南,感興趣的朋友一起看看吧2025-12-12

