Docker 一步搞定 ZooKeeper 集羣的搭建

本文引用原地址:http://www.javashuo.com/article/p-rocywxie-ch.htmlhtml

 

鏡像下載

hub.docker.com 上有很多 ZK 鏡像, 不過爲了穩定起見, 咱們就使用官方的 ZK 鏡像吧.
首先執行以下命令:docker

docker pull zookeeper

 

 

當出現以下結果時, 表示鏡像已經下載完成了:bash

docker pull zookeeper
Using default tag: latest
latest: Pulling from library/zookeeper
 
e110a4a17941: Pull complete
a696cba1f6e8: Pull complete
bc427bd93e95: Pull complete
c72391ae24f6: Pull complete
40ab409b6b34: Pull complete
d4bb8183b85d: Pull complete
0600755f1470: Pull complete
Digest: sha256:12458234bb9f01336df718b7470cabaf5c357052cbcb91f8e80be07635994464
Status: Downloaded newer image for zookeeper:latest

 

 

 

 

 

 

 

 

 

 

 

ZK 鏡像的基本使用 

啓動 ZK 鏡像

 

docker run --name my_zookeeper -d zookeeper:latest

 

 

 

這個命令會在後臺運行一個 zookeeper 容器, 名字是 my_zookeeper, 而且它默認會導出 2181 端口.
接着咱們使用:服務器

docker logs -f my_zookeeper

  

這個命令查看 ZK 的運行狀況, 輸出相似以下內容時, 表示 ZK 已經成功啓動了:tcp

docker logs -f my_zookeeper
ZooKeeper JMX enabled by default
Using config:  /conf/zoo .cfg
...
2016-09-14 06:40:03,445 [myid:] - INFO  [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0 /0 .0.0.0:2181

使用 ZK 命令行客戶端鏈接 ZK

由於剛纔咱們啓動的那個 ZK 容器並無綁定宿主機的端口, 所以咱們不能直接訪問它. 可是咱們能夠經過 Docker 的 link 機制來對這個 ZK 容器進行訪問. 執行以下命令:ui

docker run -it -- rm  --link my_zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper

  

若是對 Docker 有過了解的話, 那麼對上面的命令必定不會陌生了.
這個命令的含義是:spa

  1. 啓動一個 zookeeper 鏡像, 並運行這個鏡像內的 zkCli.sh 命令, 命令參數是 "-server zookeeper"命令行

  2. 將咱們先前啓動的名爲 my_zookeeper 的容器鏈接(link) 到咱們新建的這個容器上, 並將其主機名命名爲 zookeeperrest

當咱們執行了這個命令後, 就能夠像正常使用 ZK 命令行客戶端同樣操做 ZK 服務了.code

ZK 集羣的搭建

由於一個一個地啓動 ZK 太麻煩了, 因此爲了方便起見, 我直接使用 docker-compose 來啓動 ZK 集羣.
首先建立一個名爲 docker-compose.yml 的文件, 其內容以下:

version:  '2'
services:
     zoo1:
         image: zookeeper
         restart: always
         container_name: zoo1
         ports:
             "2181:2181"
         environment:
             ZOO_MY_ID: 1
             ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
 
     zoo2:
         image: zookeeper
         restart: always
         container_name: zoo2
         ports:
             "2182:2181"
         environment:
             ZOO_MY_ID: 2
             ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
 
     zoo3:
         image: zookeeper
         restart: always
         container_name: zoo3
         ports:
             "2183:2181"
         environment:
             ZOO_MY_ID: 3
             ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

  

這個配置文件會告訴 Docker 分別運行三個 zookeeper 鏡像, 並分別將本地的 2181, 2182, 2183 端口綁定到對應的容器的2181端口上.
ZOO_MY_ID 和 ZOO_SERVERS 是搭建 ZK 集羣須要設置的兩個環境變量, 其中 ZOO_MY_ID 表示 ZK 服務的 id, 它是1-255 之間的整數, 必須在集羣中惟一. ZOO_SERVERS 是ZK 集羣的主機列表.

接着咱們在 docker-compose.yml 當前目錄下運行:

COMPOSE_PROJECT_NAME=zk_test docker-compose up

  

便可啓動 ZK 集羣了.
執行上述命令成功後, 接着在另外一個終端中運行 docker-compose ps 命令能夠查看啓動的 ZK 容器:

COMPOSE_PROJECT_NAME=zk_test docker-compose  ps
Name              Command               State           Ports
----------------------------------------------------------------------
zoo1    /docker-entrypoint .sh zkSe ...   Up      0.0.0.0:2181->2181 /tcp
zoo2    /docker-entrypoint .sh zkSe ...   Up      0.0.0.0:2182->2181 /tcp
zoo3    /docker-entrypoint .sh zkSe ...   Up      0.0.0.0:2183->2181 /tcp

  

注意, 咱們在 "docker-compose up" 和 "docker-compose ps" 前都添加了 COMPOSE_PROJECT_NAME=zk_test 這個環境變量, 這是爲咱們的 compose 工程起一個名字, 以避免與其餘的 compose 混淆.

使用 Docker 命令行客戶端鏈接 ZK 集羣

經過 docker-compose ps 命令, 咱們知道啓動的 ZK 集羣的三個主機名分別是 zoo1, zoo2, zoo3, 所以咱們分別 link 它們便可:

docker run -it -- rm  \
         --link zoo1:zk1 \
         --link zoo2:zk2 \
         --link zoo3:zk3 \
         --net zktest_default \
         zookeeper zkCli.sh -server zk1:2181,zk2:2181,zk3:2181

  

經過本地主機鏈接 ZK 集羣

由於咱們分別將 zoo1, zoo2, zoo3 的 2181 端口映射到了 本地主機的2181, 2182, 2183 端口上, 所以咱們使用以下命令便可鏈接 ZK 集羣了:

zkCli.sh -server localhost:2181,localhost:2182,localhost:2183

  

查看集羣

咱們能夠經過 nc 命令鏈接到指定的 ZK 服務器, 而後發送 stat 能夠查看 ZK 服務的狀態, 例如:

>>>  echo  stat |  nc  127.0.0.1 2181
Zookeeper version: 3.4.9-1757313, built on 08 /23/2016  06:50 GMT
Clients:
  /172 .18.0.1:49810[0](queued=0,recved=1,sent=0)
 
Latency min /avg/max : 5 /39/74
Received: 4
Sent: 3
Connections: 1
Outstanding: 0
Zxid: 0x200000002
Mode: follower
Node count: 4
>>>  echo  stat |  nc  127.0.0.1 2182
Zookeeper version: 3.4.9-1757313, built on 08 /23/2016  06:50 GMT
Clients:
  /172 .18.0.1:50870[0](queued=0,recved=1,sent=0)
 
Latency min /avg/max : 0 /0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x200000002
Mode: follower
Node count: 4
  
>>>  echo  stat |  nc  127.0.0.1 2183
Zookeeper version: 3.4.9-1757313, built on 08 /23/2016  06:50 GMT
Clients:
  /172 .18.0.1:51820[0](queued=0,recved=1,sent=0)
 
Latency min /avg/max : 0 /0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x200000002
Mode: leader
Node count: 4

  

經過上面的輸出, 咱們能夠看到, zoo1, zoo2 都是 follower, 而 zoo3 是 leader, 所以證實了咱們的 ZK 集羣確實是搭建起來了.

相關文章
相關標籤/搜索