使用 Docker 構建 Zookeeper 服務

1。 前言

在我們使用 Zookeeper 來進行各種功能的開發時,為了節約開發成本,我們通常使用的是 Zookeeper 的單機模式或者偽叢集模式,但是在測試環境和生成環境中,我們需要的就是高可用高效能的 Zookeeper 服務來對我們的應用提供支援了。

那麼如何搭建一個高可用高效能的 Zookeeper 服務叢集呢?其實在 Zookeeper 叢集模式這一節的內容中我們就搭建過叢集數量為 3 的 Zookeeper 服務。在本節內容中,我們會使用另外一種更高效的方式來搭建我們的 Zookeeper 叢集,這種方式就是使用容器引擎 Docker 來進行 Zookeeper 叢集的構建。接下來我們來簡單的瞭解一下 Docker,然後再使用 Docker 來安裝 Zookeeper 。

2。 Docker 介紹

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 系統或 Windows 系統上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。

首先我們來簡單瞭解一下 Docker 的組成。在 Docker 中有 4 個基本組成:

Docker Image 映象

Docker Container 容器

Docker Client 客戶端

Docker Daemon 守護程序

Docker 和 Zookeeper 同樣是 C/S 的架構,Docker 服務端透過 Docker Daemon 守護程序來維持長時間的執行,Docker Client 客戶端透過 CLI 的 API 來對 Docker 服務端的 Docker Image 映象和 Docker Container 容器來進行操作。我們透過 API 去 Docker Hub 的官網拉取 Image 映象,然後透過 Image 映象來建立 Container 容器。

在我們使用 Docker 來搭建 Zookeeper 叢集的時候,也同樣的先去 Docker Hub 的官網拉取 Zookeeper 的映象,然後透過這個 Zookeeper 映象就能建立 Zookeeper 的容器例項了。這個 Zookeeper 的容器例項就是一個 Zookeeper 服務,我們就可以透過 Zookeeper 客戶端來進行連線和操作了。

簡單了介紹了 Docker ,接下來我們介紹如何安裝 Docker。

3。 Docker 安裝

在不同的作業系統中都可以安裝 Docker ,本節內容中只演示 Ubuntu 環境下的 Docker 安裝。本次安裝演示的 Ubuntu 版本為 Ubuntu 20。04。1 LTS 。

apt 更換國內源

在安裝應用之前,我們需要把 apt 更換為國內源,這裡我們選擇阿里雲的 mirros。aliyun。com。

sudo cp /etc/apt/sources。list /etc/apt/sources。list。bak# 更換源為 mirros。aliyun。comsudo sed -i s@/archive。ubuntu。com/@/mirrors。aliyun。com/@g /etc/apt/sources。list# 更新源sudo apt-get cleansudo apt-get update

更換完畢後,我們還需要安裝 apt 的一些工具,如 https,curl 等。

安裝 apt 依賴包

sudo apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

獲取 GPG 金鑰證書

我們這裡使用阿里雲的映象來獲取 GPG 金鑰:

curl -fsSL http://mirrors。aliyun。com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -程式碼塊1

獲取成功會返回 OK ,我們使用 apt-key finger 命令檢視:

apt-key finger# 輸出金鑰資訊/etc/apt/trusted。gpg——————————pub rsa4096 2017-02-22 [SCEA]9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88uid [ unknown] Docker Release (CE deb) sub rsa4096 2017-02-22 [S]

金鑰新增成功後,我們就可以開始後續的安裝了。

新增 Docker 源

為了更快速的安裝 Docker,這裡我們新增阿里雲的 Docker 源,首先我們先使用 lsb_release -a 命令獲取當前系統的 Codename:

lsb_release -a# 輸出系統資訊No LSB modules are available。Distributor ID: UbuntuDescription: Ubuntu 20。04。1 LTSRelease: 20。04Codename: focal

本系統的 Codename 也就是版本程式碼為 focal,我們在新增 Docker 源的時候就會使用這個版本:

# 新增 docker-ce 源,系統為 ubuntu,系統版本為 focal, stable 為 docker 穩定版。sudo add-apt-repository “deb [arch=amd64] http://mirrors。aliyun。com/docker-ce/linux/ubuntu focal stable”

執行完畢後,我們需要更新 apt 源:

sudo apt-get update

Docker 安裝

更新完源後,我們就可以開始安裝 Docker 元件了:

sudo apt-get install docker-ce docker-ce-cli containerd。io

執行這一行命令需要一點時間,稍等片刻。完成後我們就可以來檢視 Docker 是否安裝成功了。

檢視 Docker 版本

使用 docker -v 來檢視 Docker 版本:

docker -v# 輸出 docker 版本資訊Docker version 19。03。13, build 4484c46d9d

看到版本資訊輸出就說明我們的 Docker 源安裝成功了。

Tips:

如果安裝失敗,需要注意系統的版本和新增的 Docker 源是否能使用。

