如何在Docker容器中升级已部署的MongoDB 4.0版本(适配Rocket.Chat)
Docker环境下MongoDB 4.0副本集升级指南
先做好准备工作
- 先备份MongoDB数据,避免升级翻车丢数据:
docker exec db mongodump --out /backup docker cp db:/backup ./mongo-backup - 提前查好你用的Rocket.Chat版本兼容的MongoDB版本,比如Rocket.Chat 6.x及以上支持MongoDB 5.0/6.0,别升完MongoDB才发现Rocket.Chat不兼容
升级步骤(必须按相邻大版本逐步升,比如4.0→4.2→4.4→5.0,这里以升到5.0为例)
1. 先停掉相关服务
先把Rocket.Chat容器停了,不然升级MongoDB的时候它一直在读写数据容易出问题:
docker stop rocketchat
2. 先升到MongoDB 4.2
- 停掉旧的MongoDB 4.0容器:
docker stop db - 先确认一下数据卷的位置(如果用的是默认匿名卷,执行下面命令找本地路径或卷名):
docker inspect db | grep -E "Source|Name" - 启动MongoDB 4.2的临时容器,复用原来的数据卷,保持副本集配置不变:
docker run --name db-temp -d \ --volumes-from db \ mongo:4.2 --replSet rs0 --oplogSize 128 - 进入容器检查并升级特性兼容版本(FCV):
# 先看当前FCV版本,应该是4.0 docker exec -ti db-temp mongo --eval "printjson(db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 }))" # 把FCV升到4.2 docker exec -ti db-temp mongo --eval "printjson(db.adminCommand({ setFeatureCompatibilityVersion: '4.2' }))" - 验证没问题后,替换掉旧容器:
docker stop db-temp docker rm db docker rename db-temp db docker start db
3. 再升到MongoDB 4.4
步骤和上面差不多:
- 停掉db容器:
docker stop db - 启动4.4的临时容器复用数据卷:
docker run --name db-temp -d \ --volumes-from db \ mongo:4.4 --replSet rs0 --oplogSize 128 - 升级FCV到4.4:
docker exec -ti db-temp mongo --eval "printjson(db.adminCommand({ setFeatureCompatibilityVersion: '4.4' }))" - 替换容器:
docker stop db-temp docker rm db docker rename db-temp db docker start db
4. 最后升到MongoDB 5.0(或你需要的更高兼容版本)
- 停掉db容器:
docker stop db - 启动5.0的临时容器复用数据卷:
docker run --name db-temp -d \ --volumes-from db \ mongo:5.0 --replSet rs0 --oplogSize 128 - 升级FCV到5.0:
docker exec -ti db-temp mongo --eval "printjson(db.adminCommand({ setFeatureCompatibilityVersion: '5.0' }))" - 替换容器:
docker stop db-temp docker rm db docker rename db-temp db docker start db
5. 重启Rocket.Chat容器
直接启动就行,因为复用了原来的db容器名,连接配置不用改,但建议用兼容新MongoDB版本的Rocket.Chat镜像:
docker run --name rocketchat -p 80:3000 --link db \ --env ROOT_URL=http://localhost \ --env MONGO_OPLOG_URL=mongodb://db:27017/local \ -d rocket.chat:latest
几个要注意的点
- 绝对不能跨大版本直接升,比如从4.0直接跳到5.0,肯定会搞坏数据
- 每次升级完都要检查副本集状态是否正常:
docker exec -ti db mongo --eval "printjson(rs.status())" - 如果你用的是自己创建的自定义数据卷,启动容器的时候用
-v 你的数据卷路径:/data/db代替--volumes-from db - 确认升级后一切正常,再删掉之前的备份
内容的提问来源于stack exchange,提问作者МЫКЫТО КОЖЕМЯКА
相关产品推荐
相关产品推荐

