热门标签 | 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


推荐阅读
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • Harmony 与 Game Space 达成合作,在 Shard1 上扩展 Web3 游戏
    旧金山20 ... [详细]
  • 32位ubuntu编译android studio,32位Ubuntu编译Android 4.0.4问题
    问题一:在32位Ubuntu12.04上编译Android4.0.4源码时,出现了关于emulator的错误,关键是其Makefile里的 ... [详细]
  • Neutrino开放日|Polkadot 中国开发者分享会活动回顾(可下载嘉宾分享 PPT)
    3月3日下午,Neutrino开放日第2期线下活动在上海顺利结束。此次活动特邀了国内专注于Polkadot的资深区块链开发团队ChainX到场进行分享流交流。嘉宾分享 ... [详细]
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社区 版权所有