1.鏡像下載
docker pull zookeeper
2.啟動 ZK 鏡像
>>> docker run --name my_zookeeper -d zookeeper:latest
這個命令會在后台運行一個 zookeeper 容器, 名字是 my_zookeeper, 並且它默認會導出 2181 端口.
接着我們使用:
docker logs -f my_zookeeper
3.使用 ZK 命令行客戶端連接 ZK
因為剛才我們啟動的那個 ZK 容器並沒有綁定宿主機的端口, 因此我們不能直接訪問它. 但是我們可以通過 Docker 的 link 機制來對這個 ZK 容器進行訪問. 執行如下命令:
docker run -it --rm --link my_zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper
這個命令的含義是:
-
啟動一個 zookeeper 鏡像, 並運行這個鏡像內的 zkCli.sh 命令, 命令參數是 "-server zookeeper"
-
將我們先前啟動的名為 my_zookeeper 的容器連接(link) 到我們新建的這個容器上, 並將其主機名命名為 zookeeper
當我們執行了這個命令后, 就可以像正常使用 ZK 命令行客戶端一樣操作 ZK 服務了.
4.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 集群確實是搭建起來了.