使用Docker在本地部署Tendermint网络

安装ClevelDB

若要使用ClevelDB可先安装ClevelDB

sudo apt-get update
sudo apt install build-essential

sudo apt-get install libsnappy-dev

wget https://github.com/google/leveldb/archive/v1.20.tar.gz && \
  tar -zxvf v1.20.tar.gz && \
  cd leveldb-1.20/ && \
  make && \
  sudo cp -r out-static/lib* out-shared/lib* /usr/local/lib/ && \
  cd include/ && \
  sudo cp -r leveldb /usr/local/include/ && \
  sudo ldconfig && \
  rm -f v1.20.tar.gz

修改配置文件,数据库后端设置为cleveldb

db_backend = “cleveldb”

build tendermint 支持cleveldb

CGO_LDFLAGS="-lsnappy" make install TENDERMINT_BUILD_OPTIONS=cleveldb

Makefile入门:

Makefile与Cmake的联系与区别:

Cmake是一种跨平台编译工具,比make方便
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库
在这里插入图片描述

Makefile文件中的命令有一定规范,一旦该文件编写好以后在Linux命令行中执行一条make命令即可自动编译整个工程。make命令和Makefile文件:
make命令会读取makefile文件的内容,make命令会根据makefile文件来确定目标文件的创建顺序以及正确的规则调用顺序。

Makefile文件中的命令:

make命令:make -C转到目录
$(CURDIR) 是一个 GNU Make 内置的 Makefile 变量,用于获取当前工作目录的绝对路径。
定义$(MAKE)宏变量的意思是,也许我们的make需要一些参数,所以定义成一个变量比较有利于维护。两个例子意思都是先进入"subdir"目录,然后执行make命令

  • 变量:$ 符号表示取变量的值
  • 变量赋值:
    “=”赋值
    “:=”表示直接赋值,赋予当前位置的值。
    "?="表示如果该变量没有被赋值,赋值予等号后面的值。
    "+="和平时写代码的理解是一样的,表示将符号后面的值添加到前面的变量上
  • 回显问题,Makefile中的命令都会被打印出来。如果不想打印命令部分 可以使用@去除回显
@echo "clean done!"

  • 伪目标.PHONY
    伪目标只是一个标签,伪目标的作用:(1)避免命令与目录下的文件名重复;(2)make的并行和递归执行过程中;(3)生成多个应用程序
  • 嵌套执行Makefile

Docker知识:

  1. docker build
    //从Dokcerfile文件建立镜像,寻找Dockerfile文件,Dockerfile是一个文本格式的配置文件,可以使用Dockerfile来快速创建自定义的镜像,包含一条条的指令。Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、构建镜像的指令信息、容器启动时执行指令信息
    Dockerfile常用指令:
    from:基础镜像 run:RUN command为shell命令 RUN
    [“executable”, “param1”, “param2”] executable为可执行程序,param1,param2分别为参数
    CMD:CMD [“executable”,“param1”,“param2”] (首选形式) CMD command param1
    param2 (shell命令形式) 在Dockerfile中,只能有一条CMD指令,如果出现多个CMD命令,则只有最后一个命令会生效。
    LABEL:使用LABEL指令来添加镜像的作者信息等
    EXPOSE:EXPOSE [/…]
    EXPOSE指令通知Docker容器在运行时监听指定的网络端口,可以指定端口的协议(TCP/UDP),如果不指定默认为TCP协议
    COPY:docker默认会在上下文目录的根目录去找Dockerfile文件
    ENTRYPOINT:ENTRYPOINT [“executable”, “param1”, “param2”]
    ENTRYPOINT command param1 param2
    Docker运行时,可以使用–entrypoint来覆盖ENTRYPOINT指令
    VOLUME:[ /tendermint ]
    Docker运行会在宿主机生成数据卷并挂载VOLUME指令指定的位置。
    WORKDIR:/tendermint
    WORKDIR指令为任意的RUN、CMD、ENTRYPOINT、ADD、COPY指令设置工作目录。如果指定的目录不存在,将会被默认创建。
    2.使用Dockerfile构建项目镜像
    上下文目录:发出docker build指令所在目录就是上下文目录。默认情况下,docker会在当前目录中寻找Dockerfile文件,我们也可以使用-f参数来指定Dockerfile的位置。无论Dockerfile处于什么位置,上下文目录以及子目录的所有内容都会被发送到Docker daemon中。

:Z 命令是用于设置 SELinux 安全上下文的选项,它在 Docker 中用于提高容器中数据的安全性。

docker run --rm/如果容器存在的话自动移除容器
docker run -v /
docker build --tag tendermint/localnode localnode //创建docker image标签
docker-compose up //创建和开启容器
docker-compose down//停止和移除容器和网络

tendermint test命令参数:
--config /etc/tendermint/config-template.toml: 使用指定路径下的 config-template.toml 配置文件来配置 Tendermint 节点
--o .: 将生成的测试网络配置文件输出到当前目录(.)中,以便将其用于启动测试网络
--starting-ip-address 192.167.10.2: 指定测试网络的起始 IP 地址,用于为测试网络中的节点分配 IP 地址

docker-compose.yaml配置文件详解

