天天看點

【docker】基于Dockerfile建構monogdb服務鏡像

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

FROM sshd:centos 

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

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 "Please remember to change the above password as soon as possible!"

 ④ run.sh腳本是主要的啟動腳本,内容為:

[root@docker1 Mongodb]# cat run.sh 

if [ ! -f /.mongodb_password_set ]; then

       /set_mongodb_password.sh

if [ "$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'

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

   eval $mongodb

   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

本文轉自 Mr_sheng 51CTO部落格,原文連結:http://blog.51cto.com/sf1314/2048024