热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【技术科普】万纳链容器化一键部署

万纳链(Venachain)是万向区块链基于PlatONE底层开源平台,针对企业级客户和开发者在数字化转型过程中的实际需求,

万纳链(Venachain)是万向区块链基于PlatONE底层开源平台,针对企业级客户和开发者在数字化转型过程中的实际需求,推出的自主可控的高性能联盟链,已通过中国电子标准化研究院的功能与性能双项测试。依托万向区块链丰富的技术与生态资源,万纳链具备出色的关联技术耦合能力,通过与隐私计算、物联网、知识图谱等技术融合,引航分布式认知技术的创新和实践。同时,结合团队出色的机制设计能力,万纳链旨在为实体经济的数字化转型打造可信数字底座,为企业级客户和开发者提供隐私安全、性能优越、一键部署、功能丰富的综合解决方案。

我们将通过一系列技术科普文章,帮助大家了解万纳链的技术特点和操作方法。今天我们一起来了解万纳链如何进行容器化一键部署。

本文作者:万向区块链通用架构技术部 吴经文


容器化一键部署需要借助以下这些功能的实现来完成:

一、设计思路


  • 提供 镜像编译 的功能,包括编译环境镜像和Venachain镜像。

  • 容器化部署 能够分步实现。

  • 将分步部署的流程通过脚本串起来,实现 一键部署 ,且和多机部署一样要支持日志管理。

二、一键部署流程设计

三、镜像编译

更新文件

Makefile

1. 添加 .PHONY: docker


Makefile

.PHONY: geth android ios geth-cross swarm evm docker all test clean

2. 添加版本参数 VENACHAIN_VERSION


Makefile

VENACHAIN_PATH=$(shell pwd)

VERSION_MAJOR=$(shell cat ${VENACHAIN_PATH}/params/version.go | grep "VersionMajor\( \)*=" | sed 's/\(.*\)= \([0-9]*\)\(.*\)/\2/g')

VERSION_MINOR=$(shell cat ${VENACHAIN_PATH}/params/version.go | grep "VersionMinor\( \)*=" | sed 's/\(.*\)= \([0-9]*\)\(.*\)/\2/g')

VERSION_PATCH=$(shell cat ${VENACHAIN_PATH}/params/version.go | grep "VersionPatch\( \)*=" | sed 's/\(.*\)= \([0-9]*\)\(.*\)/\2/g')

VERSION_META=$(shell cat ${VENACHAIN_PATH}/params/version.go | grep "VersionMeta\( \)*=" | sed 's/\(.*\)= "\(.*\)"\(.*\)/\2/g')

VENACHAIN_VERSION = ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_META}

3. 添加 make docker:


Makefile

docker:

docker build -t harbor.i.wxblockchain.com/venachain/venachain:v$(VENACHAIN_VERSION) .

新增文件

Dockerfile

位置:~/Venachiain/docker/build-compile-env/Dockerfile

1、编译环境镜像是能够编译Venachain的环境镜像。

2、镜像基于 harbor.i.wxblockchain.com/library/centos75:v1.0

3、镜像需安装centos-release-scldevtoolset-7-gcc*makecmakegitwgetgo,并且配置Go环境。

4、需要新增dockerfile来实现镜像的编译。

Dockerfile

位置:~/Venachiain/Dockerfile

1、Venachain镜像是能够直接容器化启动的镜像。

2、镜像基于 harbor.i.wxblockchain.com/library/centos75:v1.1

3、首先使用 编译环境镜像 进行Venachain的编译,然后再编译出Venachain的镜像。

4、由于docker容器映射到宿主机目录时,如果宿主机目录下存在文件,那么会覆盖掉容器内的目录中的内容。因此在编译镜像时,将binconfscripts等文件复制至一个临时目录中,待容器启动,目录映射完成后再将临时目录下的文件移至部署路径。

5、需要添加dockerfiledocker-entrypoint.sh

docker-entrypoint.sh

位置:~/Venachiain/docker/build-venachain/docker-entrypoint.sh

1、容器启动后会执行本脚本

2、docker启动后只会执行初始化和启动节点

3、初始化前首先先把临时目录下的文件复制到chain目录下

4、如果没有firstnode.info说明还没有部署第一个节点,节点需要生成genesis文件。

5、用 .nodeid 作为节点已完成启动节点前的所有命令的标识,如果节点有该标识,那么只执行启动命令。

build-image.sh

位置:~/Venachain/release/linux/scripts/docker/build-image.sh

1、提供两个功能,分别是编译生成 Venachain编译环境镜像 Venachain镜像

2、Venachain编译环境镜像的版本由控制台交互输入;Venachain镜像的版本通过 params/version.go 获取。

3、如果已存在同一tag的镜像,则停止执行。

四、容器化部署

更新文件

deploy.conf.template

1、添加docker部署相关配置参数


Shell

## DOCKER

docker=    #是否使用docker部署

start-node.sh

2、检测是否是docker部署


Shell

checkConf "docker"

if [[ $? -eq 1 ]]; then

    DOCKER="$(cat ${DEPLOY_CONF} | grep "docker=" | sed -e 's/\(.*\)=\(.*\)/\2/g')"

fi

3、添加docker部署下的启动命令


Shell

if [[ "${DOCKER}" == "true" ]]; then

...

        "${BIN_PATH}/venachain" ${flag_node} \

            ${flag_encryption} \

            ${flag_discov} \

            ${flag_bootnodes} \

            ${flag_rpc} --rpccorsdomain "*" \

            ${flag_ws} --wsorigins "*" \

            ${flag_logs} \

            ${flag_ipc} ${flag_gcmode} ${flag_dbtype} \

            ${flag_tx} ${flag_lightmode} ${flag_pprof} \

            --moduleLogParams '{"venachain_log": ["/"], "__dir__": ["'${LOG_DIR}'"], "__size__": ["'${LOG_SIZE}'"]}' \

            ${EXTRA_OPTIONS} \

            2>"${LOG_DIR}/venachain_error.log"

else

...

    nohup "${BIN_PATH}/venachain" ${flag_node} \

            ${flag_encryption} \

            ${flag_discov} \

            ${flag_bootnodes} \

            ${flag_rpc} --rpccorsdomain "*" \

            ${flag_ws} --wsorigins "*" \

            ${flag_logs} \

            ${flag_ipc} ${flag_gcmode} ${flag_dbtype} \

            ${flag_tx} ${flag_lightmode} ${flag_pprof} \

            --moduleLogParams '{"venachain_log": ["/"], "__dir__": ["'${LOG_DIR}'"], "__size__": ["'${LOG_SIZE}'"]}' \

            ${EXTRA_OPTIONS} \

            1>/dev/null 2>"${LOG_DIR}/venachain_error.log" &

    timer=0

    res_start=""

    while [ ${timer} -lt 10 ]; do

        res_start="$(lsof -i:${P2P_PORT})"

        if [[ "${res_start}" != "" ]]; then

            break

        fi

        sleep 1

        let timer++

    done

    if [[ "${res_start}" == "" ]]; then

        printLog "error" "RUN NODE NODE-${NODE_ID} FAILED"

        exit 1

    fi

fi

remote/clear.sh


  • 如果时docker部署,那么停止容器

  • 如果是docker部署,那么要删除容器

新增文件

docker-compose.yml.template

位置:~/Venachain/release/linux/conf/docker-compose.yml.template


YAML

version: "3.2"

services:

  __SERVICE_NAME__:

    container_name: __CONTAINER_NAME__

    image: harbor.i.wxblockchain.com/venachain/venachain:__VERSION__

    network_mode: "host"

    environment:

    - NODE_ID=__NODE_ID__

    - ENCRYPTION=__ENCRYPTION__

    - CONSENSUS=__CONSENSUS__

    volumes:

    - "__BIN_PATH__:/opt/chain/bin"

    - "__DATA_PATH__:/opt/chain/data"

    - "__SCRIPT_PATH__:/opt/chain/scripts"

    - "__CONF_PATH__:/opt/chain/conf"


  • SERVICE_NAME/CONTAINER_NAME:都以venachain.${project_name}.${node-id}命名

  • VERSION:venachain的版本

  • PATH:宿主机上挂载目录的路径

generate-yml.sh

位置:~/Venahcain/release/linux/scripts/docker/generate-yml.sh


  • 根据deploy_conf自动生成docker-compose.yml文件

  • 如果已经存在yml文件,则跳过执行

五、一键部署

新增文件

deploy.sh

位置:~/Venachain/release/linux/scripts/docker/deploy.sh


  • 根据deploy_conf容器化部署节点

  • 首先将必要文件传输至目标机,再对目标机进行容器化部署

transfer.sh

位置:~/Venachain/release/linux/scripts/docker/transfer.sh


  • 向目标机传送nodedeploy_confdocker-compose.yml

  • 如果目标机没有镜像,向其传送镜像包并在目标机上读取镜像

start-docker-node.sh

位置:~/Venachain/release/linux/scripts/docker/start-docker-node.sh


  • 首先检测是否为firstnode

  • firstnode:

  • 部署步骤:启动容器,deploysys,addnode,updatesys

  • 目标机向部署机传输:genesisfirstnode.infokeyfile、公钥。

  • firstnode:

  • 部署步骤:启动容器,addnode,updatenode

  • 目标机向部署机传输:公钥

  • 部署机向目标机传输:genesisfirstnode.info

部署机向firstnode传输:pubkeydeploy_conf


推荐阅读
author-avatar
521壮壮妈_386
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有