【干货干货】Hyperledger Fabric 之 单机及多级环境部署安装
1,VirtualBox虚拟机环境安装
由于公司没有安装Ubuntu系统,所以我这里使用VirtualBox虚拟机。
这里不提供VirtualBox虚拟机具体安装说明。
2,Ubuntu16.04.2 X64 Server 安装
版本ubuntu-16.04.4-server-amd64.iso下载url:
https://www.ubuntu.com/download/server/thank-you?country=CN&version=16.04.4&architecture=amd64
在安装完Ubuntu后,需要保证apt source是国内的,不然如果是国外的话会很慢很慢的。具体做法是
sudo vi /etc/apt/sources.list
打开这个apt源列表,如果其中看到是http://us.xxxxxx之类的,那么就是外国的,如果看到是http://cn.xxxxx之类的,那么就不用换的。我的是美国的源,所以需要做一下批量的替换。在命令模式下,输入:
:%s/us./cn./g
就可以把所有的us.改为cn.了。然后输入:wq即可保存退出。
sudo apt-get update
更新一下源。
然后安装ssh,这样接下来就可以用putty或者SecureCRT之类的客户端远程连接Ubuntu了。
sudo apt-get install ssh
3,GOLang 安装
3.1,golang版本下载:https://www.golangtc.com/download 选择go1.9.2.linux-amd64.tar.gz下载

将下载好的压缩包上传到服务器自定义目录:/ root/zjlubuntu
执行一下命令,解压压缩包
sudo tar -C /usr/local -xzf go1.9.2linux-amd64.tar.gz
【注意:不要使用apt方式安装go,apt的go版本太低了!】
3.2接下来编辑当前用户的环境变量:
vi ~/.profile
添加以下内容:
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$HOME/go/bin
3.3编辑保存并退出vi后,记得把这些环境载入:
source ~/.profile
3.4我们把go的目录GOPATH设置为当前用户的文件夹下,所以记得创建go文件夹
cd ~
mkdir go
4,Docker 安装
一种方案(我的机器没有连上安装成功,我这里使用了方案二):
我们可以使用阿里提供的镜像,安装也非常方便。通过以下命令来安装Docker
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
安装完成后需要修改当前用户(我使用的用户叫fabric)权限:
sudo usermod -aG docker fabric
注销并重新登录,然后添加阿里云的Docker Hub镜像:
不同的版本添加方法是不一样的,官方的文档如下:
https://cr.console.aliyun.com/#/accelerator
当然觉得阿里云镜像不好用,喜欢用DaoClound的也可以用DaoClound的镜像。
二种方案:
apt install docker.io
5,Docker-Compose的安装
一种方案(我的机器没有连上安装成功,我这里使用了方案二):
Docker-compose是支持通过模板脚本批量创建Docker容器的一个组件。在安装Docker-Compose之前,需要安装Python-pip,运行脚本:
sudo apt-get install python-pip
安装完成后,接下来从DaoClound安装Docker-compose,运行脚本:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.10.1/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
sudo mv ~/docker-compose /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
二种方案:
apt install docker-compose
6,Fabirc 源码下载
我们可以使用Git命令下载源码,也可以使用go get命令,偷懒一点,我们直接用go get命令获取最新的Fabric源码:
go get github.com/hyperledger/fabric
这个可能等的时间比较久,等完成后,我们可以在~/go/src/github.com/hyperledger/fabric中找到所有的最新的源代码。
由于Fabric一直在更新,所有我们并不需要最新最新的源码,需要切换到v1.0.0版本的源码即可:
cd ~/go/src/github.com/hyperledger/fabric
git checkout v1.0.0
7,Fabric Docker 镜像的下载
这个其实很简单,因为我们已经设置了Docker Hub镜像地址,所以下载也会很快。官方文件也提供了批量下载的脚本。我们直接运行:
cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0
这样就可以下载所有需要的Fabric Docker镜像了。由于我们设置了国内的镜像,所以下载应该是比较快的。
下载完毕后,我们运行以下命令检查下载的镜像列表:
docker images
得到的结果如下:

