大家好,我是程序員小羅,這是我的技術(shù)學(xué)習(xí)筆記。
起因
由于最近在學(xué)習(xí)zookeeper的原理,所以需要在安裝一個集群來實驗一些特性加深理解。
但是問題來了,我們作為個人學(xué)習(xí)者,要搭建集群又沒有那么多機器,要么就是搭建偽集群,或者就是需要安裝一個虛擬機軟件(比如vmWare),裝多個虛擬機。 這兩種方法我之前都試過,都不太理想,一個需要改端口,一種需要安裝很多虛擬機,而且換了電腦也不好遷移。每次都得搞重復(fù)的配置,實現(xiàn)是太令人煩惱了;
目標
綜上,上述的痛點,都不是我們愿意做的。接下來,就要介紹今天我用的神器:Docker 。
使用Docker 基本上不用我們裝環(huán)境之類的配置,比如安裝 jdk?,F(xiàn)在我們直接可以從鏡像倉庫拉別人制作好的鏡像,簡直不要太方便,直接運行即可。
今天我要搭建的是一個由四臺 zk 構(gòu)成的 zk 集群,其中一臺為 Leader,兩臺 Follower,一臺 Observer。
talk is cheap,show me your code, 接著往下看吧!
實戰(zhàn)
不管你現(xiàn)在用的windows 還是linux 系統(tǒng),首先你需要安裝好Docker環(huán)境。 這里就不在敘述了,官網(wǎng)下載安裝即可。
如果對Docker 基本操作不熟悉的話,可以看我之前寫的 Docker入門(鏡像、容器、倉庫)
PS: 本次所制作的鏡像,可以直接保存到自己的私服,以后隨時隨地直接拉取運行即可。一次制作,到處運行。
私服的搭建也可以看我之前寫的Docker入門。
獲取鏡像
docker pull zookeeper:3.4.11 這里我選擇了3.4.11 版本。
設(shè)置docker固定ip
因為我們要搭建的是集群環(huán)境,所以ip地址必須固定,因此需要自定義一種網(wǎng)絡(luò)類型。
創(chuàng)建自定義網(wǎng)絡(luò)類型,并且指定網(wǎng)段
sudo docker network create --subnet=192.168.0.0/24 staticnet
通過docker network ls可以查看到網(wǎng)絡(luò)類型中多了一個 staticnet
使用新的網(wǎng)絡(luò)類型創(chuàng)建并啟動容器
chong@L MINGW64 ~
$ docker run --name zookeeper-1 --restart always --net staticnet --ip 192.168.0.10 -d zookeeper:3.4.11
61a331b2584b6ef949e2183892c5a73a2e214b7071d4879993f7cbba41c836ed
通過docker inspect可以查看容器 ip為192.168.0.10,關(guān)閉容器并重啟,發(fā)現(xiàn)容器ip并未發(fā)生改變。
進入容器進行配置
由于容器在后臺運行,因此我們需要進入容器,有三種方式,有興趣的可以看我之前寫的 Docker入門(鏡像、容器、倉庫)
$ docker exec -ti 61a bash # 61a為容器id
登入后,我們只需要做2件事:
- 修改zoo.cfg
在 zoo.cfg 文件中添加 zk 集群節(jié)點列表
bash-4.4# vi /conf/zoo.cfg
clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
maxClientCnxns=60
server.1=192.168.0.10:2888:3888
server.2=192.168.0.11:2888:3888
server.3=192.168.0.12:2888:3888
server.4=192.168.0.13:2888:3888:observer
- 創(chuàng)建 myid 文件
在一步的zoo.cfg文件中我們可以看到dataDir的路徑,在/data 目錄中創(chuàng)建表示當前主機編號的 myid 文件。該主機編號要與 zoo.cfg 文件中設(shè)置的編號一致。
bash-4.4# echo 1 > /data/myid
保存修改后的鏡像
因為我們上面對正在運行的容器做了三點修改,這也正是我們需要的集群配置,所以我們要將這個容器制作成鏡像,如下操作:
$ docker commit -m "create zk1" -a "coderluo" 61a zookeeper-1:3.4.11
sha256:455b27d32c83365790b7b6eff7d58021556858390d28d27b07aca206e83c507c
chong@L MINGW64 ~
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zookeeper-1 3.4.11 455b27d32c83 8 seconds ago 146MB
39.108.186.135:5000/ubuntu v1 a2a15febcdf3 13 days ago 64.2MB
zookeeper 3.4.11 56d414270ae3 19 months ago 146MB
使用docekr commit 進行基于已有的鏡像進行創(chuàng)建,我的上一篇Docker入門中也有寫。然后通過docker images 查看到zookeeper-1 這個鏡像已經(jīng)存在了。
到這里一臺鏡像已經(jīng)制作好了,接下來就是一樣的事情重復(fù)干幾遍:
- 進入容器
- 修改myid
- 保存修改制作為新鏡像
查詢?nèi)萜鱥d
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61a331b2584b zookeeper:3.4.11 "/docker-entrypoint.…" About an hour ago Up 12 minutes 2181/tcp, 2888/tcp, 3888/tcp zookeeper-1
進入容器執(zhí)行修改(第2,3臺都執(zhí)行此操作):
$ docker exec -ti 61a bash
bash-4.4# echo 2 > /data/myid
bash-4.4# cat /data/myid
2
bash-4.4# exit
exit
創(chuàng)建新的鏡像(第2,3臺都執(zhí)行此操作):
$ docker commit -m "create zookeeper-2" -a "coderluo" 61a zookeeper-2:3.4.11
sha256:c775aff13fd3b2fc30066f6fc5f8a5ee429be3052b790c8e02cf74b5e4bf71e9
完成后,這里要注意,第四臺主機因為我們要讓他作為Observer,所以他需要在zoo.cfg中增加一行配置:
peerType=observer

