基於docker-compose部署tendermint多節點叢集
阿新 • • 發佈:2018-12-02
一.我們可以通過 docker-compose 來啟動多個 container
通過官方文件我們知道啟動 tendermint 叢集需要下面幾個步驟:
- 每個 node 都需要通過 tendermint init 來進行初始化;
- 需要有一個包含所有 validator 節點 public key 的 genesis.json 檔案, 然後用這個檔案覆蓋所有節點對應的檔案; 在我們的示例中所有的節點都是 validator 節點;
- 通過 tendermint show_node_id 獲取節點的 ID, 並通過引數 [email protected]:46656,
對應於上面環境準備需要做的工作, 我通過指令碼檔案 ./init_data.sh 做了自動化的處理:
#!/bin/bash # # Description: init tendmint node data # Author: Hongbo Liu node_cnt=4 tendermint_img="tendermint/tendermint:latest" is_osx () { [[ "$OSTYPE" =~ ^darwin ]] || return 1 } init() { SED=sed if [[ "$OSTYPE" =~ ^darwin ]]; then SED=gsed if ! which gsed &> /dev/zero ; then brew install gnu-sed fi if ! which jq &> /dev/zero; then brew install jq fi else if ! which jq &> /dev/zero; then sudo apt-get install jq -y fi fi if is_osx; then rm -rf *data else sudo rm -rf *data fi } init default_genesis="./node1_data/config/genesis.json" for (( i = 1; i <= $node_cnt; i++ )); do if ! is_osx; then mkdir -p node${i}_data chmod 777 node${i}_data fi docker run --rm -v `pwd`/node${i}_data:/tendermint $tendermint_img init if ! is_osx; then sudo chmod -R 777 node${i}_data fi node_id=$(docker run --rm -v `pwd`/node${i}_data:/tendermint $tendermint_img show_node_id) echo "Node$i ID: $node_id" $SED -i "s/[0-9a-f]\{40\}@tm_node$i/
[email protected]_node$i/g" ./docker-compose.yml if [[ $i != 1 ]]; then echo $(cat $default_genesis | jq ".validators |= .+ $(cat node${i}_data/config/genesis.json | jq '.validators')") > $default_genesis fi echo $(cat $default_genesis | jq ".validators[$i-1].name = \"tm_node$i\" ") > $default_genesis done for (( i = 2; i <= $node_cnt; i++ )); do cp -f $default_genesis ./node${i}_data/config/genesis.json done
其中打印出來的節點 ID 會在後面的 docker-compose.yml 檔案中用到。然後我們就可以通過 docker-compose.yml 啟動多個 container 了, 這裡我們啟動四個節點:
version: '2.0'
services:
tm_node1: &node
image: tendermint/tendermint:latest
container_name: tm_node1
hostname: tm_node1
tty: true
ports:
- '46667:46657'
volumes:
- ./node1_data:/tendermint
entrypoint: ["sh", "-c", "tendermint node [email protected]tm_node1:46656,[email protected]_node2:46656,[email protected]_node3:46656,[email protected]_node4:46656 --moniker=`hostname` --proxy_app=persistent_kvstore --consensus.create_empty_blocks=false"]
tm_node2:
<<: *node
container_name: tm_node2
hostname: tm_node2
ports:
- '46668:46657'
volumes:
- ./node2_data:/tendermint
tm_node3:
<<: *node
container_name: tm_node3
hostname: tm_node3
ports:
- '46669:46657'
volumes:
- ./node3_data:/tendermint
tm_node4:
<<: *node
container_name: tm_node4
hostname: tm_node4
ports:
- '46660:46657'
volumes:
- ./node4_data:/tendermint
接下來我們就可以通過下面的步驟來啟動有四個節點的 tendermint 叢集:
./init_data.sh
用上面指令碼的輸出的節點 ID 分別去替換 docker-compose.yml 檔案中的節點 ID
docker-compose up -d
用docker ps檢視容器內的資訊
成功啟動之後我們可以通過 curl -s localhost:46667/net_info 中的結果來判斷兩個節點有沒有相互識別。也可用CONTAINER ID檢視登陸日誌
docker logs a6c2b0220899