1. 程式人生 > >docker-zookeeper叢集搭建(偽叢集)

docker-zookeeper叢集搭建(偽叢集)

各個版本的docker安裝需要自行百度, 基本上都是採用yum install docker 或者 apt-get install docker 等方式安裝

docker命令問題

這裡不對docker所有命令進行介紹, 相關命令會在使用時簡要提及

我的docker版本17.05.0-ce

➜  ~ docker version
Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64
 Experimental: false

zookeeper映象獲取

docker pull zookeeper

這個命令會預設拉取最新的zookeeper映象
映象下載好了之後, 使用docker images命令可以檢視到當前主機中存在的映象

➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zookeeper           latest              5291027d4199        7 weeks ago         143MB

zookeeper單節點

zookeeper單節點啟動

➜  ~ docker run --name zk1 -d zookeeper:latest
0543d3008a7dd666a72b514aaf922114d4d6ff87b06e1e3b0b8d3b07e4268a70
  • docker run: 該命令是從映象啟動一個容器, 使其執行起來
  • --name: 該引數是指定容器的名稱, 如果不指定該引數, 則預設為這個容器的唯一ID, 也就是上面一串字串的前面幾位, 類似於git的版本記錄
  • -d: 是讓該容器以守護程序執行
  • zookeeper:latest: 指定zookeeper映象及其版本, :是映象與版本的分隔符

檢視映象中zookeeper的配置情況

docker exec -it zk1 /bin/bash

這個命令是建立與zk1之間的一個連線, 這個連線通過bash命令進行互動(我是這麼理解的, 如有不對, 請指正)

  • -i: 建立標準輸入通道進行互動
  • -t: 分配一個tty (我理解為linux登入之後分配的一個會話)

我將兩個引數合併在一起, 所以直接用-it就好了

vi /conf/zoo.cfg
clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2

zookeeper的標準配置就在/conf
當我們啟動容器的時候, zookeeper會自動啟動, 並載入這個配置檔案, 這個檔案稍後我們還會用到, 留意一下

zookeeper單節點執行情況檢視

➜  ~ docker logs zk1
...
-> 中間省略很多內容沒有貼出來  
...binding to port 0.0.0.0/0.0.0.0:2181

檢視zookeeper映象啟動日誌(具體這個日誌是怎麼輸出到這裡的, 我還沒去弄明白)

zookeeper執行狀態

docker inspect zk1

檢視docker 容器的一些構建資訊, 這裡我主要是查詢該容器的ip地址

"IPAddress": "172.17.0.2"

接下在宿主機中執行命令, 檢視zookeeper執行狀態

➜  ~ echo stat | nc 172.17.0.2 2181
Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
Clients:
 /172.17.0.1:35160[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: standalone
Node count: 4

由此可知, 我們當前的zookeeper是單節點執行的, 接下來搭建叢集版, 很簡單哦, 正常配置zookeeper叢集是一樣的

zookeeper的docker容器叢集搭建

說明

由於是宿主機只有一個, 所以所有docker容器在本機中都存在與一個網段中, 相互之間是可以進行通訊的, 不需要使用--link命令也可以通訊, 如果對docker有更進一步配置, 就需要要參照其它文件進行設定了

啟動兩個節點

重新按照如上命令啟動兩個節點, 加上zk1就3個節點了
通過docker inspect {container_name}命令我們可以獲取到所有zookeeper單節點的ip地址

  • zk1: 172.17.0.2
  • zk2: 172.17.0.3
  • zk3: 172.17.0.4

配置

進入zk1, 編輯配置檔案

docker exec -it zk1 /bin/bash

加上server的配置資訊, 我直接貼出最終結果

clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
server.1=172.17.0.2:2888:3888
server.2=172.17.0.3:2888:3888
server.3=172.17.0.4:2888:3888

可以看出我把後面啟動的兩個zk的ip地址資訊都新增進來了
2888, 是zk之間通訊的埠
3888, 是zk之間投票選舉的埠

儲存退出

echo 1 > /data/myid

這條命令的意思是, 將1輸出到/data/myid檔案中, 這個是什麼作用呢?
從我們的配置中可以看出, zk1的服務名是server.1, 這個1就是指定的服務名稱

zk2, 和 zk3, 在配置檔案上進行相同操作, 但是在echo 命令上分別輸出2, 3,到對應的myid檔案中

說一下為什麼要放在/data目錄下
因為從配置檔案中我們知道, zookeeper配置了資料目錄在/data, 所以我們要將myid檔案放在/data目錄下

全部儲存退出, 重啟容器

docker restart zk1
docker restart zk2
docker restart zk3

檢視叢集是否部署成功

➜  ~ echo stat | nc 172.17.0.2 2181
Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
Clients:
 /172.17.0.1:35192[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: follower
Node count: 4

可以明顯看到之前查詢的mode從standlone變成了follower, 說明叢集部署成功, 好了~~

轉載來源 https://www.jianshu.com/p/9a2963c2998a