然后在執(zhí)行上面和第2,3臺機器一樣的操作。
最后我們查看當前所有的鏡像,不出意外的話下圖展示的你也都有了:

到這里,今天的學(xué)習(xí)就要接近尾聲了,最后一步
依次啟動4臺zookeeper實例
直接按照我下面的命令一次執(zhí)行即可:
chong@L MINGW64 ~
$ docker run --name zookeeper-1 --restart always --net staticnet --ip 192.168.0.10 -d zookeeper-1:3.4.11 #第一臺
35acd4f798c8154047f30af184145d8b4124ec8a4e8e4a549db0d333a1c33785
chong@L MINGW64 ~
$ docker run --name zookeeper-2 --restart always --net staticnet --ip 192.168.0.11 -d zookeeper-2:3.4.11 #第二臺
7ef30c809183dc223e42e891880ad8c85381fac11d15da5c0455400b915c77bb
chong@L MINGW64 ~
$ docker run --name zookeeper-3 --restart always --net staticnet --ip 192.168.0.12 -d zookeeper-3:3.4.11 #第三臺
f138451dd21ce5217eb6e4472116b3ffa32e9ea2afbcaae44ee4d633040299f9
chong@L MINGW64 ~
$ docker run --name zookeeper-4 --restart always --net staticnet --ip 192.168.0.13 -d zookeeper-4:3.4.11 #第四臺
c662d3438db74414c9b0178bc756b6cf96cd0458cbc226e8854da4a06337d656
查看運行狀態(tài):
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c662d3438db7 zookeeper-4:3.4.11 "/docker-entrypoint.…" 6 seconds ago Up 4 seconds 2181/tcp, 2888/tcp, 3888/tcp zookeeper-4
f138451dd21c zookeeper-3:3.4.11 "/docker-entrypoint.…" 24 seconds ago Up 23 seconds 2181/tcp, 2888/tcp, 3888/tcp zookeeper-3
7ef30c809183 zookeeper-2:3.4.11 "/docker-entrypoint.…" 41 seconds ago Up 39 seconds 2181/tcp, 2888/tcp, 3888/tcp zookeeper-2
35acd4f798c8 zookeeper-1:3.4.11 "/docker-entrypoint.…" About a minute ago Up About a minute 2181/tcp, 2888/tcp, 3888/tcp zookeeper-1
總結(jié)
至此我們今天要搭建的四臺zk實例組成的集群已經(jīng)搞定了,有沒有感覺到有了Docker 簡直是神奇啊,只有親身體會下才能感覺他的便利。
歡迎在留言區(qū)討論,今天就到這里啦,可以愉快的學(xué)習(xí)第zk的底層原理了。
Docker 入門基礎(chǔ)知識,可以看我整理的這篇文章: