作者:521壮壮妈_386 | 来源:互联网 | 2023-09-24 12:03
万纳链(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-scl、devtoolset-7-gcc*、make、cmake、git、wget、go,并且配置Go环境。
4、需要新增dockerfile来实现镜像的编译。
Dockerfile
位置:~/Venachiain/Dockerfile
1、Venachain镜像是能够直接容器化启动的镜像。
2、镜像基于 harbor.i.wxblockchain.com/library/centos75:v1.1 。
3、首先使用 编译环境镜像 进行Venachain的编译,然后再编译出Venachain的镜像。
4、由于docker容器映射到宿主机目录时,如果宿主机目录下存在文件,那么会覆盖掉容器内的目录中的内容。因此在编译镜像时,将bin、conf、scripts等文件复制至一个临时目录中,待容器启动,目录映射完成后再将临时目录下的文件移至部署路径。
5、需要添加dockerfile、docker-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的版本
generate-yml.sh
位置:~/Venahcain/release/linux/scripts/docker/generate-yml.sh
- 根据deploy_conf自动生成docker-compose.yml文件
五、一键部署
新增文件
deploy.sh
位置:~/Venachain/release/linux/scripts/docker/deploy.sh
- 首先将必要文件传输至目标机,再对目标机进行容器化部署
transfer.sh
位置:~/Venachain/release/linux/scripts/docker/transfer.sh
- 向目标机传送node的deploy_conf和docker-compose.yml
- 如果目标机没有镜像,向其传送镜像包并在目标机上读取镜像
start-docker-node.sh
位置:~/Venachain/release/linux/scripts/docker/start-docker-node.sh
- 部署步骤:启动容器,deploysys,addnode,updatesys。
- 目标机向部署机传输:genesis、firstnode.info、keyfile、公钥。
- 部署步骤:启动容器,addnode,updatenode。
- 部署机向目标机传输:genesis和firstnode.info
部署机向firstnode传输:pubkey、deploy_conf