基於Centos映象建立mongodb映象

2020-08-10 12:38:19

基於Centos映象建立mongodb映象

此處將不再介紹Docker相關知識,有興趣的同學可自行瞭解

0.準備知識:

  • Dockerfile相關知識
  • sh指令碼知識
  • mongodb4.4版本相關命令

1.Dockerfile相關知識:

1-1.COPY命令:
複製內容到映象
格式爲:COPY <src> <dest>
複製本地主機的<src>(爲Dockerfile所在目錄的相對路徑,檔案或目錄)下內容到映象中的<dest>。目標路徑不存在時,會自動建立
路徑同樣支援正則表格式
1-2.ADD命令:
新增內容到映象
格式爲ADD <src> <dest>
該命令將複製指定的<src>路徑下內容到容器中的<dest>路徑下
其中<src>可以是Dockerfile所在目錄的一個相對路徑(檔案或目錄),也可以是一個URL;換可以使一個tar檔案(自動解壓爲目錄),<dest>可以是映象內的絕對路徑,或者相對於工作目錄(WORKDIR)的相對路徑
1-3.RUN命令:
執行指定命令
格式爲RUN <command>或 RUN ["executable" , "param1" , "param2"]。注意後者指令會被解釋爲JSON陣列,因此必須用雙引號。前者預設將在shell終端中執行命令,即/bin/sh -c ;後者則使用exec執行,不會啓動shell環境
指定使用其他終端型別可以通過第二種方式實現,例如 RUN [ "/bin/bash" , "-c" , "echo hello" ]
每條RUN指令將在當前映象基礎上執行指定命令,並提交爲新的映象層,當命令較長時可使用\來換行
	eg: RUN yum -y install pwgen && \
					yum -y install net-tools
1-4.ENTRYPOINT命令:
ENTRYPOINT後面的命令和參數爲映象的預設入口命令, 該入口命令會在啓動容器時作爲根命令執行, 所有傳人值作爲該命令的參數。
支援兩種格式:
	ENTRYPOINT ["executable", "paraml ", "param2"]: exec 呼叫執行;
	ENTRYPOINT command param 1 param2: shell 中執行。
	此時,CMD指令指定值將作爲根命令的參數。
每個 Dockerfile 中只能有一個ENTRYPOINT, 當指定多個時, 只有最後一個起效。
在執行時, 可以被 --entrypoint 參數覆蓋掉, 如 docker run --entrypoint。
1-5.CMD命令:
CMD 指令用來指定啓動容器時預設執行的命令
支援三種格式:
CMD ["executable ","paraml","param2 " ]:相當於執行 executable param1 param2,推薦方式;
CMD command  param2 :在預設的 Shell 中執行,提供給需要互動的應用;
CMD [ "param1","param2" ]:提供給 ENTRYPOINT 的預設參數
每個Dockerfile 只能有一個 CMD 命令,如果指定了多條命令,只有最後一條會被執行
如果使用者啓動容器時候手動指定了執行的命令(作爲 run命令的參數),則會覆蓋掉CMD 指定的命令

2.基於Dockerfile製作映象:

將Dockerfile、run.sh、set_mongodb_passwod.sh,mongodb-org-4.4.repo文化部放到同一個資料夾下
在裝有docker環境的機器上,執行docker build -f MongodbDockerfile -t mongodb:v1 .
#注意末尾的上下文"."不能少

映象建立成功後執行映象建立容器:
	docker run -itd -v /data/mongodb:/mongodb_data -e auth=yes -e dbpath=/mongodb_data/db -e syslog=/mongodb_data/logs -p 27007:27017 -p 28007:28017 --name mongodb mongodb:v1
	 #dbpath數據檔案的存放路徑,MONGODB_PASS爲mongodb設定的密碼使用者爲admin密碼預設爲111111
	 #auth=yes表示開啓安全認證

3.Dockerfile檔案:

FROM centos:latest
MAINTAINER docker_user ([email protected])

ADD mongodb-org-4.4.repo /etc/yum.repos.d/mongodb-org-4.4.repo

RUN yum clean all && \
	yum makecache

