折騰一些使用docker來配置和管理mongodb和mongodb集羣。html
docker search mongo # 選擇一個版本 docker pull mongo:3.4 # 查看拉取的版本 docker images
cd /mnt/ mkdir mongodb cd ./mongodb mkdir data # 放置數據文件 mkdir backup # 備份文件 mkdir conf # 配置文件
# mongodb.conf logappend=true # bind_ip=127.0.0.1 port=27017 fork=true noprealloc=true auth=true
docker network create tms
docker run --name mongodb -v /mnt/mongodb/data:/data/db -v /mnt/mongodb/backup:/data/backup -v /mnt/mongodb/conf:/data/configdb -p 27018:27017 --network tms --network-alias mongodb -d mongo --auth # 容器命名mongodb,數據庫數據文件掛載到/mnt/mongodb/data,備份文件掛載到/mnt/mongodb/backup,啓動的配置文件目錄掛載到容器的/data/configdb,--auth開啓身份驗證。 # 若是想要使用配置文件啓動mongodb,則執行本身的啓動命令: docker run --name mongodb -v /mnt/mongodb/data:/data/db -v /mnt/mongodb/backup:/data/backup -v /mnt/mongodb/conf:/data/configdb -p 27018:27017 --network tms --network-alias mongodb -d mongo mongod -f /data/configdb/mongodb.conf
記住:本身的mongod啓動命令是在容器內執行的,所以使用的配置文件路徑是相對於容器的內部路徑。mongodb
之因此要掛載數據卷是爲了便於直接對數據庫數據進行讀取以及備份的方便,固然也能夠不掛載,掛載的主要目的通常是爲了掛載應用的啓動配置文件。docker
docker exec -it mongodb bash use admin db.createUser({ # 先建立root用戶 user:'admin', pwd:'123456', roles:[{role:'root',db:'admin'}], }) db.auth('admin','123456') # 認證 # 而後建立普通用戶
退出容器後咱們能夠嘗試在主機訪問容器裏的mongodb,若是出現以下錯誤:數據庫
Error: 18 { ok: 0.0, errmsg: "auth failed", code: 18, codeName: "AuthenticationFailed" }
可能的一個緣由是mongo的客戶端版本過低,不支持認證操做,將mongo的客戶端升級後再次嘗試。api
一個最小的副本集爲3個成員,包括主節點,備節點和仲裁節點,若是沒有仲裁節點,備節點是不會自動升級爲主節點的。bash
# 建立一個網絡 docker network create tms docker run --name m1 -p 27001:27017 --network tms --network-alias m1 -d mongo:3.4 --replSet mset --bind_ip 0.0.0.0 docker run --name m2 -p 27002:27017 --network tms --network-alias m2 -d mongo:3.4 --replSet mset --bind_ip 0.0.0.0 docker run --name m3 -p 27003:27017 --network tms --network-alias m3 -d mongo:3.4 --replSet mset --bind_ip 0.0.0.0
注意必定要將bind_ip設置成不是隻有本地訪問,不然副本集不能初始化成功。網絡
rs.initiate({ _id:"mset", members:[ {_id:0,host:"m1:27017",priority:2}, {_id:1,host:"m2:27017",priority:1}, {_id:2,host:"m3:27017",arbiterOnly:true} ]}) priority:設置優先級,數字越大優先級越高,優先級最高的是主節點 rs.status() # 查看狀態 # 默認備份節點不能讀寫,能夠設置 rs.slaveOk(); # 增長節點,須要進入主節點執行 rs.add('ip:port')
use admin db.createUser({ user:'admin', pwd:'123456', roles:[{role:'root',db:'admin'}], }) db.auth('admin','123456')
若是須要開啓認證,使用ssl的keyfile文件做爲認證文件:app
openssl rand -base64 666 > mongodb.key # 生成認證文件 chmod 600 mongodb.key # 設置執行權限
# /mnt/mongodb/mconf/mongod.conf net: port: 27017 bindIp: 0.0.0.0 systemLog: logAppend: true processManagement: fork: false security: keyFile: "/data/configdb/mongodb.key" clusterAuthMode: "keyFile" authorization: "enabled" replication: replSetName: "mset" secondaryIndexPrefetch: "all"
docker run --name m1 -p 27001:27017 -v /mnt/mongodb/mconf:/data/configdb --network tms --network-alias m1 -d mongo:3.4 mongod -f /data/configdb/mongod.conf docker run --name m2 -p 27002:27017 -v /mnt/mongodb/mconf:/data/configdb --network tms --network-alias m2 -d mongo:3.4 mongod -f /data/configdb/mongod.conf docker run --name m3 -p 27003:27017 -v /mnt/mongodb/mconf:/data/configdb --network tms --network-alias m3 -d mongo:3.4 mongod -f /data/configdb/mongod.conf