一、安裝docker、docker-compose
1、不會安裝docker的請移步----》centos7安裝docker Ubantu16.04安裝docker
2、安裝docker-compose(Centos7環境無pip的----》centos7安裝pip2)
pip install docker-compose
二、創建副本集所需的key
mkdir mongod && cd mongod
openssl rand -base64 756 > mongo.key
docker volume create mongod_mongo_key
MONGO_KEY_DIR=`docker volume inspect mongod_mongo_key | grep Mount | sed -r 's#.*"(.*)",$#\1#'`
cp mongo.key $MONGO_KEY_DIR
chmod 400 $MONGO_KEY_DIR/mongo.key
chown 999.999 $MONGO_KEY_DIR/mongo.key
mkdir /data/mongo/mongdb{1..3} -pv
三、創建docker-compose文件
#映射/data/mongo/mongdb{1,2,3}目錄到容器裏,將數據持久化到磁盤
#映射出三個端口,以便外部用戶連接
#MONGO_INITDB_ROOT_USERNAME:管理員用戶的賬號
#MONGO_INITDB_ROOT_PASSWORD:管理員用戶的密碼
cat << EOF > docker-compose.yaml
version: "3.7"
services:
mongodb1:
image: mongo:4.0.3
container_name: mongodb1
networks:
- mongodb
ports:
- "27017:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=123456x
volumes:
- /data/mongo/mongdb1:/data/db
- mongo_key:/mongo
command: ["mongod","--replSet","BigBoss","--keyFile","/mongo/mongo.key","--directoryperdb"]
mongodb2:
image: mongo:4.0.3
container_name: mongodb2
networks:
- mongodb
ports:
- "27018:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=123456x
volumes:
- /data/mongo/mongdb2:/data/db
- mongo_key:/mongo
command: ["mongod","--replSet","BigBoss","--keyFile","/mongo/mongo.key","--directoryperdb"]
mongodb3:
image: mongo:4.0.3
container_name: mongodb3
networks:
- mongodb
ports:
- "27019:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=123456x
volumes:
- /data/mongo/mongdb3:/data/db
- mongo_key:/mongo
command: ["mongod","--replSet","BigBoss","--keyFile","/mongo/mongo.key","--directoryperdb"]
networks:
mongodb:
driver: bridge
name: mongodb
volumes:
mongo_key:
EOF
四、啓動副本集
1、拉取mongo4.0的鏡像
docker pull mongo:4.0.3
我這失敗了一次,後面查了一下mongo鏡像docker search mongo,docker官網是有這個鏡像的,然後有拉取了一次
2、執行docker-compose文件,在docker-compose.yaml同級目錄下執行
docker-compose up -d
3、連接mongodb1容器,開始配置集羣
docker exec -it mongodb1 mongo -uroot -p123456x --authenticationDatabase admin
#三節點,其中一個爲投票節點,並隱藏
#注意host的IP地址,一定要讓客戶端也能連接所有的地址
#_id的值爲--replSet參數後的字符串
rs.initiate(
{
_id: "BigBoss",
version: 1,
protocolVersion: 1,
writeConcernMajorityJournalDefault: true,
members: [
{
_id: 0,
host: "mongodb1:27017",
arbiterOnly: false,
buildIndexes: true,
hidden: false,
priority: 66,
tags: {
BigBoss: "YES"
},
slaveDelay: 0,
votes: 1
},
{
_id: 1,
host: "mongodb2:27017",
arbiterOnly: false,
buildIndexes: true,
hidden: false,
priority: 55,
tags: {
BigBoss: "NO"
},
slaveDelay: 0,
votes: 1
},
{
_id: 2,
host: "mongodb3:27017",
arbiterOnly: true,
buildIndexes: true,
hidden: true,
priority: 0,
tags: {
},
slaveDelay: 0,
votes: 1
}
],
settings: {
chainingAllowed : true,
}
}
)
4、查看狀態
rs.status()
五、檢測
1、進入mongodb2容器中
docker exec -it mongodb2 mongo -uroot -p123456x --authenticationDatabase admin
2、停止PRIMARY的容器
docker stop mongodb1
3、連接mongdb2容器查看狀態是否改變
docker exec -it mongodb2 mongo -uroot -p123456x --authenticationDatabase admin