8,单机/多机部署
8.1 单机部署
我们仍然停留在e2e_cli文件夹,这里提供了启动、关闭Fabric网络的自动化脚本。我们要启动Fabric网络,并自动运行Example02 ChainCode的测试,执行一个命令:
./network_setup.sh up
这个做了以下操作:
1编译生成Fabric公私钥、证书的程序,程序在目录:fabric/release/linux-amd64/bin
2基于configtx.yaml生成创世区块和通道相关信息,并保存在channel-artifacts文件夹。
3基于crypto-config.yaml生成公私钥和证书信息,并保存在crypto-config文件夹中。
4基于docker-compose-cli.yaml启动1Orderer+4Peer+1CLI的Fabric容器。
5在CLI启动的时候,会运行scripts/script.sh文件,这个脚本文件包含了创建Channel,加入Channel,安装Example02,运行Example02等功能。
最后运行完毕,我们可以看到这样的界面:

如果您看到这个界面,这说明我们整个Fabric网络已经通了。
8.1.1手动测试一下Fabric网络
我们仍然是以现在安装好的Example02为例,在官方例子中,channel名字是mychannel,链码的名字是mycc。我们首先进入CLI,我们重新打开一个命令行窗口,输入:
docker exec -it cli bash
运行以下命令可以查询a账户的余额:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
可以看到余额是90:

然后,我们试一试把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"]}'
运行结果为:

现在转账完毕, 我们试一试再查询一下a账户的余额,没问题的话,应该是只剩下70了。我们看看实际情况:
执行peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

果然,一切正常。最后我们要关闭Fabric网络,首先需要运行exit命令退出cli容器。关闭Fabric的命令与启动类似,命令为:
cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli
./network_setup.sh down
现在我们整个Fabric的环境已经测试完毕。一切正常
8.2 多机部署
做完单机验证后,没有问题。那么我们就可以基于这个基础上进行进一步的多机部署。
在Fabric的源码中,提供了单机部署4Peer+1Orderer的示例,在Example/e2e_cli文件夹中。我们可以在其中一台机器上运行单机的Fabric实例,确认无误后,在该机器上,生成公私钥,修改该机器中的Docker-compose配置文件,然后把这些文件分发给另外4台机器。我们就以orderer.example.com这台机器为例
准备另外四台机器,名称和ip需要对应,并将单机测试成功的系统,复制四台机器。以下为机器的名称和ip。
|
orderer.example.com |
10.46.178.221 |
|
peer0.org1.example.com |
10.46.178.222 |
|
peer1.org1.example.com |
10.46.178.223 |
|
peer0.org2.example.com |
10.46.178.224 |
|
peer1.org2.example.com |
10.46.178.225 |
修改主机名称
例:sysctl kernel.hostname= orderer.example.com
8.2.1生成公私钥、证书、创世区块等
公私钥和证书是用于Server和Server之间的安全通信,另外要创建Channel并让其他节点加入Channel就需要创世区块,这些必备文件都可以一个命令生成,官方已经给出了脚本:
./generateArtifacts.sh mychannel
运行这个命令后,系统会创建channel-artifacts文件夹,里面包含了mychannel这个通道相关的文件,另外还有一个crypto-config文件夹,里面包含了各个节点的公私钥和证书的信息
8.2.2设置peer节点的docker-compose文件
e2e_cli中提供了多个yaml文件,我们可以基于docker-compose-cli.yaml文件创建:
cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
cp docker-compose-cli.yaml docker-compose-peer.yaml
然后修改docker-compose-peer.yaml,去掉orderer的配置,只保留一个peer和cli,因为我们要多级部署,节点与节点之前又是通过主机名通讯,所以需要修改容器中的host文件,也就是extra_hosts设置,修改后的peer配置如下:
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.46.178.221"
同样,cli也需要能够和各个节点通讯,所以cli下面也需要添加extra_hosts设置,去掉无效的依赖,并且去掉command这一行,因为我们是每个peer都会有个对应的客户端,也就是cli,所以我只需要去手动执行一次命令,而不是自动运行。修改后的cli配置如下:
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.46.178.221"
- "peer0.org1.example.com:10.46.178.222"
- "peer1.org1.example.com:10.46.178.223"
- "peer0.org2.example.com:10.46.178.224"
- "peer1.org2.example.com:10.46.178.225"
|
在单击模式下,4个peer会映射主机不同的端口,但是我们在多机部署的时候是不需要映射不同端口的,所以需要修改base/docker-compose-base.yaml文件,将所有peer的端口映射都改为相同的:
ports: - 7051:7051 - 7052:7052 - 7053:7053
|
8.2.3设置orderer节点的docker-compose文件
与创建peer的配置文件类似,我们也复制一个yaml文件出来进行修改:
cp docker-compose-cli.yaml docker-compose-orderer.yaml
orderer服务器上我们只需要保留order设置,其他peer和cli设置都可以删除。orderer可以不设置extra_hosts。
8.2.4分发配置文件
前面几步的操作,我们都是在orderer.example.com上完成的,接下来我们需要将这些文件分发到另外4台服务器上。Linux之间的文件传输,我们可以使用scp命令。
我门先分别登录peer0.org1.example.com、peer1.org1.example.com、peer0.org2.example.com、peer1.org2.example.com,将本地的e2e_cli文件夹删除:
rm e2e_cli –R
然后再登录到orderer.example.com服务器上,退回到examples文件夹,因为这样可以方便的把其下的e2e_cli文件夹整个传到其他四台peer服务器上。
scp -r e2e_cli root@10.46.178.222:/home/fabric/go/src/github.com/hyperledger/fabric/examples/
我们在前面配置的就是peer0.org1.example.com上的节点,所以复制过来后不需要做任何修改。
再次运行scp命令,复制到peer1.org1.example.com上,然后我们需要对docker-compose-peer.yaml做一个小小的修改,将启动的容器改为peer1.org1.example.com,并且添加peer0.org1.example.com的IP映射,对应的cli中也改成对peer1.org1.example.com的依赖。这是修改后的peer1.org1.example.com上的配置文件:
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.46.178.221" - "peer0.org1.example.com:10.46.178.222"
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=peer1.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/peer1.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/peer1.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/peer1.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.46.178.221" - "peer0.org1.example.com:10.46.178.222" - "peer1.org1.example.com:10.46.178.223" - "peer0.org2.example.com:10.46.178.224" - "peer1.org2.example.com:10.46.178.225"
|
上述红色标记的字体,都是需要注意修改的。以及修改后一地要注意文本格式。否则会有问题。
接下来继续使用scp命令将orderer上的文件夹传送给peer0.org2.example.com和peer1.org2.example.com,然后也是修改一下docker-compose-peer.yaml文件,使得其启动对应的peer节点。
8.3.启动Fabric
现在所有文件都已经准备完毕,我们可以启动我们的Fabric网络了。
8.3.1启动orderer
让我们首先来启动orderer节点,在orderer服务器上运行:
docker-compose -f docker-compose-orderer.yaml up -d

