1. 程式人生 > >基於docker-compose部署tendermint多節點叢集

基於docker-compose部署tendermint多節點叢集

一.我們可以通過 docker-compose 來啟動多個 container
通過官方文件我們知道啟動 tendermint 叢集需要下面幾個步驟:

  • 每個 node 都需要通過 tendermint init 來進行初始化;
  • 需要有一個包含所有 validator 節點 public key 的 genesis.json 檔案, 然後用這個檔案覆蓋所有節點對應的檔案; 在我們的示例中所有的節點都是 validator 節點;
  • 通過 tendermint show_node_id 獲取節點的 ID, 並通過引數 [email protected]:46656,
    [email protected]
    :46656 來傳入種子 peer;

對應於上面環境準備需要做的工作, 我通過指令碼檔案 ./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

在這裡插入圖片描述