【系列8】使用Dockerfile创建带MongoDB的Centos Docker镜像

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

  MongoDB是一款可扩展、高性能的开源文档(Document-Oriented)数据库。它采用C++开发,支持复杂的数据类型和强大的查询语言,提供了关系数据库的绝大部分功能。MongoDB由于其高性能、易部署、易使用等特点,已经在各种领域都得到了广泛的应用。
 ① 下载文件
 从GitHub Dockerpool社区账户下载Mongodb镜像项目:
[root@docker1 ~]# git clone https://github.com/DockerPool/Mongodb.git
Cloning 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 0
Unpacking objects: 100% (12/12), done.
查看内容,包括写好的Dockerfile和若干脚本等:
[root@docker1 ~]# cd Mongodb/
[root@docker1 Mongodb]# ls
Dockerfile  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.com


COPY mongodb-linux-x86_64-rhel70-3.6.0.tgz /mongodb-linux-x86_64-rhel70-3.6.0.tgz

COPY pwgen-2.08.tar.gz /pwgen-2.08.tar.gz


RUN yum update -y && yum install -y gcc automake autoconf libtool make


RUN tar -xf pwgen-2.08.tar.gz

WORKDIR pwgen-2.08

RUN ./configure && make && make install


#定义工作目录

WORKDIR /


RUN tar -xf mongodb-linux-x86_64-rhel70-3.6.0.tgz

RUN mv mongodb-linux-x86_64-rhel70-3.6.0 mongodb

RUN mv mongodb /usr/local/


#设置环境变量

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/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


CMD ["/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 0
fi

/usr/local/mongodb/bin/mongod --smallfiles --nojournal &

PASS=${MONGODB_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${MONGODB_PASS} ] && echo "preset" || echo "random" )

RET=1
while [[ 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_set

echo "========================================================================"
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/bash

if [ ! -f /.mongodb_password_set ]; then

        /set_mongodb_password.sh

fi


if [ "$AUTH" == "yes" ]; then

   #export mongodb='/usr/local/mongodb/bin/mongod --nojournal --auth --httpinterface --rest'

    export mongodb='/usr/local/mongodb/bin/mongod --nojournal --auth'

else

   #export mongodb='/usr/local/mondodb/bin/mongod --nojournal --httpinterface --rest'

    export mongodb='/usr/local/mondodb/bin/mongod --nojournal'

fi


if [ ! -f /data/db/mongod.lock ]; then

    eval $mongodb

else

    export mongodb=$mongodb' --dbpath /data/db' 

    rm /data/db/mongod.lock

    mongod --dbpath /data/db --repair && eval $mongodb

fi


 ⑤ 创建镜像
 根据Dockerfile创建镜像mongodb:latest:
[root@docker1 Mongodb]# docker build -t mongodb .
 
[root@docker1 ~]# docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
mongodb                                    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 mongodb
b38f560ba2b16a4e0c9c5b77c02e2e07b9f45eed8ce7de5dd2d6755d8d962050
[root@docker1 Mongodb]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                                       NAMES
b38f560ba2b1        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/mongodb
logpath = /data/mongodb/mongodb.log
logappend = true
fork = true
auth = true


………………………………………………………………………………………………………………………………………………………

mongodb-linux-x86_64-rhel70-3.6.0安装源码包              http://down.51cto.com/data/2369559 

pwgen-2.08.tar                            http://down.51cto.com/data/2369589 




本文转自 Mr_sheng 51CTO博客,原文链接:http://blog.51cto.com/sf1314/2056670

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
3天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
1天前
|
存储 Linux Docker
CentOS7修改Docker容器和镜像默认存储位置
CentOS7修改Docker容器和镜像默认存储位置
|
3天前
|
存储 安全 开发者
如何删除 Docker 镜像、容器和卷?
【5月更文挑战第11天】
19 2
如何删除 Docker 镜像、容器和卷?
|
3天前
|
运维 安全 Docker
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
【5月更文挑战第9天】Docker技术在软件开发和部署中带来便利,但其镜像安全问题不容忽视。本文探讨了Docker镜像安全扫描与漏洞修复,强调了镜像安全对应用和系统的重要性。文中介绍了静态和动态扫描方法,列举了软件漏洞、配置漏洞和恶意软件等常见安全问题,并提到了Clair和Trivy等扫描工具。修复策略包括更新软件、调整配置和重建镜像。此外,加强安全意识、规范镜像制作流程和定期扫描是管理建议。未来,将持续面对新的安全挑战,需持续研究和完善安全技术。
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
|
3天前
|
Java Linux 数据安全/隐私保护
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
|
3天前
|
存储 弹性计算 运维
Docker数据集与自定义镜像:构建高效容器的关键要素
Docker数据集与自定义镜像:构建高效容器的关键要素
|
3天前
|
存储 缓存 运维
【Docker 专栏】Docker 镜像的分层存储与缓存机制
【5月更文挑战第8天】Docker 镜像采用分层存储,减少空间占用并提升构建效率。每个镜像由多个层组成,共享基础层(如 Ubuntu)和应用层。缓存机制加速构建和运行,通过检查已有层来避免重复操作。有效管理缓存,如清理无用缓存和控制大小,可优化性能。分层和缓存带来资源高效利用、快速构建和灵活管理,但也面临缓存失效和层管理挑战。理解这一机制对开发者和运维至关重要。
【Docker 专栏】Docker 镜像的分层存储与缓存机制
|
3天前
|
网络协议 Linux Ruby
CentOS7各个版本镜像下载地址
CentOS7各个版本镜像下载地址
552 0
|
Linux
Linux(CentOS 7.9)镜像下载
Linux、Centos 7.9、系统镜像
28649 0
|
Linux
Linux CentOS各大网站镜像资源地址展示,各种rpm资源包下载地址,rpm安装包大全
Linux CentOS各大网站镜像资源地址展示,各种rpm资源包下载地址,rpm安装包大全
750 0
Linux CentOS各大网站镜像资源地址展示,各种rpm资源包下载地址,rpm安装包大全