运行完毕后我们可以使用docker ps看到运行了一个名字为orderer.example.com的节点。
8.3.2启动peer
然后我们切换到peer0.org1.example.com服务器,启动本服务器的peer节点和cli,命令为:
docker-compose -f docker-compose-peer.yaml up -d

运行完毕后我们使用docker ps应该可以看到2个正在运行的容器。

接下来依次在另外3台服务器运行启动peer节点容器的命令:
docker-compose -f docker-compose-peer.yaml up -d
现在我们整个Fabric4+1服务器网络已经成型,接下来是创建channel和运行ChainCode。
8.3.3创建Channel测试ChainCode
我们切换到peer0.org1.example.com服务器上,使用该服务器上的cli来运行创建Channel和运行ChainCode的操作。首先进入cli容器:
docker exec -it cli bash
进入容器后我们可以看到命令提示变为:

说明我们已经以root的身份进入到cli容器内部。官方已经提供了完整的创建Channel和测试ChainCode的脚本,并且已经映射到cli容器内部,所以我们只需要在cli内运行如下命令:
./scripts/script.sh mychannel
那么该脚本就可以一步一步的完成创建通道,将其他节点加入通道,更新锚节点,创建ChainCode,初始化账户,查询,转账,再次查询等链上代码的各个操作都可以自动化实现。直到最后,系统提示:

说明我们的4+1的Fabric多级部署成功了。我们现在是在peer0.org1.example.com的cli容器内,我们也可以切换到peer0.org2.example.com服务器,运行docker ps命令,可以看到本来是2个容器的,现在已经变成了3个容器,因为ChainCode会创建一个容器:

验证:
1, 查询a账户的金额
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

2,查询b账户的金额
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'

3,转账试试
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","b","a","50"]}'

在查询一下a,b的账户金额看看

Ok,数据转账一切正常。导出fabri多级部署正常。
9,安装过程遇到的问题
9.1 启动order服务时候异常

这个问题是因为docker-compose -f docker-compose-orderer.yaml up –d中的“–d”输入不正确,应该为英文输入状态下的“-d”.需要仔细发现才能发现’-’是不一样的
9.2 Must be a mapping not an array

这个是因为编辑文件的格式不正确,可以将服务器文件拉去到本地,进行修改后在上传
10 备注
安装参考资料:http://www.cnblogs.com/studyzy/p/7237287.html

浙公网安备 33010602011771号