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