RUN yum -y install  mongodb-org-4.4.0 mongodb-org-server-4.4.0 mongodb-org-shell-4.4.0 mongodb-org-mongos-4.4.0 mongodb-org-tools-4.4.0  && \
	yum clean all && \
	rm -rf /var/lib/apt/lists/*
	

RUN mkdir -p /data/db

VOLUME /data/db

ENV AUTH yes

#新增指令碼
ADD run.sh /run.sh
ADD set_mongodb_password.sh /set_mongodb_password.sh

RUN pwd

RUN chmod 755 ./*.sh

EXPOSE 27017
EXPOSE 28017

CMD ["/run.sh"]

4.run.sh檔案:

#!/bin/bash

#-f /.mongodb_password_set存在且爲普通檔案爲真
# /.mongodb_password_set檔案不存在設定mongodb密碼

if [[ ${dbpath} ]] ; then 
		if [[ ! -a ${dbpath} ]] ; then
			mkdir -p ${dbpath}
		fi
fi

if [[ ! -f ${syslog:-/data/logs/}"log.log" ]] ; then 
		mkdir -p ${syslog:-/data/logs}
		echo "" > ${syslog:-/data/logs}"/log.log"
fi

if [ ! -f /.mongodb_password_set ]; then
	/set_mongodb_password.sh
fi

#export mongodb="numactl --interleave=all "

if [ "$auth" == "yes" ] ; then
	#這裏讀者可以自己設定 MongoDB 的啓動參數
	export mongodb=$mongodb"/usr/bin/mongod --nojournal --auth  --dbpath ${dbpath:-/data/db} "
else
	export mongodb=$mongodb"/usr/bin/mongod --nojournal --dbpath ${dbpath:-/data/db} "
fi

export mongodb=$mongodb" --bind_ip 0.0.0.0 "
#4.4沒有這兩個參數
#export mongodb=$mongodb" --httpinterface --rest"

if [ ! -f ${dbpath:-/data/db}"/mongod.lock" -a ! -f ${dbpath:-/data/db}/"WiredTiger.lock" ] ; then
	sc=$(ps -aux | grep 'mongod' | grep -v grep | awk '{print $2}');if [[ $sc ]];then echo "mongodb.lock and WiredTiger.ock file line======== $sc" ;kill -9 $sc;fi && echo $mongodb && eval $mongodb
else
	rm ${dbpath:-/data/db}/mongod.lock
	rm ${dbpath:-/data/db}/WiredTiger.lock
	rm -rf ${logpath:-/data/logs}
	echo "mongodb.lock and WiredTiger.ock file alredy delete ========================="
	# mongod.lock /WiredTiger.lock 檔案會在啓動時自動建立,並且在正常停止之前自動刪除,因此非正常停止會存在,需要使用--repair修復數據庫
	mongod --dbpath  ${dbpath:-/data/db} --repair &&  sc=$(ps -aux | grep 'mongod' | grep -v grep | awk '{print $2}');if [[ $sc ]];then echo $sc ;kill -9 $sc;fi && echo $mongodb && eval $mongodb
fi


5.set_mongodb_passwod.sh檔案:

#!/bin/bash

if [ -f /.mongodb_password_set ] ; then 
	echo "mongoDB password already set!"
	exit 0
fi

/usr/bin/mongod --dbpath ${dbpath:-/data/db}  --bind_ip 0.0.0.0 --nojournal & 

PASS=${MONGODB_PASS:-111111}
_word=$( [ ${MONGODB_PASS} ] && echo "preset" || echo "random" )

RET=1
while [[ RET -ne 0 ]] ; do
	echo "=> Waiting for confirmation of MongoDB service startup"
	sleep 8
	echo "mongodb create user:admin password:${PASS}"
	sc=$(ps -aux | grep 'mongod ' | grep -v grep | awk '{print $2}');
	echo "-----------------------------------sc : ${sc} : $(ps -axu)"
	if [[ $sc ]];then 
		mongo admin --eval "db.auth('admin','$PASS')" | grep -q "Authentication failed"
		flag=$?
	fi
	echo "-----------------------------------flag : ${flag}"
	if [[ flag -eq 0 ]] ; then 
		mongo admin --eval "db.createUser({user:'admin',pwd:'$PASS',roles:[{role:'root',db:'admin'}]})" 2>&1
		RET=$?
	else
		if [[ $sc ]];then 
			mongo admin --eval "--help" 2>&1
			RET=$?
		fi
	fi
	echo "------------------------------------RET: $RET"
done

6.mongodb-org-4.4.repo檔案:

該檔案爲yum源,可獲取最新的mongodb4.4版本
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc