螞蟻01啃大象:
# 本文作者-劉曉濤
# 創建時間:2016-1-26:22:30
# 完成時間:2016-1-27-23:11
# 我不比別人聰明,學習東西也慢,記憶力也好像降低了(奔三了),但我不能放棄學習止步不前!
# 寫此文章,一 督促自己還有任務沒有完成 二:記錄學習過程,方便後期查找,加深記憶 三 共同交流探討
要啃的大象:
(文章:“使用 Docker,7 個命令部署一個 Mesos 集羣”。文章來源於Linux公社網站(www.linuxidc.com) 鏈接爲:http://www.linuxidc.com/Linux/2015-06/118589.htm )
螞蟻01:下文-all
本編文章的目的:
1 通過zookeeper的Dockerfile複習複習docker
2 通過zookeeper的Dockerfile學習zookeeper
該zookeeper鏡像信息的地址爲:
https://registry.hub.docker.com/u/garland/zookeeper/
https://github.com/sekka1/mesosphere-docker/tree/master/zookeeper
Dockerfile
====================================== # DOCKER-VERSION 1.0.1 # VERSION 0.5 # SOURCE https://github.com/jplock/docker-zookeeper FROM debian:jessie MAINTAINER Justin Plock <[email protected]> RUN apt-get update && apt-get install -y openjdk-7-jre-headless wget RUN wget -q -O - http://apache.mirrors.pair.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz | tar -xzf - -C /opt \ && mv /opt/zookeeper-3.4.6 /opt/zookeeper \ && cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg \ && mkdir -p /tmp/zookeeper ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64 ADD ./run.sh /opt/run.sh RUN chmod 777 /opt/run.sh EXPOSE 2181 2888 3888 WORKDIR /opt/zookeeper VOLUME ["/opt/zookeeper/conf", "/tmp/zookeeper"] CMD ["/opt/run.sh"] =======================================
看到此Dockerfile第一眼:我擦,大便系統,沒玩過啊,第二眼:沒關係,類unix系統,原理通用。
大體一看:
兩個RUN命令,得知zookeeper的安裝環境需要java和如何安裝zookeeper
EXPOSE命令,對外提供三個端口(之前看了一下zookeeper,大概知道zookeeper要三個端口)
ADD命令:擦,加了運行腳本進去,啥腳本啊這是,待我搭好docker環境進入容器拷貝出來之後研究
VOLUME:該命令我只記得是掛載,忘了是掛載 A-B了還是兩個都對外掛載,等會創建容器後看看
通過上面的大體一看,可以知道zookeeper如何大概安裝運行,配置文件路徑,對外提供那個端口服務(軟件的原理都差不多:安裝運行、配置文件、端口)
開始啃大象:
指定目標:
1 構建一個Centos7的zookeeper鏡像(基本照抄吧)
2 製作基於Centos7系統(非鏡像)zookeeper的安裝部署文檔
3 儘可能的深入瞭解zookeeper的原理(zookeeper是什麼?可以用來幹什麼?怎麼幹的?)
如何去做:
1 先準備個乾淨的Centos7環境把zookeeper安裝運行一下
2 在Centos7安裝運行沒問題了,可以考慮構建Dockerfile了
3 參考百度 谷歌 官方文檔 理解zookeeper原理。(之前2步要是遇到問題,我也得去搜去問去解決,我又不是大神)
(剛剛又突然冒出個想法:使用saltstack來安裝zookeeper,自己給自己嚇一跳,先算了吧,以後再說)
目標1-1 下載鏡像,並運行(安裝docker 略)
systemctl start docker
導入centos鏡像(提前下載好了,不然網絡下載太慢,建議***或是用國外主機pull下來後自己保存着)
[root@linux-node1 opt]# docker load < centos.tar.gz
下載上面文章的zookeeper鏡像
docker pull garland/zookeeper
查看鏡像:
[root@linux-node1 local]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE docker.io/centos latest 60e65a8e4030 4 weeks ago 196.6 MB docker.io/garland/zookeeper latest 0e07387e8ab2 12 months ago 378.5 MB
下載完成後,使用該鏡像運行容器
docker run -d \ -p 2181:2181 \ -p 2888:2888 \ -p 3888:3888 \ garland/zookeeper
查看運行的容器
[root@linux-node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f09f7d3f100b garland/zookeeper "/opt/run.sh" 22 minutes ago Up 22 minutes 0.0.0.0:2181->2181/tcp, 0.0.0.0:2888->2888/tcp, 0.0.0.0:3888->3888/tcp lonely_tesla
進入容器,exit後,容器繼續運行的腳本(本腳本來自老男孩教育-講師找班長)
[root@linux-node1 ~]# vim enter_doker.sh #!/bin/bash PID=`docker inspect --format "``.`State`.`Pid`" $1` nsenter -t $PID -u -i -n -p
進入容器:
[root@linux-node1 ~]# ./enter_doker.sh f09f7d3f100b [root@f09f7d3f100b ~]#
run.sh的內容:
============================================================= #!/bin/sh ZOO_CFG="/opt/zookeeper/conf/zoo.cfg" # Output server ID echo "server id (myid): ${SERVER_ID}" echo "${SERVER_ID}" > /tmp/zookeeper/myid # Add additional ZooKeeper servers into the zoo.cfg file echo "${ADDITIONAL_ZOOKEEPER_1}" >> ${ZOO_CFG} echo "${ADDITIONAL_ZOOKEEPER_2}" >> ${ZOO_CFG} echo "${ADDITIONAL_ZOOKEEPER_3}" >> ${ZOO_CFG} echo "${ADDITIONAL_ZOOKEEPER_4}" >> ${ZOO_CFG} echo "${ADDITIONAL_ZOOKEEPER_5}" >> ${ZOO_CFG} echo "${ADDITIONAL_ZOOKEEPER_6}" >> ${ZOO_CFG} echo "${ADDITIONAL_ZOOKEEPER_7}" >> ${ZOO_CFG} echo "${ADDITIONAL_ZOOKEEPER_8}" >> ${ZOO_CFG} echo "${ADDITIONAL_ZOOKEEPER_9}" >> ${ZOO_CFG} echo "${ADDITIONAL_ZOOKEEPER_10}" >> ${ZOO_CFG} # Start Zookeeper /opt/zookeeper/bin/zkServer.sh start-foreground ============================================================
看到此 有點懵,echo一大堆東西,不知道什麼意思啊。
唯一看明白的是要想做zookeeper鏡像,那麼要讓zookeeper運行在前臺,參數就是start-foreground
先自己在centos7上搭建吧
cd /opt wget http://apache.mirrors.pair.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz tar -xzf zookeeper-3.4.6.tar.gz mv zookeeper-3.4.6 zookeeper cp zookeeper/conf/zoo_sample.cfg zookeeper/conf/zoo.cfg mkdir -p /tmp/zookeeper
配置文件詳解:
zookeeper/conf/zoo_sample.cfg
tickTime=2000 # zookeeper服務端之間或是服務端與客戶端(follower)之間維持心跳的時間間隔(毫秒) initLimit=10 # 這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端, 而是 Zookeeper 服務器集羣中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。 當已經超過 10 個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器還沒有收到客戶端的返回信息, 那麼表明這個客戶端連接失敗。總的時間長度就是 5*2000=10 秒 syncLimit=5 # 這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度最長不能超過多少個 tickTime 的時間長度, 總的時間長度就是 2*2000=4 秒 dataDir=/tmp/zookeeper # Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏 clientPort=2181 #這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。 # the maximum number of client connections. increase this if you need to handle more clients #maxClientCnxns=60 # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 #配置集羣 server.1=192.168.56.21:2888:3888 server.2=192.168.56.22:2888:3888
# server.A=B:C:D 其中 A 是一個數字,表示這個是第幾號服務器; B 是這個服務器的 ip 地址; C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口; D 表示的是萬一集羣中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。
如果是僞集羣的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。
除了修改 zoo.cfg 配置文件,集羣模式下還要配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面就有一個數據就是 A 的值,Zookeeper 啓動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷到底是那個 server。
完整的配置文件:
[root@linux-node1 conf]# cd /opt/zookeeper/conf/ [root@linux-node1 conf]# vim zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/zookeeper/data clientPort=2181 server.1=192.168.56.21:2888:3888 server.2=192.168.56.22:2888:3888
運行服務:
[root@linux-node1 ~]# /opt/zookeeper/bin/zkServer.sh start JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
查看狀態:
[root@linux-node1 ~]# /opt/zookeeper/bin/zkServer.sh status JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Mode: follower
[root@linux-node2 ~]# /usr/local/zookeeper-3.4.6/bin/zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg Mode: leader
zookeeper搭建完成,配置文件詳解完成,原理可以看http://blog.csdn.net/qinglu000/article/details/23844359,很詳細
基於centos的zookeeper鏡像的Dockerfile構建:
# auther: liuxiaotao # date: 2016-1-27 # version: 1.0 FROM centos MAINTAINER liuxiaotao [email protected] RUN yum update -y \ && yum install -y java-1.7.0-openjdk java-1.7.0-openjdk-devel java-1.7.0-openjdk-headless ADD zookeeper-3.4.6.tar.gz /usr/local/src/ # docker can zuto untar zhe *.tar.gz files RUN mv /usr/local/src/zookeeper-3.4.6 /usr/local/zookeeper ADD zoo.cfg /usr/local/zookeeper/conf/ EXPOSE 2181 2888 3888 VOLUME ["/usr/local/zookeeper/conf", "/usr/local/zookeeper/data"] CMD ["/usr/local/zookeeper/bin/zkServer.sh start-foreground"]
構建
docker build -t lezyo/zookepeer:v2 .
查看鏡像:
[root@linux-node1 docker]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE lezyo/zookepeer v2 cb3c2eb639ec 10 minutes ago 561.8 MB lezyo/zookeeper v1 b83857ea996f 41 minutes ago 561.8 MB <none> <none> 2d8697315524 44 minutes ago 523 MB <none> <none> 898c41613f2f 45 minutes ago 523 MB <none> <none> e6ef1aaeb302 48 minutes ago 523 MB docker.io/centos latest 60e65a8e4030 4 weeks ago 196.6 MB docker.io/garland/zookeeper latest 0e07387e8ab2 12 months ago 378.5 MB
運行:
docker run -d -P lezyo/zookepeer:v2 /usr/local/zookeeper/bin/zkServer.sh start-foreground
運行成功,但是簡陋了點,好了zookeeper先到這。啃下一個。