【Docker】mongodb容器部署

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

qinghub自動(dòng)安裝部署配置庫

簡介

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)程序楣号。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怒坯,隨后出現(xiàn)的幾起案子炫狱,更是在濱河造成了極大的恐慌,老刑警劉巖敬肚,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毕荐,死亡現(xiàn)場離奇詭異束析,居然都是意外死亡艳馒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門员寇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弄慰,“玉大人,你說我怎么就攤上這事蝶锋÷剿” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵扳缕,是天一觀的道長慌闭。 經(jīng)常有香客問我别威,道長,這世上最難降的妖魔是什么驴剔? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任省古,我火速辦了婚禮,結(jié)果婚禮上丧失,老公的妹妹穿的比我還像新娘豺妓。我一直安慰自己,他們只是感情好布讹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布琳拭。 她就那樣靜靜地躺著,像睡著了一般描验。 火紅的嫁衣襯著肌膚如雪白嘁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天膘流,我揣著相機(jī)與錄音权薯,去河邊找鬼。 笑死睡扬,一個(gè)胖子當(dāng)著我的面吹牛盟蚣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卖怜,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼屎开,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了马靠?” 一聲冷哼從身側(cè)響起奄抽,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甩鳄,沒想到半個(gè)月后逞度,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妙啃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年档泽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揖赴。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馆匿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出燥滑,到底是詐尸還是另有隱情渐北,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布铭拧,位于F島的核電站赃蛛,受9級特大地震影響恃锉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呕臂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一淡喜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诵闭,春花似錦炼团、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褥琐,卻和暖如春锌俱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敌呈。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工贸宏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磕洪。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓吭练,卻偏偏與公主長得像,于是被迫代替她去往敵國和親析显。 傳聞我的和親對象是個(gè)殘疾皇子鲫咽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容