内容简介
本文详细介绍MongoDB容器化部署的实战操作,包括Docker基础、MongoDB容器化部署、Docker Compose编排、Kubernetes部署等内容。风哥教程参考MongoDB官方文档和容器化最佳实践,提供完整的容器化部署方案。
通过本文学习,您将掌握MongoDB容器化部署的核心技术和实战经验,能够在容器环境中高效部署和管理MongoDB。
本文适合MongoDB管理员、DevOps工程师和开发人员阅读,帮助大家构建现代化的MongoDB容器化部署环境。
目录大纲
Part01-基础概念与理论知识
1.1 容器化技术概述
容器化技术的核心概念:
- Docker:开源的容器化平台
- 容器:轻量级的隔离运行环境
- 镜像:容器的模板
- Docker Compose:多容器编排工具
- Kubernetes:容器编排平台
容器化的优势:
- 环境一致性
- 快速部署
- 资源隔离
- 可扩展性
- 易于管理
更多视频教程www.fgedu.net.cn
1.2 MongoDB容器化优势
MongoDB容器化优势
快速部署:无需复杂的安装配置
环境一致性:避免环境差异导致的问题
资源隔离:每个MongoDB实例独立运行
易于扩展:快速部署多个MongoDB实例
版本管理:方便切换不同版本的MongoDB
1.3 部署架构设计
MongoDB容器化部署架构:
- 单节点部署:适合开发和测试环境
- 副本集部署:提供高可用性
- 分片集群部署:提供水平扩展性
- 混合部署:结合物理机和容器
学习交流加群风哥微信: itpux-com
Part02-生产环境规划与建议
2.1 容器环境规划
容器环境规划建议:
- Docker版本:使用最新稳定版本
- 资源分配:根据MongoDB需求分配CPU和内存
- 容器网络:使用自定义网络,提高安全性
- 镜像管理:使用官方镜像或构建自定义镜像
- 容器编排:根据规模选择Docker Compose或Kubernetes
2.2 存储规划
存储规划建议:
- 持久化存储:使用Docker卷或Kubernetes PVC
- 存储类型:使用SSD提高性能
- 备份策略:定期备份持久化数据
- 存储容量:根据数据量规划存储容量
学习交流加群风哥QQ113257174
2.3 网络规划
风哥提示:
网络规划应考虑容器间通信、外部访问和安全性。
网络规划建议:
- 容器网络:使用Docker网络或Kubernetes网络
- 端口映射:合理映射MongoDB端口
- 网络安全:配置防火墙规则,限制访问
- DNS配置:使用容器名称作为主机名
Part03-生产环境项目实施方案
3.1 Docker部署MongoDB
使用Docker部署MongoDB:
# 拉取MongoDB镜像
docker pull mongo:6.0
6.0: Pulling from library/mongo
Digest: sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
Status: Downloaded newer image for mongo:6.0
docker.io/library/mongo:6.0
# 创建数据卷
docker volume create mongodb_data
mongodb_data
# 运行MongoDB容器
docker run -d \
–name mongodb \
-p 27017:27017 \
-v mongodb_data:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=fgedu \
-e MONGO_INITDB_ROOT_PASSWORD=password123 \
mongo:6.0
1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
更多学习教程公众号风哥教程itpux_com
3.2 Docker Compose编排
使用Docker Compose编排MongoDB副本集:
# docker-compose.yml version: '3.8' services: mongo1: image: mongo:6.0 container_name: mongo1 ports: - "27017:27017" volumes: - mongo1_data:/data/db - ./init-replica.sh:/init-replica.sh networks: - mongo-network command: mongod --replSet rs0 --bind_ip_all mongo2: image: mongo:6.0 container_name: mongo2 ports: - "27018:27017" volumes: - mongo2_data:/data/db networks: - mongo-network command: mongod --replSet rs0 --bind_ip_all mongo3: image: mongo:6.0 container_name: mongo3 ports: - "27019:27017" volumes: - mongo3_data:/data/db networks: - mongo-network command: mongod --replSet rs0 --bind_ip_all volumes: mongo1_data: mongo2_data: mongo3_data: networks: mongo-network: driver: bridge
初始化副本集脚本:
#!/bin/bash
# init-replica.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo "Waiting for MongoDB to start..."
sleep 10
echo "Initializing replica set..."
mongo --host mongo1:27017 --eval "
rs.initiate({
_id: 'rs0',
members: [
{ _id: 0, host: 'mongo1:27017' },
{ _id: 1, host: 'mongo2:27017' },
{ _id: 2, host: 'mongo3:27017' }
]
})
"
echo "Replica set initialized."
3.3 Kubernetes部署
使用Kubernetes部署MongoDB:
# mongodb-deployment.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: mongodb namespace: fgedu spec: serviceName: mongodb replicas: 3 selector: matchLabels: app: mongodb template: metadata: labels: app: mongodb spec: containers: - name: mongodb image: mongo:6.0 ports: - containerPort: 27017 volumeMounts: - name: mongodb-data mountPath: /data/db command: - mongod - --replSet - rs0 - --bind_ip_all volumeClaimTemplates: - metadata: name: mongodb-data spec: accessModes: ["ReadWriteOnce"] storageClassName: "standard" resources: requests: storage: 10Gi --- apiVersion: v1 kind: Service metadata: name: mongodb namespace: fgedu spec: clusterIP: None selector: app: mongodb ports: - port: 27017 targetPort: 27017
Part04-生产案例与实战讲解
4.1 单节点容器部署
部署单节点MongoDB:
# 运行MongoDB容器
docker run -d \
–name mongodb \
-p 27017:27017 \
-v mongodb_data:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=fgedu \
-e MONGO_INITDB_ROOT_PASSWORD=password123 \
mongo:6.0
1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
# 验证MongoDB运行状态
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1234567890ab mongo:6.0 “docker-entrypoint.s…” 5 seconds ago Up 4 seconds 0.0.0.0:27017->27017/tcp mongodb
从MongoDB视频:www.itpux.com
4.2 副本集容器部署
使用Docker Compose部署副本集:
# 启动副本集
docker-compose up -d
Creating network “mongo-network” with driver “bridge”
Creating volume “mongo1_data”
Creating volume “mongo2_data”
Creating volume “mongo3_data”
Creating mongo1 … done
Creating mongo2 … done
Creating mongo3 … done
# 初始化副本集
docker exec -it mongo1 bash /init-replica.sh
Waiting for MongoDB to start…
Initializing replica set…
MongoDB shell version v6.0.0
connecting to: mongodb://mongo1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { “id” : UUID(“12345678-1234-1234-1234-123456789012”) }
MongoDB server version: 6.0.0
{ “ok” : 1 }
Replica set initialized.
# 验证副本集状态
docker exec -it mongo1 mongo –eval “rs.status()”
MongoDB shell version v6.0.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { “id” : UUID(“12345678-1234-1234-1234-123456789012”) }
MongoDB server version: 6.0.0
{ “set” : “rs0”, “date” : ISODate(“2024-01-01T00:00:00Z”), “myState” : 1, “term” : NumberLong(1), “syncSourceHost” : “”, “syncSourceId” : -1, “heartbeatIntervalMillis” : NumberLong(2000), “majorityVoteCount” : 2, “writeMajorityCount” : 2, “optimes” : { “lastCommittedOpTime” : { “ts” : Timestamp(1234567890, 1), “t” : NumberLong(1) }, “lastCommittedWallTime” : ISODate(“2024-01-01T00:00:00Z”), “readConcernMajorityOpTime” : { “ts” : Timestamp(1234567890, 1), “t” : NumberLong(1) }, “appliedOpTime” : { “ts” : Timestamp(1234567890, 1), “t” : NumberLong(1) }, “durableOpTime” : { “ts” : Timestamp(1234567890, 1), “t” : NumberLong(1) }, “lastAppliedWallTime” : ISODate(“2024-01-01T00:00:00Z”), “lastDurableWallTime” : ISODate(“2024-01-01T00:00:00Z”) }, “lastStableRecoveryTimestamp” : Timestamp(1234567890, 1), “electionCandidateMetrics” : { “lastElectionReason” : “electionTimeout”, “lastElectionDate” : ISODate(“2024-01-01T00:00:00Z”), “electionTerm” : NumberLong(1), “lastCommittedOpTimeAtElection” : { “ts” : Timestamp(0, 0), “t” : NumberLong(-1) }, “lastSeenOpTimeAtElection” : { “ts” : Timestamp(1234567890, 1), “t” : NumberLong(-1) }, “numVotesNeeded” : 2, “priorityAtElection” : 1, “electionTimeoutMillis” : NumberLong(10000), “newTermStartDate” : ISODate(“2024-01-01T00:00:00Z”), “wMajorityWriteAvailabilityDate” : ISODate(“2024-01-01T00:00:00Z”) }, “members” : [ { “_id” : 0, “name” : “mongo1:27017”, “health” : 1, “state” : 1, “stateStr” : “PRIMARY”, “uptime” : 60, “optime” : { “ts” : Timestamp(1234567890, 1), “t” : NumberLong(1) }, “optimeDate” : ISODate(“2024-01-01T00:00:00Z”), “lastHeartbeat” : ISODate(“2024-01-01T00:00:00Z”), “lastHeartbeatRecv” : ISODate(“2024-01-01T00:00:00Z”), “pingMs” : NumberLong(0), “lastHeartbeatMessage” : “”, “syncSourceHost” : “”, “syncSourceId” : -1, “infoMessage” : “”, “electionTime” : Timestamp(1234567890, 1), “electionDate” : ISODate(“2024-01-01T00:00:00Z”), “configVersion” : 1, “configTerm” : 1 }, { “_id” : 1, “name” : “mongo2:27017”, “health” : 1, “state” : 2, “stateStr” : “SECONDARY”, “uptime” : 60, “optime” : { “ts” : Timestamp(1234567890, 1), “t” : NumberLong(1) }, “optimeDurable” : { “ts” : Timestamp(1234567890, 1), “t” : NumberLong(1) }, “optimeDate” : ISODate(“2024-01-01T00:00:00Z”), “optimeDurableDate” : ISODate(“2024-01-01T00:00:00Z”), “lastHeartbeat” : ISODate(“2024-01-01T00:00:00Z”), “lastHeartbeatRecv” : ISODate(“2024-01-01T00:00:00Z”), “pingMs” : NumberLong(0), “lastHeartbeatMessage” : “”, “syncSourceHost” : “mongo1:27017”, “syncSourceId” : 0, “infoMessage” : “”, “configVersion” : 1, “configTerm” : 1 }, { “_id” : 2, “name” : “mongo3:27017”, “health” : 1, “state” : 2, “stateStr” : “SECONDARY”, “uptime” : 60, “optime” : { “ts” : Timestamp(1234567890, 1), “t” : NumberLong(1) }, “optimeDurable” : { “ts” : Timestamp(1234567890, 1), “t” : NumberLong(1) }, “optimeDate” : ISODate(“2024-01-01T00:00:00Z”), “optimeDurableDate” : ISODate(“2024-01-01T00:00:00Z”), “lastHeartbeat” : ISODate(“2024-01-01T00:00:00Z”), “lastHeartbeatRecv” : ISODate(“2024-01-01T00:00:00Z”), “pingMs” : NumberLong(0), “lastHeartbeatMessage” : “”, “syncSourceHost” : “mongo1:27017”, “syncSourceId” : 0, “infoMessage” : “”, “configVersion” : 1, “configTerm” : 1 } ], “ok” : 1 }
4.3 容器化管理实战
容器管理命令:
# 查看容器状态
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1234567890ab mongo:6.0 “docker-entrypoint.s…” 10 minutes ago Up 10 minutes 0.0.0.0:27017->27017/tcp mongodb
