1. 首页 > MongoDB教程 > 正文

MongoDB教程FG046-MongoDB容器化部署实战

内容简介

本文详细介绍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 容器化管理实战

容器管理命令:

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息