基于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.注意点:
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