基于docker-compose部署tendermint多节点集群

一.我们可以通过 docker-compose 来启动多个 container
通过官方文档我们知道启动 tendermint 集群需要下面几个步骤:

  • 每个 node 都需要通过 tendermint init 来进行初始化;
  • 需要有一个包含所有 validator 节点 public key 的 genesis.json 文件, 然后用这个文件覆盖所有节点对应的文件; 在我们的示例中所有的节点都是 validator 节点;
  • 通过 tendermint show_node_id 获取节点的 ID, 并通过参数 --p2p.persistent_peers=ID1@node1:46656,ID2@node2:46656 来传入种子 peer;

对应于上面环境准备需要做的工作, 我通过脚本文件 ./init_data.sh 做了自动化的处理:

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/$node_id@tm_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 了, 这里我们启动四个节点,注意tendermint的端口设置:
1)26658
#TCP or UNIX socket address of the ABCI application, for the name of an ABCI application compiled in with the Tendermint binary
proxy_app = "tcp://127.0.0.1:26658”
2)26657
TCP or UNIX socket address for the RPC server to listen on laddr = "tcp://0.0.0.0:26657”
3)26656
Address to listen for incoming connections
#侦听外部节点传入连接的地址
laddr = “tcp://0.0.0.0:26656”

version: '2.0'

services:

  tm_node1:
    image: tendermint/tendermint:latest
    container_name: tm_node1
    hostname: tm_node1
    tty: true
    extends:
      file:  base/docker-compose-base.yaml
      service: tm_node1
    extra_hosts:
      - "tm_node4:192.168.5.60"
      - "tm_node3:192.168.5.57"
      - "tm_node2:192.168.5.58"
      - "tm_node5:192.168.5.61"
      - "tm_node6:192.168.5.62"
      - "tm_node7:192.168.5.63"
      - "tm_node8:192.168.5.66"
    ports:
      - 26667:26657
      - 26656:26656
     volumes:
      - ./node1_data:/tendermint
    entrypoint: ["sh", "-c", "tendermint node --p2p.persistent_peers=857d0e11e916436e7c74e2bdd863195c4e1c135b@192.168.5.58:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656 --moniker=`hostname` --proxy_app=persistent_kvstore --consensus.create_empty_blocks=false"]

接下来我们就可以通过下面的步骤来启动有四个节点的 tendermint 集群:

./init_data.sh

基于docker-compose部署tendermint多节点集群_第1张图片
用上面脚本的输出的节点 ID 分别去替换 docker-compose.yml 文件中的节点 ID

docker-compose up -d

在这里插入图片描述
用docker ps查看容器内的信息
基于docker-compose部署tendermint多节点集群_第2张图片
成功启动之后我们可以通过 curl -s localhost:26667/net_info 中的结果来判断两个节点有没有相互识别。也可用CONTAINER ID查看登陆日志

基于docker-compose部署tendermint多节点集群_第3张图片```
docker logs a6c2b0220899



![在这里插入图片描述](https://img-blog.csdnimg.cn/20181129165509141.png)

你可能感兴趣的:(基于docker-compose部署tendermint多节点集群)