YUM源创建的Dockerfile内容为:
[root@docker1 Mongodb]# vi Dockerfile
#设置从我们之前创建的sshd镜像继承
FROM sshd:centos
MAINTAINER waitfish from dockerpool.com
ADD mongodb-3.2.repo /etc/yum.repos.d/
RUN \
yum update -y && \
yum install -y mongodb-org && \ #这里不推荐使用yum安装monodb,实在下载速度太慢
yum clean all
# 创建mongodb存放数据文件的文件夹
RUN mkdir -p /data/db
VOLUME /data/db
ENV AUTH yes
# Add run scripts 添加脚本
ADD run.sh /run.sh
ADD set_mongodb_password.sh /set_mongodb_password.sh
RUN chmod 755 ./*.sh
EXPOSE 27017
EXPOSE 28017
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MongoDB是一款可扩展、高性能的开源文档(Document-Oriented)数据库。它采用C++开发,支持复杂的数据类型和强大的查询语言,提供了关系数据库的绝大部分功能。MongoDB由于其高性能、易部署、易使用等特点,已经在各种领域都得到了广泛的应用。
① 下载文件 从GitHub Dockerpool社区账户下载Mongodb镜像项目:[root@docker1 ~]# git clone https://github.com/DockerPool/Mongodb.gitCloning into 'Mongodb'...remote: Counting objects: 12, done.remote: Compressing objects: 100% (10/10), done.remote: Total 12 (delta 2), reused 12 (delta 2), pack-reused 0Unpacking objects: 100% (12/12), done.查看内容,包括写好的Dockerfile和若干脚本等:[root@docker1 ~]# cd Mongodb/[root@docker1 Mongodb]# lsDockerfile mongodb-3.2.repo mongodb-linux-x86_64-rhel70-3.6.0.tgz pwgen-2.08.tar.gz run.sh set_mongodb_password.sh ② 其中Dockerfile内容为:[root@docker1 Mongodb]# cat Dockerfile #设置从我们之前创建的sshd镜像继承FROM sshd:centos MAINTAINER waitfish from dockerpool.comCOPY mongodb-linux-x86_64-rhel70-3.6.0.tgz /mongodb-linux-x86_64-rhel70-3.6.0.tgzCOPY pwgen-2.08.tar.gz /pwgen-2.08.tar.gzRUN yum update -y && yum install -y gcc automake autoconf libtool makeRUN tar -xf pwgen-2.08.tar.gzWORKDIR pwgen-2.08RUN ./configure && make && make install#定义工作目录WORKDIR /RUN tar -xf mongodb-linux-x86_64-rhel70-3.6.0.tgzRUN mv mongodb-linux-x86_64-rhel70-3.6.0 /usr/local/mongodb#设置环境变量ENV PATH /usr/local/mongodb/bin:$PATH#删除压缩包RUN rm -rf mongodb-linux-x86_64-rhel70-3.6.0.tgz pwgen-2.08.tar.gz # 创建mongodb存放数据文件的文件夹RUN mkdir -p /data/dbVOLUME /data/dbENV AUTH yes# Add run scripts 添加脚本ADD run.sh /run.shADD set_mongodb_password.sh /set_mongodb_password.shRUN chmod 755 ./*.shEXPOSE 27017EXPOSE 28017CMD ["/run.sh"] ③ set_mongodb_password.sh脚本主要负责配置数据库的用户名和密码,内容为:[root@docker1 Mongodb]# cat set_mongodb_password.sh #这个脚本主要设置数据库的用户名和密码#!/bin/bash#判断是否已经设置过密码if [ -f /.mongodb_password_set ]; then echo "MongoDB password already set!" exit 0fi/usr/local/mongodb/bin/mongod --smallfiles --nojournal &PASS=${MONGODB_PASS:-$(pwgen -s 12 1)}_word=$( [ ${MONGODB_PASS} ] && echo "preset" || echo "random" )RET=1while [[ RET -ne 0 ]]; do echo "=> Waiting for confirmation of MongoDB service startup" sleep 5 mongo admin --eval "help" >/dev/null 2>&1 RET=$?done#通过docker logs + id可以看到下面的输出echo "=> Creating an admin user with a ${_word} password in MongoDB"mongo admin --eval "db.addUser({user: 'admin', pwd: '$PASS', roles: [ 'userAdminAnyDatabase', 'dbAdminAnyDatabase' ]});"mongo admin --eval "db.shutdownServer();"echo "=> Done!"touch /.mongodb_password_setecho "========================================================================"echo "You can now connect to this MongoDB server using:"echo ""echo " mongo admin -u admin -p $PASS --host <host> --port <port>"echo ""echo "Please remember to change the above password as soon as possible!"echo "========================================================================" ④ run.sh脚本是主要的启动脚本,内容为:[root@docker1 Mongodb]# cat run.sh #!/bin/bashif [ ! -f /.mongodb_password_set ]; then /set_mongodb_password.shfiif [ "$AUTH" == "yes" ]; then export mongodb='/usr/local/mongodb/bin/mongod --nojournal --auth --httpinterface --rest'else export mongodb='/usr/local/mondodb/bin/mongod --nojournal --httpinterface --rest'fiif [ ! -f /data/db/mongod.lock ]; then eval $mongodbelse export mongodb=$mongodb' --dbpath /data/db' rm /data/db/mongod.lock mongod --dbpath /data/db --repair && eval $mongodbfi ⑤ 创建镜像 根据Dockerfile创建镜像mongodb:latest:[root@docker1 Mongodb]# docker build -t mongodb . [root@docker1 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmongodb latest adf9a26bb498 15 minutes ago 1.19 GB...... ⑥ 使用示范: 启动后台容器,并分别映射27017,28017,22端口到本地:[root@docker1 Mongodb]# docker run -d -p 27017:27017 -p 28017:28017 -p 37017:22 mongodbb38f560ba2b16a4e0c9c5b77c02e2e07b9f45eed8ce7de5dd2d6755d8d962050[root@docker1 Mongodb]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb38f560ba2b1 mongodb "/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:27017->27017/tcp, 0.0.0.0:28017->28017/tcp, 0.0.0.0:37017->22/tcp trusting_pasteur[root@docker1 Mongodb]# docker logs b38f560ba2b1 ......========================================================================You can now connect to this MongoDB server using: mongo admin -u admin -p NQ1VmsSWUwF1 --host <host> --port <port>Please remember to change the above password as soon as possible!========================================================================......输出中的 NQ1VmsSWUwF1 就是admin用户的密码还可以利用环境变量在容器启动时指定密码:[root@docker1 Mongodb]# docker run -d -p 27017:27017 =p 37017:22 -e MONGODB_PASS="mypass" mongodb甚至,设定不需要密码:[root@docker1 Mongodb]# docker run -d 27017:27017 -p 28017:28017 -e AUTH=no mongodb同样,读者可以使用-v参数来映射本地目录到容器。⑦ 详细启动参数:
Mongodb的启动参数有很多,包括:--quiet #安静输出--port arg #指定服务端口号,默认端口27017--bind_ip arg #绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP--logpath arg #指定Mongodb日志文件,注意是指定文件不是目录--logappend #使用追加的方式写日志--pidfilepath arg #PID File的完整路径,如果没有设置,则没有PID文件--keyFile arg #集群的私钥的完整路径,只对于Replica Set架构有效--unixSocketPrefix arg #UNIX域套接字替代目录,(默认为/tmp)--fork #以守护进程的方式运行MongoDB,创建服务器进程--auth #启用验证--cpu #定期显示CPU的利用率和iowait--dbpath arg #指定数据库路径--dialog arg #diaglog选项 0=off 1=w 2=R 3=both 7=W+some reads--directoryperdb #设置每个数据库将被保存在一个单独的目录--journal #启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里--journalOptions arg #启用日志诊断选项--ipv6 #启用ipv6选项--jsonp #允许JSONP形式通过HTTP访问(有安全影响)--maxConns args #最大同时连接默认2000--noauth #不启用验证--nohttpinterface #关闭http接口,默认关闭27018端口访问--noprealloc #禁用数据文件预分配(往往影响性能)--noscripting #禁用脚本引擎--notablescan #不允许表扫描--noubixsocket #禁用Unix套接字监听--nssize arg (=16) #设置信数据库.ns文件大小(MB)--objcheck #在收到客户数据,检查的有效性--profile arg #档案参数 0=off 1=slow 2=all--quota #限制每个数据库的文件数,设置默认为8--quotaFiles arg #number of filess allower per db, requires --quota--rest #开启简单的rest API--repair #修复所有数据库run repair on all dbs--repairpath arg #修复库生成的文件的目录,默认为目录名称dbpath--slowms arg (=100) #value of slow for profile and console log--smallfiles #使用较小的默认文件--syncdelay arg (=60) #数据写入磁盘的时间秒数(0=never,不推荐)--sysinfo #打印一些诊断系统信息--upgrade #如果需要升级数据库 * Replication 参数-----------------------------------------------------------------------------------------------------fastsync #从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步--autoresync #如果从库与主库同步数据差得多,自动重新同步--oplogSize arg #设置oplog的大小(MB) * 主/从参数-----------------------------------------------------------------------------------------------------master #主库模式--slave #从库模式--source arg #从库 端口号--only arg #指定单一的数据库复制--slavedelay arg #设置从库同步主库的延迟时间 * Replica set(副本集)选项----------------------------------------------------------------------------------------------------relSet arg #设置副本集名称 * Sharding(分片)选项----------------------------------------------------------------------------------------------------configsvr #声明这是一个集群的config服务,默认端口为27019,默认目录/data/configdb--shardsvr #声明这是一个集群的分片,默认端口27018--noMoveParanoia #关闭偏执为moveChunk数据保存上述参数也可以直接在mongod.conf配置文件中配置,例如:dbpath = /data/mongodblogpath = /data/mongodb/mongodb.loglogappend = truefork = trueauth = true