一.我们可以通过 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,ee4841fc73b0038fcd3c8c8346630757d6bc868f@192.168.5.57:26656,e0c4a27bba185d915564137250cad8111968d2ac@192.168.5.60:26656,14bdb70f2338244c4d3326bf0e44d04e0686f6b6@192.168.5.61:26656,8d11f90100babec7819ee7a22d9b6e9063af98cf@192.168.5.62:26656,4f21d70f5c020fdfdb30a329916436863313932e@192.168.5.63:26656,18de7bcf7295baddc684de13840970850f77b3e9@192.168.5.66:26656 --moniker=`hostname` --proxy_app=persistent_kvstore --consensus.create_empty_blocks=false"]
接下来我们就可以通过下面的步骤来启动有四个节点的 tendermint 集群:
./init_data.sh
用上面脚本的输出的节点 ID 分别去替换 docker-compose.yml 文件中的节点 ID
docker-compose up -d
用docker ps查看容器内的信息
成功启动之后我们可以通过 curl -s localhost:26667/net_info 中的结果来判断两个节点有没有相互识别。也可用CONTAINER ID查看登陆日志
```
docker logs a6c2b0220899
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181129165509141.png)