安裝成功後,我們來新增 Docker Image 映象源。

新增 Docker Image 映象源

使用阿里雲的 Docker Image 映象源,需要登入阿里雲官網開啟

容器映象服務

https://cr。console。aliyun。com/cn-hangzhou/instances/mirrors

使用 Docker 構建 Zookeeper 服務

新增 Docker Image 映象源為阿里雲映象,這裡同學們使用自己賬號的加速器地址即可:

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon。json <<-‘EOF’{“registry-mirrors”: [“https://xxxxxx。mirror。aliyuncs。com”]}EOF

新增完畢後,我們就可以啟動我們的 Docker 服務了。

啟動 Docker

service docker start# 輸出啟動資訊* Starting Docker: docker

啟動完成,接下來我們進行測試。

Docker 測試

執行測試命令:

docker run hello-world

輸出:

Unable to find image ‘hello-world:latest’ locallylatest: Pulling from library/hello-world0e03bdcc26d7: Pull complete Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bcStatus: Downloaded newer image for hello-world:latestHello from Docker!This message shows that your installation appears to be working correctly。To generate this message, Docker took the following steps:1。 The Docker client contacted the Docker daemon。2。 The Docker daemon pulled the “hello-world” image from the Docker Hub。(amd64)3。 The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading。4。 The Docker daemon streamed that output to the Docker client, which sent itto your terminal。To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub。docker。com/For more examples and ideas, visit:https://docs。docker。com/get-started/

我們看到這段資訊就說明,我們的 Docker 測試成功了。

那麼接下來,我們就可以使用 Docker 來安裝 Zookeeper 服務。

4。 Docker 安裝 Zookeeper

查詢映象

我們可以去 Docker Hub 的官網檢視 Zookeeper 的映象:https://hub。docker。com/_/zookeeper

也可以使用 search 命令來查詢 Zookeeper 映象:

# 查詢 zookeeper 映象docker search zookeeper

執行這條命令會輸出很多 zookeeper 映象,這裡我們可以看到第一條就是官方的 zookeeper 映象。

NAME DESCRIPTION STARS OFFICIAL AUTOMATEDzookeeper Apache ZooKeeper is an open-source。。。 936 [OK]

拉取映象

接下來我們開始拉取 Zookeeper 映象:

# 拉取 zookeeper 映象,預設是 latestdocker pull zookeeper# 選擇版本拉取就在後面跟上版本資訊docker pull zookeeper:3。6

這裡我們選擇 latest 版的映象,執行 docker pull zookeeper 後開始拉取映象:

Using default tag: latestlatest: Pulling from library/zookeeperd121f8d1c412: Pull complete 75deccc0fc24: Pull complete 690f480f5f48: Pull complete b20f9556d3e0: Pull complete 30b60f0b1627: Pull complete a774eb30ae9a: Pull complete 99abe5102984: Pull complete f0154f2759c0: Pull complete Digest: sha256:6c051390cfae7958ff427834937c353fc6c34484f6a84b3e4bc8c512b53a16f6Status: Downloaded newer image for zookeeper:latestdocker。io/library/zookeeper:latest

檢視本地映象

拉取映象完畢後,我們使用 images 命令來檢視映象:

# 檢視映象docker images# 輸出資訊REPOSITORY TAG IMAGE ID CREATED SIZEzookeeper latest 36b7f3aa2340 10 days ago 252MB

啟動映象

接下來我們就可以啟動 zookeeper 映象了。

# run 啟動,-d 後臺執行,——name 別名,-p 埠對映(可以寫多個), 容器名稱:版本(不寫預設latest)docker run -d ——name=zookeeper -p 2181:2181 zookeeper

啟動成功後會輸出當前容器的 ID:

6e191d07172187ec27c2227ae99760177b2fe7dbca25061af35586dd7ee0d1cb

檢視容器

這裡我們可以使用 container 命令來檢視容器:

# 檢視所有的容器docker container ls -a

輸出容器列表,我們可以看見剛才啟動的 zookeeper 容器:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6e191d071721 zookeeper “/docker-entrypoint。…” 3 minutes ago Up 3 minutes zookeeper

進入容器

使用 exec 命令我們就可以進入已經啟動的 zookeeper 容器:

docker exec -it zookeeper /bin/bash

進入容器後我們使用

ls

命令來檢視 檔案列表:

LICENSE。txt NOTICE。txt README。md README_packaging。md bin conf docs lib

Zookeeper 的命令就在 bin 目錄中,我們可以使用 zkCli。sh 連線 Zookeeper 服務端,也可以使用宿主機的客戶端加對映的埠來連線 Docker 容器內的 Zookeeper 服務端。

想要退出容器的話使用

exit

命令即可。

關閉容器

如果我們想要關閉容器,在容器外使用以下命令:

docker container stop zookeeper

如果這樣來啟動多個容器,然後一個一個配置的話,也是一件繁瑣的事情。那麼有沒有一次效能啟動多個 Zookeeper 的方式呢?接下來我們就使用 Docker Compose 來構建 Zookeeper 叢集。

5。 Docker Compose

Docker Compose 的定位是:定義和執行多個 Docker 容器的應用(Defining and running multi-container Docker applications)。

Docker Compose 中有兩個重要的概念:

服務 service :一個應用的容器,實際上可以包括多個執行相同映象的容器例項。

專案 project :由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose。yml 檔案中定義。

透過 Docker Compose,我們可以使用 docker-compose。yml 檔案來配置應用程式需要的所有服務,然後使用

up

命令,就可以從 docker-compose。yml 檔案配置中建立並啟動所有服務。

首先我們來安裝 Docker Compose。

5。1 Docker Compose 安裝

我們可以直接從 Docker 官方 GitHub Release 上直接拉取編譯好的二進位制檔案:

# 拉取 composecurl -L https://github。com/docker/compose/releases/download/1。27。4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose# 新增 docker-compose 命令chmod +x /usr/local/bin/docker-compose# 補全命令curl -L https://raw。githubusercontent。com/docker/compose/1。8。0/contrib/completion/bash/docker-compose > /etc/bash_completion。d/docker-compose

執行完畢後,我們來檢視 docker-compose 的版本:

docker-compose -v# 輸出版本資訊docker-compose version 1。27。4, build 40524192

5。2 構建 Zookeeper 叢集

接下來我們就來使用 docker-compose。yml 檔案,構建 Zookeeper 叢集。

建立 docker-compose.yml

首先我們在 /usr/local 目錄下建立 zookeeper 資料夾,在 zookeeper 資料夾中建立 docker-compose。yml 檔案:

mkdir /usr/local/zookeepertouch /usr/local/zookeeper/docker-compose。yml

建立完成後,我們開始編寫 docker-compose。yml 檔案:

vi /usr/local/zookeeper/docker-compose。yml

# Zookeeper 版本version: ‘3。6’# 服務組services: # 服務1 zoo1: # 映象:zookeeper image: zookeeper # 總是啟動 restart: always # 地址別名 zoo1 hostname: zoo1 # 埠暴露 ports: - 2181:2181 # 環境配置 environment: # myid 檔案值 ZOO_MY_ID: 1 # 叢集服務列表 ZOO_SERVERS: server。1=0。0。0。0:2888:3888;2181 server。2=zoo2:2888:3888;2181 server。3=zoo3:2888:3888;2181 # 服務2 zoo2: image: zookeeper restart: always hostname: zoo2 ports: - 2182:2181 environment: ZOO_MY_ID: 2 ZOO_SERVERS: server。1=zoo1:2888:3888;2181 server。2=0。0。0。0:2888:3888;2181 server。3=zoo3:2888:3888;2181 # 服務3 zoo3: image: zookeeper restart: always hostname: zoo3 ports: - 2183:2181 environment: ZOO_MY_ID: 3 ZOO_SERVERS: server。1=zoo1:2888:3888;2181 server。2=zoo2:2888:3888;2181 server。3=0。0。0。0:2888:3888;2181

啟動

編寫完成後,在 docker-compose。yml 的目錄使用 docker-compose up 命令啟動:

# 進入 docker-compose。yml 所在目錄cd /usr/local/zookeeper/# 後臺啟動docker-compose up -d# 輸出啟動資訊Starting zookeeper_zoo1_1 。。。 doneStarting zookeeper_zoo3_1 。。。 doneStarting zookeeper_zoo2_1 。。。 done

啟動成功後,我們可以使用 docker container ls -a 檢視容器列表,我們也可以使用 ps 命令來檢視 docker-compose 構建的容器:

docker-compose ps Name Command State Ports ————————————————————————————————————————————————————————zookeeper_zoo1_1 /docker-entrypoint。sh zkSe 。。。 Up 0。0。0。0:2181->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcpzookeeper_zoo2_1 /docker-entrypoint。sh zkSe 。。。 Up 0。0。0。0:2182->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcpzookeeper_zoo3_1 /docker-entrypoint。sh zkSe 。。。 Up 0。0。0。0:2183->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp

構建完成後,我們就可以使用 客戶端來連線 Zookeeper 了。

連線 Zookeeper 服務端

首先我們使用 exec 命令進入容器:

docker exec -it zookeeper_zoo1_1 /bin/bash

再使用 zkCli。sh 來連線 Zookeeper 服務端:

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

這樣我們透過一個檔案就構建了一個數量為 3 的 Zookeeper 叢集,方便構建而且易於管理。

6。 總結

在本節內容中,我們學習了使用 Docker 來構建 Zookeeper 服務,還使用了 Docker Compose 構建了 Zookeeper 叢集。以下是本節內容總結:

Docker 安裝。

使用 Docker 安裝 Zookeeper 。

使用 Docker Compose 構建 Zookeeper 叢集