[toc]
Hyperledger Fabric 1.0部署与使用
1.环境构建与测试
本文中用到的宿主环境是CentOS,版本为CentOS.x86_64(7.4);
通过Dcoker容器来运行Fabric的节点,版本为v1.0;
因此,启动Fabric网络的节点需要先安装 Docker、Docker-compose和Go语言环境;
然后在网上摘取相关的Docker镜像,再能过配置compose文件来启动各个节点;
1.1: CentOS yum源的配置
公司内网,可以让服务器以桥接方式接入网络;
a、备份原有的yum源配置
# 注:若系统环境是初始化安装的,最好先安装以下软件包 # yum -y install wget screen vim # cd /etc/yum.repos.d/ && mkdir bak # mv *repo bak
b、设置阿里yum源
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
c、清理缓存并生成新的缓存
# yum clean all # yum makecache
d、更新yum库
# yum update
此操作的目的是为更新所有的内置库到最新版;
因为docker最新版的安装需要所对应的依赖都是最新版;
为了避免安装时软件包依赖的坑,故如此操作;
1.2: Docker安装
a、GetDocker—> CentOS —> Get CE 社区版 —> Get Docker CE on CentOS —> Install Docker CE on CentOS.
b、若服务器上存在旧的docker版本,需要先执行以下操作:
# yum -y remove docker docker-common docker-selinux docker-engine
c、随后开始安装Docker CE
目前Docker官方最新版为docker-ce-17.12.1.ce-1.el7.centos.x86_64.rpm
;
可以在docker rpm包中下载并安装
# mkdir -p /tmp/rpm/docker # cd /tmp/rpm/docker # wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.12.1.ce-1.el7.centos.x86_64.rpm # yum -y install *docker*rpm
d、检查docker是否安装成功
# docker --version Docker version 17.12.1-ce, build 7390fc6
e、启动docker服务
# systemctl start docker
f、设置docker为开机自启
# systemctl enable docker
1.3: Docker-Compose安装
Docker-Compose的离线安装相对于curl安装比较麻烦;
需要在官网提供的github中下载最新的docker-compose;
将其clone /tmp/rpm/docker/下;
a、执行以下命令后完成安装
# curl -L https://github.com/docker/compose/releases/download/1.20.0-rc1/docker-compose-`uname -s`-`uname -m` -o /tmp/rpm/docker/docker-compose
b、移植docker-compose到PATH变量环境中
# chmod +x docker-compose # cp -a docker-compose /usr/bin/
c、移植后查看安装的版本信息
# docker-compose --version docker-compose version 1.20.0-rc1, build 86428af
到此docker环境已准备完毕
1.4 Go环境准备
a、参照go官网,下载最新的Go语言包;
b、直接通过链接下载 Go官网连接
# mkdir -p /tmp/rpm/go && cd /tmp/rpm/go # wget https://test-inner.transfereasy.com/go1.8.3.linux-amd64.tar.gz # 注: 目前这个包已经置于内网环境中 # 注: 可以通过ssjinyao网站下载 # wget https://rjyy.ssjinyao.com/go1.8.3.linux-amd64.tar.gz
c、解压二进制程序到/usr/local目录下;
# tar -xvf go1.8.3.linux-amd64.tar.gz -C /usr/local/ # ll /usr/local/go/ 总用量 136 drwxr-xr-x. 2 root root 205 5月 25 2017 api -rw-r--r--. 1 root root 33243 5月 25 2017 AUTHORS drwxr-xr-x. 2 root root 42 5月 25 2017 bin drwxr-xr-x. 4 root root 37 5月 25 2017 blog -rw-r--r--. 1 root root 1366 5月 25 2017 CONTRIBUTING.md -rw-r--r--. 1 root root 45710 5月 25 2017 CONTRIBUTORS drwxr-xr-x. 8 root root 4096 5月 25 2017 doc -rw-r--r--. 1 root root 5686 5月 25 2017 favicon.ico drwxr-xr-x. 3 root root 18 5月 25 2017 lib -rw-r--r--. 1 root root 1479 5月 25 2017 LICENSE drwxr-xr-x. 14 root root 190 5月 25 2017 misc -rw-r--r--. 1 root root 1303 5月 25 2017 PATENTS drwxr-xr-x. 7 root root 87 5月 25 2017 pkg -rw-r--r--. 1 root root 1399 5月 25 2017 README.md -rw-r--r--. 1 root root 26 5月 25 2017 robots.txt drwxr-xr-x. 46 root root 4096 5月 25 2017 src drwxr-xr-x. 17 root root 8192 5月 25 2017 test -rw-r--r--. 1 root root 7 5月 25 2017 VERSION
d、配置go环境变量
# echo "export PATH=$PATH:/usr/local/go/bin" > /etc/profile.d/go.sh # echo "export GOPATH=/opt/gopath" >> /etc/profile.d/go.sh # chmod +x /etc/profile.d/go.sh # source /etc/profile.d/go.sh # echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/srv/jdk1.8.0_66/bin:/root/bin:/usr/local/go/bin # go version go version go1.8.3 linux/amd64
至此go环境变量已经配置完毕
2.Fabric源码及镜像文件处理
2.1下载Fabric源码
下载Fabric源是因为要用到源码中提到的例子和工具;
工具编译需要用到go语言环境;
因此需要把源码目录放到$GOPATH环境变量下;
通过1.4中的安装配置 $GOPATH设置为/opt/gopath;
这里,我们可以使用git clone源码
也可以使用go get 命令
# go get github.com/hyperledger/fabric 或者是 # mkdir -p /opt/gopath/src/github.com/hyperledger/ # cd /opt/gopath/src/github.com/hyperledger/ && git clone https://github.com/hyperledger/fabric.git # cd /opt/gopath/src/github.com/hyperledger/fabric && git checkout -b v1.0.0
# 最后的工程结构如下 # cd /opt/gopath/src/github.com/hyperledger # tree -L 1 fabric/ fabric/ ├── bccsp ├── bddtests ├── CHANGELOG.md ├── ci.properties ├── common ├── CONTRIBUTING.md ├── core ├── devenv ├── docker-env.mk ├── docs ├── events ├── examples ├── gossip ├── gotools ├── images ├── LICENSE ├── Makefile ├── mkdocs.yml ├── msp ├── orderer ├── peer ├── proposals ├── protos ├── README.md ├── release ├── release_notes ├── sampleconfig ├── scripts ├── settings.gradle ├── test ├── unit-test └── vendor 23 directories, 9 files
2.2下载Fabric相关镜像文件
该操作有多种方式进行,如果是测试Fabric集群方案;
直接进入fabric/examples/e2e_cli目录下,运行./dowload-dockerimages.sh;
即可下载该工程必要的镜像文件;
一般情况下,为了保证镜像与下载到hyperledger中的源码demo版本号相对应;
该处方法属于较为妥当的方案;
检索 HyperLedger,以hyperledger/fabric-peer为例,进入下载页面;
官方给出的下载方式如下:
# docker pull hyperledger/fabric-peer
但由于docker镜像下载在没有给出tag的情况下会默认使用latest;
所以该方案最终可能会下载失败,因此需在fabric-peer下载页选中其tags标签;
查看当前fabric-peer最新版本号,根据我们所使用的操作系统情况,选择x86_64-1.0.0版本;
故最终执行的docker下载命令如下:
# docker pull hyperledger/fabric-peer:x86_64-1.0.0 x86_64-1.0.0: Pulling from hyperledger/fabric-peer aafe6b5e13de: Pull complete 0a2b43a72660: Pull complete 18bdd1e546d2: Pull complete 8198342c3e05: Pull complete f56970a44fd4: Pull complete e32b597e7839: Pull complete a6e362fc71c4: Pull complete f107ea6d90f4: Pull complete 72c8e84de237: Pull complete 776cc74c9f73: Pull complete Digest: sha256:b7c1c2a6b356996c3dbe2b9554055cd2b63194cd7a492a83de2dbabf7f7e3c65 Status: Downloaded newer image for hyperledger/fabric-peer:x86_64-1.0.0
根据上述方案,可以将这些必要的镜像由docker服务全部下载至本地;
并最终使用docker-compose来启动对应的镜像服务;
为了方便docker-compose的配置,将甩的镜像tag都改为latest,执行如下格式;
# docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)
# cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/ # bash download-dockerimages.sh 注:也可以用后面所提到shell建立 # docker images REPOSITORY TAG IMAGE ID CREATED SIZE hyperledger/fabric-peer x86_64-1.0.0 6830dcd7b9b5 8 months ago 182MB hyperledger/fabric-tools latest ae6b0f53cb70 9 months ago 1.32GB hyperledger/fabric-tools x86_64-1.0.0-beta ae6b0f53cb70 9 months ago 1.32GB hyperledger/fabric-couchdb latest 31bbbec3d853 9 months ago 1.48GB hyperledger/fabric-couchdb x86_64-1.0.0-beta 31bbbec3d853 9 months ago 1.48GB hyperledger/fabric-kafka latest c4ac1c9a4797 9 months ago 1.3GB hyperledger/fabric-kafka x86_64-1.0.0-beta c4ac1c9a4797 9 months ago 1.3GB hyperledger/fabric-zookeeper latest 2c4ebacb6f00 9 months ago 1.31GB hyperledger/fabric-zookeeper x86_64-1.0.0-beta 2c4ebacb6f00 9 months ago 1.31GB hyperledger/fabric-orderer latest 11ff350dd297 9 months ago 179MB hyperledger/fabric-orderer x86_64-1.0.0-beta 11ff350dd297 9 months ago 179MB hyperledger/fabric-peer latest e01c2b645f11 9 months ago 182MB hyperledger/fabric-peer x86_64-1.0.0-beta e01c2b645f11 9 months ago 182MB hyperledger/fabric-javaenv latest 61c188dca542 9 months ago 1.42GB hyperledger/fabric-javaenv x86_64-1.0.0-beta 61c188dca542 9 months ago 1.42GB hyperledger/fabric-ccenv latest 7034cca1918d 9 months ago 1.29GB hyperledger/fabric-ccenv x86_64-1.0.0-beta 7034cca1918d 9 months ago 1.29GB hyperledger/fabric-ca latest e549e8c53c2e 9 months ago 238MB hyperledger/fabric-ca x86_64-1.0.0-beta e549e8c53c2e 9 months ago 238MB
2.3补充镜像备份和迁移
上述HperLedger/Fabric 镜像数量较多且容量需求大,一套基本的服务镜像可达10G左右;
如果在多台服务器上部署,会耽误很多时间。因此,对于上述已下载的镜像;
我们需要使用docker save命令来备份,并通过scp命令来把这些文件拷贝至其它服务器;
# cat dk_image_bak.sh #!/bin/bash ## 开始自动备份镜像 im=`docker images | grep latest | wc -l` for i in `seq $im` ;do id=` docker images | grep latest | grep fabric | awk '{print $3}' | sed -n $i\p` fn=` docker images | grep latest | grep fabric | awk -F "/" '{print $2}' | awk '{print $1}' | sed -n $i\p ` dir=` docker images | grep latest | grep fabric | awk -F "/" '{print $1}'` mkdir -p /tmp/images/docker/$dir/ docker save $id > /tmp/images/docker/$dir/$fn.gz done ## 至此id已经保存镜像完毕 ## 开始远程同步与迁移 ssh root@10.180.55.126 "mkdir -p /tmp/images/docker/$dir/" scp /tmp/images/docker/$fn/*gz root@10.180.55.126:/tmp/images/docker/$dir/
当远端服务器接收到所有的镜像之后,可以执行如下命令来加载这些镜像文件
# docker load < /tmp/images/docker/hyperledger/fabric-ccenv.gz
以上2.3镜像的备份和迁移是可选方案;
3.运行测试e2e
3.1 运行fabric-sample的问题
一般情况下,我们会参照官网来完成第一个网络测试;
在该在线文档中会让我们去下载一个fabric-sample;
下载地址在github上;
我们需要将其下载至本地是一个fabric-sample-release的文件,将其更名为fabric-samples
随后将其移到opt/gopath/src目录下;
按照官网提示执行的命令是无法运行起first-network这个项目;
该demo需要先下载Platform-specific Binaries(特定的二进制文件);
按照官文档中的描述,需要执行如下命令;
官方提供bash脚本如下
# cd /root/ && vim dk_bin.sh 加入以下执行程序 #!/bin/bash # # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # # current version of fabric released export VERSION=${1:-1.0.4} # current version of fabric-ca released export CA_VERSION=${2:-$VERSION} # current version of thirdparty images (couchdb, kafka and zookeeper) released export THIRDPARTY_IMAGE_VERSION=0.4.6 export ARCH=$(echo "$(uname -s|tr '[:upper:]' '[:lower:]'|sed 's/mingw64_nt.*/windows/')-$(uname -m | sed 's/x86_64/amd64/g')" | awk '{print tolower($0)}') #Set MARCH variable i.e ppc64le,s390x,x86_64,i386 MARCH=`uname -m` dockerFabricPull() { local FABRIC_TAG=$1 for IMAGES in peer orderer ccenv javaenv tools; do echo "==> FABRIC IMAGE: $IMAGES" echo docker pull hyperledger/fabric-$IMAGES:$FABRIC_TAG docker tag hyperledger/fabric-$IMAGES:$FABRIC_TAG hyperledger/fabric-$IMAGES done } dockerThirdPartyImagesPull() { local THIRDPARTY_TAG=$1 for IMAGES in couchdb kafka zookeeper; do echo "==> THIRDPARTY DOCKER IMAGE: $IMAGES" echo docker pull hyperledger/fabric-$IMAGES:$THIRDPARTY_TAG docker tag hyperledger/fabric-$IMAGES:$THIRDPARTY_TAG hyperledger/fabric-$IMAGES done } dockerCaPull() { local CA_TAG=$1 echo "==> FABRIC CA IMAGE" echo docker pull hyperledger/fabric-ca:$CA_TAG docker tag hyperledger/fabric-ca:$CA_TAG hyperledger/fabric-ca } : ${CA_TAG:="$MARCH-$CA_VERSION"} : ${FABRIC_TAG:="$MARCH-$VERSION"} : ${THIRDPARTY_TAG:="$MARCH-$THIRDPARTY_IMAGE_VERSION"} echo "===> Downloading platform specific fabric binaries" curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/${ARCH}-${VERSION}/hyperledger-fabric-${ARCH}-${VERSION}.tar.gz | tar xz echo "===> Downloading platform specific fabric-ca-client binary" curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric-ca/hyperledger-fabric-ca/${ARCH}-${VERSION}/hyperledger-fabric-ca-${ARCH}-${VERSION}.tar.gz | tar xz if [ $? != 0 ]; then echo echo "------> $VERSION fabric-ca-client binary is not available to download (Avaialble from 1.1.0-rc1) <----" echo fi echo "===> Pulling fabric Images" dockerFabricPull ${FABRIC_TAG} echo "===> Pulling fabric ca Image" dockerCaPull ${CA_TAG} echo "===> Pulling thirdparty docker images" dockerThirdPartyImagesPull ${THIRDPARTY_TAG} echo echo "===> List out hyperledger docker images" docker images | grep hyperledger* # chmod + x /root/dk_bin.sh # bash /root/dk_bin.sh
运行时效果如下; 注:若是内网环境,则可能执行时间较长;
# bash /root/dk_bin.sh ===> Downloading platform specific fabric binaries % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 18 22.6M 18 4312k 0 0 6860 0 0:57:45 0:10:43 0:47:02 5364
3.2运行e2e_cli项目
进入到/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/目录;
a、目录结构如下图;
# tree ../e2e_cli/ ../e2e_cli/ ├── base │ ├── docker-compose-base.yaml │ └── peer-base.yaml ├── channel-artifacts ├── configtx.yaml ├── crypto-config.yaml ├── docker-compose-cli.yaml ├── docker-compose-couch.yaml ├── docker-compose-e2e-template.yaml ├── docker-compose-e2e.yaml ├── download-dockerimages.sh ├── end-to-end.rst ├── examples │ └── chaincode │ └── go │ └── chaincode_example02 │ └── chaincode_example02.go ├── generateArtifacts.sh ├── network_setup.sh └── scripts └── script.sh 7 directories, 14 files
network_setup.sh是一个测试脚本,该脚本启动5个docker容器;
其中4个容器运行peer节点和1个容器运行orderer节点,它组成一个fabric集群;
另外还有一个cli容器用于创建channle、加入channel、安装和执行chaincode等操作;
测试用的chaincode定义了两个变量,在实例化的时候会给这两个变量赋予了初始值;
并能过invoke操作可以使用两个变量的值发生变化;
b、通过以下命令进行测试;
# cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/ # bash network_setup.sh up
c、当出现以下界面时,说明已经测试通了
2018-03-13 09:38:21.185 UTC [main] main -> INFO 008 Exiting..... ===================== Query on PEER3 on channel 'mychannel' is successful ===================== ===================== All GOOD, End-2-End execution completed ===================== _____ _ _ ____ _____ ____ _____ | ____| | \ | | | _ \ | ____| |___ \ | ____| | _| | \| | | | | | _____ | _| __) | | _| | |___ | |\ | | |_| | |_____| | |___ / __/ | |___ |_____| |_| \_| |____/ |_____| |_____| |_____|
d、如果上一步有报错,若没有部署其它应用,可以考虑将内核升级;
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm # yum --disablerepo="*" --enablerepo="elrepo-kernel" list available # yum --enablerepo=elrepo-kernel install kernel-ml # vim /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=0 GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet" GRUB_DISABLE_RECOVERY="true" # grub2-mkconfig -o /boot/grub2/grub.cfg
4.创建Fabric多节点集群
4.1配置说明
首先可以根据官方Fabric自带的e2e_cli例子中的集群方案来生成集群;
与案例不同的是我们需要把容器分配到不同的服务器上;
各容器之间通过网络来进行通信,网络构建完成后进行相关的channel和chanincode操作;
目前用有五台服务器, 所有的服务器均是按照上述e2e_cli环境与测试步骤配置;
计划其中的四台服务器运行peer节点,另外一台服务器运行orderer节点;
为其它四个节点提供order服务;
名称 | ip | 节点标识 | 节点Hostname | Organization |
---|---|---|---|---|
Hyperledger | 10.180.55.123 | orderer | orderer.example.com | Orderer |
Fabric1 | 10.180.55.124 | sp0 | peer0.org1.example.com | Org1 |
Fabric2 | 10.180.55.125 | sp1 | peer1.org1.example.com | Org1 |
Fabric3 | 10.180.55.126 | sp2 | peer0.org2.example.com | Org2 |
Fabric4 | 10.180.55.128 | sp3 | peer0.org3.example.com | Org2 |
环境如下
4.2 生成公私钥、证书、创巨区块
公/私钥和证书是用于Server与Server之间的安全通信;
另外要创建channel并让其它节点加入channle就需要创世区块;
这些必要文件都可以通过一条命令生,并且官方已经给出脚本;
脚本在以下目录中;
# cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/ # ls generateArtifacts.sh
使generateArtifacts.sh生成证书和config.tx,具体执行命令如下;
# bash generateArtifacts.sh mychannel
这里创建了3台服务器,在任意一台服务器的该目录下执行此项命令即可;
将会生成两个目录,分别为channel-artifacs、crypto-config
channel-artifacts/ ├── channel.tx ├── genesis.block ├── Org1MSPanchors.tx └── Org2MSPanchors.tx 0 directories, 4 files
在上述目录里的文件用于orderer创建channle,它们根据configex.yaml的配置生成;
crypto-config ├── ordererOrganizations └── peerOrganizations 2 directories, 0 files
在上述目录里有orderer和peer的证书、私钥和用于通信的加密的tls证书文件;
它通过configex.yaml配置文件生成;
4.3 配置多服务器
根据4.2的方案,以及之前所述的gopath目录等配置方案;
我们假定所有的服务器都按照该文档的配置来操作;
所有服务器都有Fabric源码,且目录为
如4.2所述,该命令只需要在某一台服务器上运行一次即可,其它服务器无需再次运行;
在运行该命令的服务器/opt/gopath/src/github.com/hyperledger/fabric/example/e2e_cli;
该目录下会生成channel-artifacts和crypto-config目录;
需要把它们拷贝至其它服务器相同的e2e_cli目录下,如果在其它服务器中已经在该目录,则需要先把它删除;
当所有服务器都有同一个channel-artifacts和crypto-config目录后;
开始配置compose文件;
开始向其它两个服务器同步以上两个目录; # cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/ # tar -cvf ctfile.tar.gz channel-artifacts crypto-config # scp ctfile.tar.gz root@10.180.55.124:/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli # scp ctfile.tar.gz root@10.180.55.125:/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli # ssh root@10.180.55.124 "cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli && tar -xvf ctfile.tar.gz" # ssh root@10.180.55.125 "cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli && tar -xvf ctfile.tar.gz"
4.4 设置peer0.arg1.example.com节点的docker-compose文件
e2e_cli中提供了多个yaml文件,我们可以基于docker-compose-cli.yaml文件创建;
修改docker-compose-peer.yaml,去掉orderer的配置;
只保留一个peer和cli,因为需要多级部署,节点与节点之间又是通过主机名通讯;
所以需要修改容器中的host文件,也就是xtra_hosts设置;
修改后的peer配置如下;
同样的,cli也需要能够和各个节点通讯,所以cli下面也需要添加extra_hosts设置;
去掉无效的依赖,并且去掉command这一行,因为每个peer都会有个对应的客户端;
也是就是cli; 所以只需要去手动执行一次命令,而不是自动执行;
# cd base/ # cp docker-compose-base.yaml{,.bak} # vim base/docker-compose-base.yaml # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # version: '2' services: peer0.org1.example.com: container_name: peer0.org1.example.com extends: file: base/docker-compose-base.yaml service: peer0.org1.example.com extra_hosts: - "orderer.example.com:10.180.55.123" cli: container_name: cli image: hyperledger/fabric-tools tty: true environment: - GOPATH=/opt/gopath - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_ID=cli - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_TLS_ENABLED=true - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer volumes: - /var/run/:/host/var/run/ - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/ - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts depends_on: - peer0.org1.example.com extra_hosts: - "orderer.example.com:10.180.55.123" - "peer0.org1.example.com:10.180.55.124" - "peer1.org1.example.com:10.180.55.125" - "peer0.org2.example.com:10.180.55.126" - "peer1.org2.example.com:10.180.55.128"
在3.2示例单机模式下,4个peer支映射主机不同的端口;
但是在多机部署的时候不需要映射不同端口的;
所以需要修改base/docker-compose-base.yaml文件,将所有peer的端口映射都改为相同的;
# cd base/ # cp docker-compose-base.yaml{,.bak} # vim base/docker-compose-base.yaml ports: - 7051:7051 - 7052:7052 - 7053:7053
4.5、 设置peer1.org1.example.com节点的docker-compose文件
与peer0.org1.example.com节点compose文件配置一样;
不过压岁要将启动的容器改为peer1.org1.example.com;
并且添加peer0.org1.example.com的IP映射;
对应的cli中改成对peer1.org1.example.com的依赖;
修改如下
# cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/ # cp docker-compose-cli.yaml docker-compose-peer.yaml # vim docker-compose-peer.yaml # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # version: '2' services: peer1.org1.example.com: container_name: peer1.org1.example.com extends: file: base/docker-compose-base.yaml service: peer1.org1.example.com extra_hosts: - "orderer.example.com:10.180.55.123" - "peer0.org1.example.com:10.180.55.124" cli: container_name: cli image: hyperledger/fabric-tools tty: true environment: - GOPATH=/opt/gopath - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_ID=cli - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_TLS_ENABLED=true - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer volumes: - /var/run/:/host/var/run/ - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/ - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts depends_on: - peer1.org1.example.com extra_hosts: - "orderer.example.com:10.180.55.123" - "peer0.org1.example.com:10.180.55.124" - "peer1.org1.example.com:10.180.55.125" - "peer0.org2.example.com:10.180.55.126" - "peer1.org2.example.com:10.180.55.128"
# cd base/ # cp docker-compose-base.yaml{,.bak} # vim base/docker-compose-base.yaml ports: - 7051:7051 - 7052:7052 - 7053:7053
org2的两个结点配置文件
# cat docker-compose-peer.yaml # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # version: '2' services: peer0.org2.example.com: container_name: peer0.org2.example.com extends: file: base/docker-compose-base.yaml service: peer0.org2.example.com extra_hosts: - "orderer.example.com:10.180.55.123" - "peer0.org1.example.com:10.180.55.124" cli: container_name: cli image: hyperledger/fabric-tools tty: true environment: - GOPATH=/opt/gopath - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_ID=cli - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_TLS_ENABLED=true - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer volumes: - /var/run/:/host/var/run/ - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/ - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts depends_on: - peer0.org2.example.com extra_hosts: - "orderer.example.com:10.180.55.123" - "peer0.org1.example.com:10.180.55.124" - "peer1.org1.example.com:10.180.55.125" - "peer0.org2.example.com:10.180.55.126" - "peer1.org2.example.com:10.180.55.128"
# cat docker-compose-peer.yaml # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # version: '2' services: peer1.org2.example.com: container_name: peer1.org2.example.com extends: file: base/docker-compose-base.yaml service: peer1.org2.example.com extra_hosts: - "orderer.example.com:10.180.55.123" - "peer0.org1.example.com:10.180.55.124" cli: container_name: cli image: hyperledger/fabric-tools tty: true environment: - GOPATH=/opt/gopath - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_ID=cli - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_TLS_ENABLED=true - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer volumes: - /var/run/:/host/var/run/ - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/ - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts depends_on: - peer1.org2.example.com extra_hosts: - "orderer.example.com:10.180.55.123" - "peer0.org1.example.com:10.180.55.124" - "peer1.org1.example.com:10.180.55.125" - "peer0.org2.example.com:10.180.55.126" - "peer1.org2.example.com:10.180.55.128"
4.6 设置order节点的docker-compose文件
与创建peer的配置文件类似,需要复制一个yaml文件出来修改;
# cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli # cp docker-compose-cli.yaml docker-compose-orderer.yaml
orderer服务器上我们只需要保留order设置;
其他peer和cli设置都可以删除。order可以不设置extra_hosts;
orderer.example.com: extends: file: base/docker-compose-base.yaml service: orderer.example.com container_name: orderer.example.com
#启动报错,单纯的报命令调用用法错误 docker rm -f $(docker ps -aq)
若部署环境在内网,则需要修改5台服务器的/etc/hosts文件;
确保服务器之间可以基于主机名互相通信;
# vim /etc/hosts 10.180.55.123 orderer.example.com 10.180.55.124 peer0.org1.example.com 10.180.55.125 peer1.org1.example.com 10.180.55.126 peer0.org2.example.com 10.180.55.128 peer1.org2.example.com
5.启动Fabric多节点集群
5.1启动orderere节点服务
操作完成后,此时节点的compose配置文件及证书难目录都已经准备完成;
可以开始尝试启动多机Fabric集群;
首先要启orderer节点,切换至orderer.example.com服务器;
即前文指定的10.180.55.123的服务器,执行如下命令进入启docker进程;
# docker-compose -f docker-compose-orderer.yaml up -d
运行完毕后我们可以使用docker ps看到运行了一个名字为orderer.example.com的节点;
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f188590553b7 hyperledger/fabric-orderer "orderer" 25 seconds ago Up 22 seconds 0.0.0.0:7050->7050/tcp orderer.example.com
5.2启动peer节点服务
切换到peer0.org1.example.com服务器,即前文指定的10.180.55.124服务器;
启动本服务器的peer节点和cli;
# docker-compose -f docker-compose-peer.yaml up -d
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2f49281a48c9 hyperledger/fabric-tools "/bin/bash" 38 minutes ago Up 38 minutes cli 8ef009a57457 hyperledger/fabric-peer "peer node start" 38 minutes ago Up 38 minutes 0.0.0.0:7051-7053->7051-7053/tcp peer0.org1.example.com
注: 其它三个peer结点与以上结点的启动/验证方式相同
遇到的坑:在CentOS中要把iptables关闭;selinux为开机关闭
确保5个结点间域名和端口都能telnet 通;
例telnet peer1.org2.example.com 7051;
现在整个Fabric4+1服务器网络已经成型;
5.3创建channle和运行chaincode
切换到peer0.org1.example.com服务器上;
使用该服务器的cli来运行创建Channel和运行ChainCode的操作;
# docker exec -it cli bash
进入容器后
root@078471f17d9a:/opt/gopath/src/github.com/hyperledger/fabric/peer# ./scripts/script.sh mychannel
该脚本会一步步的完成创建通道,将其他节点加入通道,更新锚节点;
创建ChainCode,初始化帐户,查询,转帐,再次查询等链上操作的自动化;
2018-03-19 03:00:03.146 UTC [main] main -> INFO 007 Exiting..... ===================== Query on PEER3 on channel 'mychannel' is successful ===================== ===================== All GOOD, End-2-End execution completed ===================== _____ _ _ ____ _____ ____ _____ | ____| | \ | | | _ \ | ____| |___ \ | ____| | _| | \| | | | | | _____ | _| __) | | _| | |___ | |\ | | |_| | |_____| | |___ / __/ | |___ |_____| |_| \_| |____/ |_____| |_____| |_____|
出现以上结果出明4+1的Fabric多级部署已经成功;
在peer0.org1.example.com的cli容器内;
之前的2个容器,已经因ChainCode创建了3个容器;
E2E 运行后查询与转帐测试
# 查询 # docker exec -it cli bash root@078471f17d9a:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
# 转帐20到b # peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}'