万纳链(Venachain)是万向区块链基于PlatONE底层开源平台,针对企业级客户和开发者在数字化转型过程中的实际需求,推出的自主可控的高性能联盟链,已通过中国电子标准化研究院的功能与性能双项测试。依托万向区块链丰富的技术与生态资源,万纳链具备出色的关联技术耦合能力,通过与隐私计算、物联网、知识图谱等技术融合,引航分布式认知技术的创新和实践。同时,结合团队出色的机制设计能力,万纳链旨在为实体经济的数字化转型打造可信数字底座,为企业级客户和开发者提供隐私安全、性能优越、一键部署、功能丰富的综合解决方案。
我们将通过一系列技术科普文章,帮助大家了解万纳链的技术特点和操作方法。今天我们一起来了解万纳链如何进行容器化一键部署。
本文作者:万向区块链通用架构技术部 吴经文
容器化一键部署需要借助以下这些功能的实现来完成:
一、设计思路
提供 镜像编译 的功能,包括编译环境镜像和Venachain镜像。 容器化部署 能够分步实现。 将分步部署的流程通过脚本串起来,实现 一键部署 ,且和多机部署一样要支持日志管理。
二、一键部署流程设计
三、镜像编译
更新文件
Makefile
- 添加 .PHONY: docker
Makefile
.PHONY: geth android ios geth-cross swarm evm docker all test clean
- 添加版本参数 VENACHAIN_VERSION
Makefile
VENACHAIN_PATH=$(shell pwd)
VERSION_MAJOR=$(shell cat ${VENACHAIN_PATH}/params/version.go | grep "VersionMajor*=" | sed 's/.∗.∗= [0−9]∗[0−9]∗.∗.∗/\2/g')
VERSION_MINOR=$(shell cat ${VENACHAIN_PATH}/params/version.go | grep "VersionMinor*=" | sed 's/.∗.∗= [0−9]∗[0−9]∗.∗.∗/\2/g')
VERSION_PATCH=$(shell cat ${VENACHAIN_PATH}/params/version.go | grep "VersionPatch*=" | sed 's/.∗.∗= [0−9]∗[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}
- 添加 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.{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
向目标机传送node的deploy_conf和docker-compose.yml 如果目标机没有镜像,向其传送镜像包并在目标机上读取镜像 start-docker-node.sh
位置:~/Venachain/release/linux/scripts/docker/start-docker-node.sh
首先检测是否为firstnode firstnode: 部署步骤:启动容器,deploysys,addnode,updatesys。 目标机向部署机传输:genesis、firstnode.info、keyfile、公钥。 非firstnode: 部署步骤:启动容器,addnode,updatenode。 目标机向部署机传输:公钥 部署机向目标机传输:genesis和firstnode.info 部署机向firstnode传输:pubkey、deploy_conf