前言
如果你對於zookeeper不懂的話,不建議來看此文章的內容。你可以自行網上查閱zookeeper資料學習。
在學習一門技術的時候,首先要了解這技術是干什么用的、基本的概念以及簡單的上手使用。
搭建zookeeper單節點環境
獲取zookeeper鏡像
只要是想使用鏡像,第一步都是先獲取鏡像
docker pull zookeeper
查看下載的zookeeper鏡像
docker images
如下圖所示:
運行zookeeper鏡像
docker run -d --name zookeeper -p 2181:2181 zookeeper
這里的2181是zookeeper的默認端口號。當然,你在啟動鏡像的時候,可以不用指定port的映射,解決的辦法就是可以通過docker提供的link機制來實現容器的訪問。
查看運行中的zookeeper容器
docker ps
如下圖所示:
連接zookeeper服務
在Linux命令行中執行以下命令:
docker exec -it ea zkCli.sh
其中的“ea”是zookeeper容器ID的前兩位字符。
回車如下圖(一般需要按兩下回車鍵,才能看到最下面的“CONNECTED”的字樣):
出現上面的信息,說明zookeeper正常啟動
另一種連接zookeeper服務的方式
或許有的朋友可能對上面的命令“docker exec -it ea zkCli.sh”中的 zkCli.sh 不太明白。這個 zkCli.sh 是哪里來的?
你也可以通過另外一種命令來進入zookeeper容器:
docker exec -it ea /bin/bash
唯一不同的地方,就是最后面的命令內容。
執行該命令之后,進入的是zookeeper容器的文件系統的根目錄。
我們可以查看一下容器的文件系統根目錄下面有什么東西,在容器內執行命令:
cd /
回車之后,再執行命令:
ls
如下圖所示:
可以明顯的看到,有一個zookeeper的文件夾,也就是我們在容器中安裝的zookeeper所在的目錄。
然后,除了黃色區域的內容,再仔細看一下其他的目錄,是不是發現了什么?不錯,和我們平時看到的Linux系統根目錄下面的內容是一樣的。其實Docker容器就是一個簡潔型的Linux文件系統。
找到我們的zookeeper目錄之后,執行下面命令:
cd ./zookeeper-3.4.12/bin/
可以看到目錄下面有一些腳本:
如果我們要連接zookeeper服務的話,需要使用 zkCli.sh 腳本來連接。
使用zkCli.sh連接zookeeper
在上面所在的目錄下,執行以下命令:
./zkCli.sh -server 127.0.0.1:2181
出現下圖所示信息,說明成功連接了zookeeper服務:
查看當前zookeeper的模式
和上面一樣,需要在 /zookeeper-3.4.12/bin/ 目錄下,執行以下命令查看zookeeper服務的模式:
./zkServer.sh status
如下圖所示:
可以看到,當前zookeeper服務是單節點的,並非集群環境。
搭建zookeeper集群環境
實際企業生產環境,往往都是搭建的集群環境,避免單實例情況下的異常導致服務不可用。
這是我以前寫的在原生的centos系統上搭建的zookeeper集群環境的文檔,有興趣可以看看
這里我們就搭建3個zookeeper節點吧。3個節點已經算是最小單元的集群環境了。
為了編寫簡單,zookeeper 名稱我們使用“ZK”來表示。
因為一個一個地啟動 ZK 太麻煩了, 所以為了方便起見, 我們直接使用 docker-compose 來啟動 ZK 集群。
Docker-Compose —— Docker編排工具
簡介
Docker Compose是一個用來定義和運行復雜應用的Docker工具。一個使用Docker容器的應用,通常由多個容器組成。使用Docker Compose不再需要使用shell腳本來啟動容器。 Compose 通過一個配置文件來管理多個Docker容器,在配置文件中,所有的容器通過services來定義,然后使用docker-compose腳本來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器,非常適合組合使用多個容器進行開發的場景。
Docker-Compose是一個部署多個容器的簡單但是非常必要的工具.
兩種最新的安裝Docker-Compose的方式
-
從github上下載docker-compose二進制文件安裝
-
pip安裝
官方文檔 https://docs.docker.com/compose/install/
這里我就使用 pip 的方式安裝。
安裝Docker-Compose之前,請先安裝 python-pip
安裝 python-pip
- 首先檢查Linux有沒有安裝python-pip包,終端執行 pip -V
pip -V
如果出現 -bash: pip: command not found 的提示,說明沒有安裝python-pip,需要安裝一下python-pip包。
以下是我的阿里雲服務器上的執行情況:
可以看到已經自帶了pip包。
- 對安裝好的pip進行升級
因為系統自帶的軟件包,很有可能不是最新版本,所以我們最好先更新到最新版本。
pip install --upgrade pip
運行結果如下:
已經升級到最新的 10.0.1 版本了。
安裝Docker-Compose
在Linux命令行中執行命令:
pip install docker-compose
查看安裝的docker-compose版本
docker-compose -version
如下圖所示表示安裝成功:
創建 docker-compose 文件
這里我就在 /opt 目錄下新建了一個 zookeeper 目錄(你也可以自定義存儲目錄),如下圖:
在當前目錄(/opt/zookeeper/)創建一個名為 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端口上(每個zookeeper容器的默認端口都是2181,這句話意思也就是說,將宿主機的2181、2182、2183這3個端口號,分別映射到3個zookeeper容器的2181端口)。
ZOO_MY_ID 和 ZOO_SERVERS 是搭建 ZK 集群需要設置的兩個環境變量,其中 ZOO_MY_ID 表示 ZK 服務的 id,它是1-255 之間的整數,必須在集群中唯一;ZOO_SERVERS 是ZK 集群的主機列表。
運行 docker-compose
接着我們在 docker-compose.yml 所在的目錄(/opt/zookeeper/ )下運行:
COMPOSE_PROJECT_NAME=zk_cluster docker-compose up
即可啟動 ZK 集群了。
注意:這種方式非后台運行,當執行 Ctrl + C 組合鍵的時候,所有的ZK容器都會停止運行。
以后台方式運行docker-compose
COMPOSE_PROJECT_NAME=zk_cluster docker-compose up -d
很簡單,只要在最后面加上“-d”即可。
運行效果如下圖:
可以看到,是以后台方式運行的ZK容器集群。
查看啟動的ZK集群
執行上述命令成功后,接着新開啟一個終端,然后在新終端界面中,首先進入 /opt/zookeeper/ 目錄,在該目錄下運行以下命令可以查看啟動的 ZK 容器:
COMPOSE_PROJECT_NAME=zk_cluster docker-compose ps
如下圖:
你也可以通過 docker ps 命令查看啟動的ZK容器列表,如下圖:
很明顯的看到,啟動了3個ZK容器,每個容器對應着宿主機的不同的端口號。
測試連接ZK集群
查看ZK集群的信息,有多種方法。這里我們就使用最普通的進入容器內部來查看ZK節點的信息以及它的模式。
通過上面的圖,可以看到3個ZK容器的ID信息。
這里我們先進入zoo1這個容器,查看ZK的信息,執行以下命令:
docker exec -it 49 zkServer.sh status
其中“49”指的是zoo1容器的ID。
運行結果如下圖:
可以看到,Mode的值為“follower”,指的是從節點,並非主節點。
以此類推,查看 zoo2 這個ZK容器的信息:
當前ZK容器節點為主節點
查看 zoo3 這個ZK容器的信息:
當前ZK容器節點為從節點
經過以上的查看,可以清晰的看到,其中一個ZK容器是一個主節點leader,另外2個都是從節點follower。
到此,在Docker中搭建zookeeper的集群環境已經講解完了。
當然,其中的知識點還是很多的,文章只是一個入門級,對於更深層次的技術探索,各位可以自行網上學習的。