基于Centos镜像创建mongodb镜像

基于Centos镜像创建mongodb镜像

此处将不再介绍Docker相关知识,有兴趣的同学可自行了解,本文用于记录和交流学习,不喜勿喷.遇到问题可到文末通过留言紧急问题可加QQ或者微信交流。

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.注意点:
windows上面编辑的.sh脚本在linux中文件格式为dos,可通过vi或vim编辑文件在非编辑状态下输出:set ff查看,当文件格式为dos时可输入 :set ff=unix即可, :set number为显示行号
4.Dockerfile文件:
FROM centos:latest
MAINTAINER docker_user (jhtjzzts@163.com)

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"]
5.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


6.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
7.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
8.交流学习:
大家遇到问题可相互交流学习:
微信:shiguangxuanyan
qq:676621871
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值