MongoDB docker 容器化部署
MongoDB標(biāo)準(zhǔn)軟件基于Bitnami MongoDB 構(gòu)建刻撒。當(dāng)前版本未7.0.5
你可以通過輕云UC部署工具直接安裝部署骨饿,也可以手動(dòng)按如下文檔操作鲫凶,該項(xiàng)目已經(jīng)全面開源,可以從如下環(huán)境獲取
配置文件地址: https://gitee.com/qingplus/qingcloud-platform
簡介
MongoDB 是一個(gè)基于 分布式文件存儲(chǔ) 的開源 NoSQL 數(shù)據(jù)庫系統(tǒng)稽物,由 C++ 編寫的萤悴。MongoDB 提供了 面向文檔 的存儲(chǔ)方式,操作起來比較簡單和容易板鬓,支持“無模式”的數(shù)據(jù)建模悲敷,可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型,是一款非常流行的 文檔類型數(shù)據(jù)庫 俭令。在高負(fù)載的情況下后德,MongoDB 天然支持水平擴(kuò)展和高可用,可以很方便地添加更多的節(jié)點(diǎn)/實(shí)例抄腔,以保證服務(wù)性能和可用性瓢湃。在許多場景下,MongoDB 可以用于代替?zhèn)鹘y(tǒng)的關(guān)系型數(shù)據(jù)庫或鍵/值存儲(chǔ)方式赫蛇,皆在為 Web 應(yīng)用提供可擴(kuò)展的高可用高性能數(shù)據(jù)存儲(chǔ)解決方案绵患。
初始化一個(gè)新實(shí)例
使用Docker 容器網(wǎng)絡(luò),應(yīng)用程序容器可以輕松訪問容器內(nèi)運(yùn)行的 MongoDB? 服務(wù)器悟耘。
連接到同一網(wǎng)絡(luò)的容器可以使用容器名稱作為主機(jī)名來相互通信落蝙。
使用命令行
在此示例中,我們將創(chuàng)建一個(gè) MongoDB? 客戶端實(shí)例,該實(shí)例將連接到與客戶端在同一 Docker 網(wǎng)絡(luò)上運(yùn)行的服務(wù)器實(shí)例筏勒。
第 1 步:創(chuàng)建網(wǎng)絡(luò)
docker network create app-tier --driver bridge
步驟 2:啟動(dòng) MongoDB? 服務(wù)器實(shí)例
使用命令--network app-tier的參數(shù), docker run將 MongoDB? 容器連接到網(wǎng)絡(luò)app-tier移迫。
docker run -d --name mongodb-server \
--network app-tier \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
步驟 3:啟動(dòng) MongoDB? 客戶端實(shí)例
最后,我們創(chuàng)建一個(gè)新的容器實(shí)例來啟動(dòng) MongoDB? 客戶端并連接到上一步中創(chuàng)建的服務(wù)器:
docker run -it --rm \
--network app-tier \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest mongo --host mongodb-server
使用 Docker Compose 文件
如果未指定管行,Docker Compose 會(huì)自動(dòng)設(shè)置一個(gè)新網(wǎng)絡(luò)并將所有已部署的服務(wù)附加到該網(wǎng)絡(luò)厨埋。但是,我們將顯式定義一個(gè)bridge名為app-tier的新網(wǎng)絡(luò)捐顷。在此示例中荡陷,我們假設(shè)您希望從您自己的自定義應(yīng)用程序映像連接到 MongoDB? 服務(wù)器,該映像在以下代碼片段中通過服務(wù)名稱進(jìn)行標(biāo)識(shí)myapp迅涮。
version: '2'
networks:
app-tier:
driver: bridge
services:
mongodb:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
networks:
- app-tier
myapp:
image: 'YOUR_APPLICATION_IMAGE'
networks:
- app-tier
重要:
替換YOUR_APPLICATION_IMAGE占位符
在您的應(yīng)用程序容器中废赞,使用主機(jī)名mongodb連接到 MongoDB? 服務(wù)器
啟動(dòng)容器:
docker-compose up -d
配置
初始化一個(gè)新實(shí)例
當(dāng)容器第一次執(zhí)行時(shí),它將執(zhí)行擴(kuò)展名為.sh和.js的文件逗柴,位于/docker-entrypoint-initdb.d.
為了將自定義文件放入 docker 映像中蛹头,您可以將它們掛載為卷顿肺。
將額外的命令行標(biāo)志傳遞給 mongod 啟動(dòng)
可以通過以下環(huán)境變量將額外的命令行標(biāo)志傳遞給 mongod 服務(wù)命令:
- MONGODB_EXTRA_FLAGS:要附加到mongod啟動(dòng)命令的標(biāo)志戏溺。無默認(rèn)值
- MONGODB_CLIENT_EXTRA_FLAGS:要附加到mongo用于連接到(本地或遠(yuǎn)程)mongod守護(hù)程序的命令的標(biāo)志。無默認(rèn)值
docker run --name mongodb -e ALLOW_EMPTY_PASSWORD=yes -e MONGODB_EXTRA_FLAGS='--wiredTigerCacheSizeGB=2' registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通過修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_EXTRA_FLAGS=--wiredTigerCacheSizeGB=2
...
配置系統(tǒng)日志詳細(xì)級別
可以通過以下環(huán)境變量配置系統(tǒng)日志詳細(xì)級別:
- MONGODB_DISABLE_SYSTEM_LOG:是否啟用/禁用 MongoDB? 上的系統(tǒng)日志屠尊。默認(rèn):false旷祸。可能的值:[true, false].
- MONGODB_SYSTEM_LOG_VERBOSITY:MongoDB? 系統(tǒng)日志詳細(xì)級別讼昆。默認(rèn):0托享。可能的值:[0, 1, 2, 3, 4, 5]. 有關(guān)詳細(xì)級別的更多信息浸赫,請參閱MongoDB? 文檔
docker run --name mongodb -e ALLOW_EMPTY_PASSWORD=yes -e MONGODB_SYSTEM_LOG_VERBOSITY='3' registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通過修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_SYSTEM_LOG_VERBOSITY=3
...
使用numactl
為了啟用使用 numactl 啟動(dòng)命令闰围,請將MONGODB_ENABLE_NUMACTL變量設(shè)置為 true。有關(guān)這方面的更多信息既峡,請查看官方 [MongoDB 文檔][( https://docs.mongodb.com/manual/administration/development-notes/#configuring-numa-on-linux )
啟用/禁用 IPv6
可以通過以下環(huán)境變量啟用/禁用 IPv6:
- MONGODB_ENABLE_IPV6:是否在 MongoDB? 上啟用/禁用 IPv6羡榴。默認(rèn):false≡烁遥可能的值:[true, false]
要啟用 IPv6 支持校仑,您可以執(zhí)行:
docker run --name
或者通過修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_ENABLE_IPV6=yes
...
啟用/禁用directoryPerDB
可以通過以下環(huán)境變量啟用/禁用directoryPerDB :
- MONGODB_ENABLE_DIRECTORY_PER_DB:是否在 MongoDB? 上啟用/禁用directoryPerDB。默認(rèn):true传惠∑可能的值:[true, false]
docker run --name mongodb -e ALLOW_EMPTY_PASSWORD=yes -e MONGODB_ENABLE_DIRECTORY_PER_DB=yes registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通過修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_ENABLE_DIRECTORY_PER_DB=yes
...
啟用/禁用日志記錄
可以通過以下環(huán)境變量啟用/禁用日志:
- MONGODB_ENABLE_JOURNAL:是否在 MongoDB? 上啟用/禁用日志記錄。默認(rèn):true卦方⊙虼瘢可能的值:[true, false]
docker run --name mongodb -e ALLOW_EMPTY_PASSWORD=yes -e MONGODB_ENABLE_JOURNAL=true registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通過修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_ENABLE_JOURNAL=true
...
首次運(yùn)行時(shí)設(shè)置 root 用戶和密碼
首次運(yùn)行映像時(shí)傳遞環(huán)境變量會(huì)將MONGODB_ROOT_USER的密碼設(shè)置為MONGODB_ROOT_PASSWORD的值。并在 MongoDB? 服務(wù)器上啟用身份驗(yàn)證。如果未設(shè)置MONGODB_ROOT_USER困后,則默認(rèn)為root.
docker run --name mongodb \
-e MONGODB_ROOT_PASSWORD=password123 registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通過修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- MONGODB_ROOT_PASSWORD=password123
...
用戶MONGODB_ROOT_USER配置為具有 MongoDB? 服務(wù)器的完全管理訪問權(quán)限乐纸。如果MONGODB_ROOT_PASSWORD未指定,服務(wù)器允許未經(jīng)身份驗(yàn)證且不受限制的訪問摇予。
首次運(yùn)行時(shí)創(chuàng)建用戶和數(shù)據(jù)庫
您可以在首次啟動(dòng)容器時(shí)創(chuàng)建對數(shù)據(jù)庫具有受限訪問權(quán)限的用戶汽绢。為此,請?zhí)峁㎝ONGODB_USERNAME侧戴、MONGODB_PASSWORD和MONGODB_DATABASE環(huán)境變量宁昭。
docker run --name mongodb \
-e MONGODB_USERNAME=my_user -e MONGODB_PASSWORD=password123 \
-e MONGODB_DATABASE=my_database registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通過修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- MONGODB_USERNAME=my_user
- MONGODB_PASSWORD=password123
- MONGODB_DATABASE=my_database
...
警告!
創(chuàng)建用戶可以在 MongoDB? 服務(wù)器上進(jìn)行身份驗(yàn)證酗宋,因此不允許任何用戶進(jìn)行未經(jīng)身份驗(yàn)證的訪問积仗。
設(shè)置復(fù)制
可以使用以下環(huán)境變量復(fù)制集群:
- MONGODB_REPLICA_SET_MODE:復(fù)制模式⊥擅ǎ可能的值
primary
/secondary
/arbiter
沒有默認(rèn)值寂曹。 - MONGODB_REPLICA_SET_NAME:MongoDB? 副本集名稱。默認(rèn)值:replicaset
- MONGODB_PORT_NUMBER:每個(gè) MongoDB? 將使用的端口回右。默認(rèn)值:27017
- MONGODB_INITIAL_PRIMARY_HOST:MongoDB? 初始主主機(jī)隆圆,一旦創(chuàng)建副本集,任何節(jié)點(diǎn)最終都可以升級為主節(jié)點(diǎn)翔烁。沒有默認(rèn)值渺氧。
- MONGODB_INITIAL_PRIMARY_PORT_NUMBER:MongoDB? 初始主節(jié)點(diǎn)端口,如其他節(jié)點(diǎn)所見蹬屹。默認(rèn)值:27017
- MONGODB_ADVERTISED_HOSTNAME:MongoDB? 公布的主機(jī)名侣背。沒有默認(rèn)值咒劲。如果您遇到臨時(shí) IP 問題吨岭,建議傳遞此環(huán)境變量偶房。設(shè)置此環(huán)境變量會(huì)使副本集的節(jié)點(diǎn)配置主機(jī)名而不是機(jī)器 IP寞酿。
- MONGODB_ADVERTISE_IP:MongoDB? 廣告主機(jī)名設(shè)置為容器 IP漫贞。默認(rèn)值:false革半。覆蓋MONGODB_ADVERTISED_HOSTNAME
- MONGODB_ADVERTISED_PORT_NUMBER:MongoDB? 公布的端口號蘸拔。沒有默認(rèn)值淤毛。如果您有將請求轉(zhuǎn)發(fā)到容器的代理端口蒜胖,建議傳遞此環(huán)境變量消别。
- MONGODB_REPLICA_SET_KEY:MongoDB? 副本集密鑰。長度應(yīng)大于 5 個(gè)字符台谢,且不應(yīng)包含任何特殊字符寻狂。所有節(jié)點(diǎn)都需要。無默認(rèn)值朋沮。
- MONGODB_ROOT_USER:MongoDB? root 用戶名蛇券。默認(rèn)值:root.
- MONGODB_ROOT_PASSWORD:MongoDB? root 密碼缀壤。沒有默認(rèn)值。僅適用于主節(jié)點(diǎn)纠亚。
- MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD:MongoDB? 初始主 root 密碼塘慕。沒有默認(rèn)值。僅適用于輔助節(jié)點(diǎn)和仲裁節(jié)點(diǎn)蒂胞。
在復(fù)制集群中图呢,您可以有一個(gè)主節(jié)點(diǎn)、零個(gè)或多個(gè)輔助節(jié)點(diǎn)以及零個(gè)或一個(gè)仲裁節(jié)點(diǎn)骗随。
注意:副本集場景下節(jié)點(diǎn)總數(shù)不能超過8個(gè)(1個(gè)主節(jié)點(diǎn)蛤织、6個(gè)從節(jié)點(diǎn)和1個(gè)仲裁節(jié)點(diǎn))
步驟1:創(chuàng)建復(fù)制主數(shù)據(jù)庫
第一步是啟動(dòng) MongoDB? 主數(shù)據(jù)庫。
docker run --name mongodb-primary \
-e MONGODB_REPLICA_SET_MODE=primary \
-e MONGODB_ADVERTISED_HOSTNAME=mongodb-primary \
-e MONGODB_ROOT_PASSWORD=password123 \
-e MONGODB_REPLICA_SET_KEY=replicasetkey123 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
在上面的命令中鸿染,容器被配置為primary,使用MONGODB_REPLICA_SET_MODE參數(shù)指蚜。
步驟2:創(chuàng)建復(fù)制輔助節(jié)點(diǎn)
接下來我們啟動(dòng)一個(gè) MongoDB? 輔助容器。
docker run --name mongodb-secondary \
--link mongodb-primary:primary \
-e MONGODB_REPLICA_SET_MODE=secondary \
-e MONGODB_ADVERTISED_HOSTNAME=mongodb-secondary \
-e MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary \
-e MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017 \
-e MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123 \
-e MONGODB_REPLICA_SET_KEY=replicasetkey123 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
在上面的命令中涨椒,容器被配置為secondary使用MONGODB_REPLICA_SET_MODE參數(shù)摊鸡。MONGODB_INITIAL_PRIMARY_HOST和參數(shù)MONGODB_INITIAL_PRIMARY_PORT_NUMBER用于連接 MongoDB? 主數(shù)據(jù)庫。
步驟3:創(chuàng)建復(fù)制仲裁節(jié)點(diǎn)
最后我們啟動(dòng)一個(gè) MongoDB? 仲裁器容器蚕冬。
docker run --name mongodb-arbiter \
--link mongodb-primary:primary \
-e MONGODB_REPLICA_SET_MODE=arbiter \
-e MONGODB_ADVERTISED_HOSTNAME=mongodb-arbiter \
-e MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary \
-e MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017 \
-e MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123 \
-e MONGODB_REPLICA_SET_KEY=replicasetkey123 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
在上面的命令中免猾,容器被配置為arbiter使用MONGODB_REPLICA_SET_MODE參數(shù)。MONGODB_INITIAL_PRIMARY_HOST和參數(shù)MONGODB_INITIAL_PRIMARY_PORT_NUMBER用于連接 MongoDB? 主數(shù)據(jù)庫播瞳。
您現(xiàn)在已經(jīng)啟動(dòng)并運(yùn)行了一個(gè)三節(jié)點(diǎn) MongoDB? 復(fù)制集群掸刊,可以通過添加/刪除輔助節(jié)點(diǎn)來擴(kuò)展該集群免糕。
可選:創(chuàng)建復(fù)制隱藏節(jié)點(diǎn)
如果我們想要一個(gè)復(fù)制hidden 節(jié)點(diǎn)赢乓,我們啟動(dòng)一個(gè) MongoDB? hidden容器。
docker run --name mongodb-hidden \
--link mongodb-primary:primary \
-e MONGODB_REPLICA_SET_MODE=hidden \
-e MONGODB_ADVERTISED_HOSTNAME=mongodb-hidden \
-e MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary \
-e MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017 \
-e MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123 \
-e MONGODB_REPLICA_SET_KEY=replicasetkey123 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
在上面的命令中石窑,容器被配置為hidden使用MONGODB_REPLICA_SET_MODE參數(shù)牌芋。MONGODB_INITIAL_PRIMARY_HOST和參數(shù)MONGODB_INITIAL_PRIMARY_PORT_NUMBER用于連接 MongoDB? 主數(shù)據(jù)庫。
通過 Docker Compose松逊,可以使用以下命令設(shè)置副本集:
version: '2'
services:
mongodb-primary:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
environment:
- MONGODB_ADVERTISED_HOSTNAME=mongodb-primary
- MONGODB_REPLICA_SET_MODE=primary
- MONGODB_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
volumes:
- 'mongodb_master_data:/bitnami'
mongodb-secondary:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
depends_on:
- mongodb-primary
environment:
- MONGODB_ADVERTISED_HOSTNAME=mongodb-secondary
- MONGODB_REPLICA_SET_MODE=secondary
- MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary
- MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
- MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
mongodb-arbiter:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
depends_on:
- mongodb-primary
environment:
- MONGODB_ADVERTISED_HOSTNAME=mongodb-arbiter
- MONGODB_REPLICA_SET_MODE=arbiter
- MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary
- MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
- MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
volumes:
mongodb_master_data:
driver: local
并使用以下命令運(yùn)行 docker-compose:
docker-compose up --detach
如果您想使用 docker-compose 參數(shù)擴(kuò)展輔助節(jié)點(diǎn)的數(shù)量--scale躺屁,則不得在 mongodb-secondary 和 mongodb-arbiter 定義中設(shè)置 MONGODB_ADVERTISED_HOSTNAME。
version: '2'
services:
mongodb-primary:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
environment:
- MONGODB_ADVERTISED_HOSTNAME=mongodb-primary
- MONGODB_REPLICA_SET_MODE=primary
- MONGODB_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
volumes:
- 'mongodb_master_data:/bitnami'
mongodb-secondary:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
depends_on:
- mongodb-primary
environment:
- MONGODB_REPLICA_SET_MODE=secondary
- MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary
- MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
- MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
mongodb-arbiter:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
depends_on:
- mongodb-primary
environment:
- MONGODB_REPLICA_SET_MODE=arbiter
- MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary
- MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
- MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
volumes:
mongodb_master_data:
driver: local
然后使用以下命令運(yùn)行 docker-compose:
docker-compose up --detach --scale mongodb-primary=1 --scale mongodb-secondary=3 --scale mongodb-arbiter=1
上述命令將輔助節(jié)點(diǎn)的數(shù)量增加到3经宏。您可以用同樣的方法縮小規(guī)模犀暑。
注意:您不應(yīng)增加/減少主節(jié)點(diǎn)的數(shù)量。始終只有一個(gè)主節(jié)點(diǎn)在運(yùn)行烁兰。
注意:在這種情況下耐亏,客戶端必須位于同一個(gè) docker 網(wǎng)絡(luò)中才能訪問所有節(jié)點(diǎn)。
副本集是如何配置的沪斟?
副本集配置中有四種不同的角色(primary, secondary, hidden or arbiter)广辰。這些角色中的每一個(gè)都以不同的方式配置:
primary節(jié)點(diǎn)配置:
副本集通過rs.initiate()命令和一些配置選項(xiàng)啟動(dòng),以強(qiáng)制主數(shù)據(jù)庫成為主數(shù)據(jù)庫≡竦酰基本上李根,優(yōu)先級從默認(rèn)值 (1) 增加到 5。為了驗(yàn)證主節(jié)點(diǎn)實(shí)際上是主節(jié)點(diǎn)几睛,我們使用命令對其進(jìn)行驗(yàn)證db.isMaster().ismaster房轿。
主節(jié)點(diǎn)附加了一個(gè)卷,因此只要該卷存在所森,數(shù)據(jù)就會(huì)在部署之間保留冀续。
此外,主節(jié)點(diǎn)初始化腳本將檢查文件夾/bitnami/mongodb是否存在文件.initialized必峰,以判斷是否應(yīng)該創(chuàng)建新的副本集洪唐,或者相反,副本集已經(jīng)被初始化吼蚁。
如果主節(jié)點(diǎn)被殺死并且卷被刪除凭需,為了在同一個(gè)副本集中再次啟動(dòng)它,重要的是使用原始 IP 啟動(dòng)容器肝匆,以便副本集的其他成員已經(jīng)知道它粒蜈。
secondary節(jié)點(diǎn)配置:
一旦主節(jié)點(diǎn)啟動(dòng)并運(yùn)行,我們就可以開始添加輔助節(jié)點(diǎn)(和仲裁器)旗国。為此枯怖,輔助節(jié)點(diǎn)連接到主節(jié)點(diǎn)并使用命令將自身添加為輔助節(jié)點(diǎn)rs.add(SECONDARY_NODE_HOST)。
添加輔助節(jié)點(diǎn)后能曾,我們通過執(zhí)行查看它們r(jià)s.status().members是否出現(xiàn)在列表中來驗(yàn)證它們是否已成功添加度硝。
arbiter節(jié)點(diǎn)配置:
仲裁器遵循與輔助節(jié)點(diǎn)相同的過程,但將其添加到副本集的命令是rs.addArb(ARBITER_NODE_HOST)寿冕。當(dāng)主節(jié)點(diǎn)與從節(jié)點(diǎn)之和為偶數(shù)時(shí)蕊程,應(yīng)添加仲裁器。
hidden節(jié)點(diǎn)配置:
最后驼唱,隱藏節(jié)點(diǎn)遵循與輔助節(jié)點(diǎn)相同的過程藻茂,除了將其添加到副本集的命令為rs.add(host: HIDDEN_NODE_HOST, hidden: true, priority: 0})。
啟用 SSL/TLS
該容器支持通過設(shè)置 和MONGODB_EXTRA_FLAGS環(huán)境MONGODB_CLIENT_EXTRA_FLAGS變量以及正確的MONGODB_ADVERTISED_HOSTNAME. 在啟動(dòng)集群之前玫恳,您需要根據(jù) Mongo 的要求生成 PEM 證書 - 一種方法是使用openssl(參見http://www.openssl.org)創(chuàng)建自簽名證書辨赐。
按所述生成的證書不用于生產(chǎn)用途
生成自簽名證書
- 生成一個(gè)新的私鑰,用于創(chuàng)建您自己的證書頒發(fā)機(jī)構(gòu) (CA):
openssl genrsa -out mongoCA.key 2048
- 為您自己的 CA 創(chuàng)建公共證書:
openssl req -x509 -new \
-subj "/C=US/ST=NY/L=New York/O=Example Corp/OU=IT Department/CN=mongoCA" \
-key mongoCA.key -out mongoCA.crt
- 為節(jié)點(diǎn)創(chuàng)建證書簽名請求${NODE_NAME}京办,這里的重要部分是對應(yīng)Common Name于節(jié)點(diǎn)尋址的主機(jī)名掀序。示例mongodb-primary:
export NODE_NAME=mongodb-primary
openssl req -new -nodes \
-subj "/C=US/ST=NY/L=New York/O=Example Corp/OU=IT Department/CN=${NODE_NAME}" \
-keyout ${NODE_NAME}.key -out ${NODE_NAME}.csr
- 從證書簽名請求創(chuàng)建證書,并使用之前創(chuàng)建的證書頒發(fā)機(jī)構(gòu)的私鑰對其進(jìn)行簽名:
openssl x509 \
-req -days 365 -in ${NODE_NAME}.csr -out ${NODE_NAME}.crt \
-CA mongoCA.crt -CAkey mongoCA.key -CAcreateserial -extensions req
- 使用私鑰和公共證書創(chuàng)建 PEM 捆綁包:
cat ${NODE_NAME}.key ${NODE_NAME}.crt > ${NODE_NAME}.pem
注意:此后您不需要證書簽名請求臂港。
rm ${NODE_NAME}.csr
重復(fù)此過程森枪,為集群中的所有節(jié)點(diǎn)生成 PEM 捆綁包视搏。
啟動(dòng)集群
生成證書并使它們可用于正確掛載點(diǎn)(如:/certificates/)的容器后,可以按照以下示例設(shè)置環(huán)境變量县袱。
主節(jié)點(diǎn)的設(shè)置示例mongodb-primary:
MONGODB_ADVERTISED_HOSTNAME=mongodb-primary
MONGODB_EXTRA_FLAGS=--tlsMode=requireTLS --tlsCertificateKeyFile=/certificates/mongodb-primary.pem --tlsClusterFile=/certificates/mongodb-primary.pem --tlsCAFile=/certificates/mongoCA.crt
MONGODB_CLIENT_EXTRA_FLAGS=--tls --tlsCertificateKeyFile=/certificates/mongodb-primary.pem --tlsCAFile=/certificates/mongoCA.crt
輔助節(jié)點(diǎn)的相應(yīng)設(shè)置示例mongodb-secondary:MONGODB_ADVERTISED_HOSTNAME=mongodb-secondary
MONGODB_EXTRA_FLAGS=--tlsMode=requireTLS --tlsCertificateKeyFile=/certificates/mongodb-secondary.pem --tlsClusterFile=/certificates/mongodb-secondary.pem --tlsCAFile=/certificates/mongoCA.crt
MONGODB_CLIENT_EXTRA_FLAGS=--tls --tlsCertificateKeyFile=/certificates/mongodb-secondary.pem --tlsCAFile=/certificates/mongoCA.crt
通過 SSL 連接到 mongo 守護(hù)進(jìn)程
按照指定成功啟動(dòng)集群后浑娜,在容器內(nèi)應(yīng)該可以使用以下命令連接到主節(jié)點(diǎn)上的 mongo 守護(hù)進(jìn)程:
/opt/bitnami/mongodb/bin/mongo -u ${MONGODB_ROOT_USER} -p ${MONGODB_ROOT_PASSWORD} --host mongodb-primary --tls --tlsCertificateKeyFile=/certificates/mongodb-primary.pem --tlsCAFile=/certificates/mongoCA.crt
注意:我們僅支持--clusterAuthMode=keyFile此配置。
參考
還允許客戶端使用用戶名和密碼進(jìn)行連接(無需 X509 證書):https://docs.mongodb.com/manual/reference/configuration-options/#net.ssl.allowConnectionsWithoutCertificates
有關(guān)相關(guān)配置選項(xiàng)的更多詳細(xì)信息:https://docs.mongodb.com/manual/reference/program/mongod/#tls-ssl-options式散,特別是客戶端身份驗(yàn)證以及通用名稱和 OU/DN/等的要求筋遭。證書中的字段對于創(chuàng)建安全設(shè)置非常重要。
配置文件
從宿主機(jī)掛載卷到/bitnami/mongodb/conf/暴拄,并復(fù)制/編輯相關(guān)文件到/path/to/mongodb-configuration-persistence/. 如果該目錄為空漓滔,則默認(rèn)配置將被填充到該/opt/bitnami/mongodb/conf/目錄中。
第 1 步:運(yùn)行 MongoDB? 映像
運(yùn)行 MongoDB? 映像乖篷,從主機(jī)安裝目錄响驴。
docker run --name mongodb -v /path/to/mongodb-configuration-persistence:/bitnami/mongodb/conf registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或使用 Docker Compose:
...
services:
mongodb:
...
volumes:
- 'mongodb_data:/bitnami/mongodb'
+ - /path/to/mongodb-configuration-persistence:/bitnami/mongodb/conf
...
第 2 步:編輯配置
使用您喜歡的編輯器編輯主機(jī)上的配置。
vi /path/to/mongodb-configuration-persistence/mongodb.conf
第 3 步:重新啟動(dòng) MongoDB?
更改配置后撕蔼,重新啟動(dòng) MongoDB? 容器以使更改生效豁鲤。
docker restart mongodb
或使用 Docker Compose:
docker-compose restart mongodb
有關(guān) MongoDB? 配置選項(xiàng)的完整列表,請參閱配置文件選項(xiàng)手冊鲸沮。
日志
docker logs mongodb
或使用 Docker Compose:
docker-compose logs mongodb
如果您希望以不同方式使用容器日志琳骡,您可以使用該選項(xiàng)配置容器日志記錄驅(qū)動(dòng)程序。--log-driver在默認(rèn)配置中讼溺,docker 使用json-file驅(qū)動(dòng)程序楣号。