docker-compose.yaml 是 docker compose 工具使用的配置文件,用于定义多个 Docker 容器的服务、网络和卷等信息。如下是tendermint多节点网络的docker-compose配置文件,有5个容器服务,每个服务运行一个 “tendermint/localnode” Docker镜像的实例:所有服务都使用相同的卷./build,挂载到容器内的/tendermint目录。它们还使用相同的网络localnet,该网络被定义为一个网桥网络,IP地址范围为192.167.10.0/16。其中IPAM是指IP地址管理,它定义了一个子网,其中每个容器都可以使用自己的IP地址。driver: default表示使用默认的IP地址分配驱动程序,subnet: 192.167.10.0/16表示子网的地址范围。

version: '3'

services:
  node0:
    container_name: node0
    image: "tendermint/localnode"
    ports:
      - "26656-26657:26656-26657"
    environment:
      - ID=0
      - LOG=${LOG:-tendermint.log}
    volumes:
      - ./build:/tendermint:Z
    networks:
      localnet:
        ipv4_address: 192.167.10.2

  node1:
    container_name: node1
    image: "tendermint/localnode"
    ports:
      - "26659-26660:26656-26657"
    environment:
      - ID=1
      - LOG=${LOG:-tendermint.log}
    volumes:
      - ./build:/tendermint:Z
    networks:
      localnet:
        ipv4_address: 192.167.10.3

  node2:
    container_name: node2
    image: "tendermint/localnode"
    environment:
      - ID=2
      - LOG=${LOG:-tendermint.log}
    ports:
      - "26661-26662:26656-26657"
    volumes:
      - ./build:/tendermint:Z
    networks:
      localnet:
        ipv4_address: 192.167.10.4

  node3:
    container_name: node3
    image: "tendermint/localnode"
    environment:
      - ID=3
      - LOG=${LOG:-tendermint.log}
    ports:
      - "26663-26664:26656-26657"
    volumes:
      - ./build:/tendermint:Z
    networks:
      localnet:
        ipv4_address: 192.167.10.5

  node4:
    container_name: node4
    image: "tendermint/localnode"
    environment:
      - ID=4
      - LOG=${LOG:-tendermint.log}
    ports:
      - "26665-26666:26656-26657"
    volumes:
      - ./build:/tendermint:Z
    networks:
      localnet:
        ipv4_address: 192.167.10.6

networks:
  localnet:
    driver: bridge
    ipam:
      driver: default
      config:
      -
        subnet: 192.167.10.0/16


Docker运行Tendermint网络具体流程

1.若拉取的是tendermint源码,使用如下命令在build目录下生成tendermint二进制文件

make build-linux

note:若拉取的是tendermint二进制文件,将tendermint二进制文件放到/tendermint/build/目录。
2.使用如下命令建立tendermint/localnode image(此项可选择,启动网络时会自动建立docker image)

make build-docker-localnode

3.启动Tendermint网络

make localnet-start
# Run a 4-node testnet locally
localnet-start: localnet-stop build-docker-localnode
	@if ! [ -f build/node0/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode testnet --config /etc/tendermint/config-template.toml --o . --starting-ip-address 192.167.10.2; fi
	docker-compose up
.PHONY: localnet-start

会在build目录下生成node0-3四个节点文件,如本地部署Tendermint网络。
note: 若要部署任意节点的Tendermint网络,(1)首先需要修改Makefile文件中的localnet-start命令:testnet --v 5 --v 3,–v参数的意思是设置验证节点的数量;–n设置非验证节点的数量如下所示;

localnet-start: localnet-stop build-docker-localnode
  @if ! [ -f build/node0/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode testnet --v 5 --n 3 --o . --populate-persistent-peers --starting-ip-address 192.167.10.2 ; fi
  docker-compose up

以上命令是设置5个验证节点,3个非验证节点。如果内存较小,节点数量设置较小即可,本人在16g内存上部署了8节点导致资源不够用,有些节点未运行;然后部署了5个节点成功运行。
(2)然后要根据部署的节点数量修改docker-compose.yaml文件的配置。

具体执行流程如下:
(1)首先要启动docker,如果以前开启过网络,则会执行localnet-stop关闭网络,localnet-stop命令会调用docker-compose down命令关闭已经存在的容器
(2)然后执行build-docker-localnode,通过Docker建立网络,build-docker-localnode命令先进入networks/local目录下,然后执行make命令,makefile文件中的命令“docker build --tag tendermint/localnode localnode”
(3)通过[ -f build/node0/config/genesis.json ]判断build/node0/config/genesis.json是否存在,若不存在,执行“docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode”,用 Docker 运行一个名为 tendermint/localnode 的镜像,并将当前目录下的 build 目录挂载到容器中的 /tendermint 目录下,并设置挂载路径为可共享(shared)模式,最后启动一个新的容器来执行 tendermint/localnode 镜像中的命令。
(4)执行“testnet --config /etc/tendermint/config-template.toml --o . --starting-ip-address 192.167.10.2”命令启动tendermint网络,若没有指定节点数量,默认生成4个验证节点。(5)执行“docker-compose up”创建和开启容器。首先,Docker Compose 会检查当前目录下是否存在 docker-compose.yaml 配置文件,根据配置文件创建所需的容器。
4.验证测试
执行如下命令,会出现“We need more addresses. Sending pexRequest to random peer…”的错误

make localnet-start

是因为needAddressThreshold 阈值在/tendermint/p2p/pex/params.go文件中被设置为1000,可以将其设置为较小数值,然后重新编译tendermint二进制文件,按以上步骤重新部署tendermitn多节点网络就不会出错了。

func (a *addrBook) NeedMoreAddrs() bool {
	return a.Size() < needAddressThreshold //阈值1000
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值