fabric-1.1单机、多机部署

安装环境:

系统版本:CentOS 7.2
docker版本为:19.03.2 
docker-compose版本: 1.23.2

Go版本:1.10.1

 

二.单机部署

2.1.安装软件  

2.1.1.安装基础软件

安装依赖软件包

yum -y install ca-certificates curl wget git yum-utils  lvm2 gcc gcc-c++

2.1.2.添加仓库

使用docker官方的docker仓库,版本会比较高:

       yum-config-manager --add-repo    https://download.docker.com/linux/centos/docker-ce.repo

       列出安装的版本:

yum list docker-ce --showduplicates | sort -r    #要安装特定版本的Docker CE,请列出repo中的可用版本

2.1.3.配置加速器,修改成docker官方的地址

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://8ad7943c.m.daocloud.io

vi /etc/docker/daemon.json

{"registry-mirrors": ["https://registry.docker-cn.com"]}

2.1.4.安装docker

       yum -y install docker-ce

2.1.5.设置开机自启动、启动、停止

       systemctl enable docker

       systemctl start docker

       systemctl stop docker

       systemctl restart docker

2.1.6. 安装docker-compose,并赋予执行权限

        curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

       chmod +x /usr/local/bin/docker-compose

2.1.7.安装go语言

       mkdir -p /home/data/go/{src,pkg,bin}

       wget https://storage.googleapis.com/golang/go1.10.1.linux-amd64.tar.gz

       tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz

       设置环境变量:

       vim ~/.bashrc

       export GOROOT=/usr/local/go

       export GOPATH=/home/data/code/go    //go语言安装路径,按实际路径配置

       export GOBIN=$GOROOT/bin

       export PATH=$GOPATH/bin:$GOBIN:$PATH

使变量生效

source ~/.bashrc

检查go语言版本

# go version

go version go1.10.1 linux/amd64

2.1.8.安装nodejs,更新yum源:

        curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -

 

        yum -y install nodejs

        验证版本

        #Node –v

        v8.16.1

        #npm –v

        6.4.1

2.2.下载fabric源码

mkdir -p $GOPATH/src/github.com/hyperledger/

cd $GOPATH/src/github.com/hyperledger/

git clone https://github.com/hyperledger/fabric.git

cd fabric

git checkout release-1.1

2.2.1.下载镜像

进入目录/fabric/scripts,执行bootstrap.sh,下载docker镜像,下载完成后如:

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

解析bootstrap.sh执行过程:

脚本内容:分别调用了dockerFabricPull dockerCaPull dockerThirdPartyImagesPull 三个函数去拉取相应的docker镜像并打标签,最后还通过docker images | grep hyperledger*检查下载的镜像。

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

下载软件包:通过脚本自动下载,也可以使用浏览器单独下载,但需注意版本要与当前系统一致。

1).curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.1.0/hyperledger-fabric-linux-amd64-1.1.0.tar.gz | tar xz

2).curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric-ca/hyperledger-fabric-ca/linux-amd64-1.1.0/hyperledger-fabric-ca-linux-amd64-1.1.0.tar.gz | t        ar xz

fabric-1.1单机、多机部署

 

2.2.2.执行启动命令

镜像下载完后,将该目录下生成的bin目录拷贝到../examples目录下再进入到../examples/e2e_cli目录运行e2e_cli实例,执行命令./network_setup.sh up

1).Bin目录下可执行命令的作用:

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

2).cd /home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli

fabric-1.1单机、多机部署

 

执行过程中有报错:Error: Error endorsing chaincode: rpc error: code = Unknown desc = error starting container: API error (404): {"message":"network e2ecli_default not found"}

fabric-1.1单机、多机部署

 

问题原因:

e2e_cli目录是固定的,启动后会创建一个docker network以此为名字,这里是e2e_cli。如果修改该目录,要修改/home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli/base目录下的peer-base.yaml

vi /home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli/base/peer-base.yaml

fabric-1.1单机、多机部署

 

      修改完成后在启动:

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

 

 

 

中间图省略

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

完成以后启动的容器:

fabric-1.1单机、多机部署

 

 

Fabric执行过程分析,即执行network_setup.sh脚本:

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

从这个脚本文件可以看出,主要步骤为:

     1.执行generateArtifacts.sh

     2. Docker-composeup 目录下的docker-compose-cli.yaml文件

 

generateCerts:使用cryptogen工具生成秘钥和证书

replacePrivateKey:

     根据/home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/ca/*_sk修改docker-compose-e2e.yaml文件

generateChannelArtifacts:生成排序创世区块、通道配置文件、生成 组织锚节点配置

 

docker-compose-e2e.yaml文件,通过service定义了一条规则

fabric-1.1单机、多机部署

 

 

fabric-1.1单机、多机部署

 

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

 

 

如需停止进程,执行

    ./network_setup.sh down

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

2.2.3.测试

查询a账户的余额

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

fabric-1.1单机、多机部署

 

把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"]}'

fabric-1.1单机、多机部署

 

 

 

再次查询

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

fabric-1.1单机、多机部署

 

 

三.多机部署:

分布结构:

192.168.59.136

orderer.example.com + cli

192.168.59.137

peer0.org1.example.com  +cli

192.168.59.138

peer0.org2.example.com  +cli

192.168.59.139

peer1.org1.example.com  +cli

192.168.59.140

peer1.org2.example.com  +cli

 

3.1.主机间网络配置

基础网络准备设置主机之间的网络,推荐使用dns服务,hosts文件也可,各台机器内容一致。

fabric-1.1单机、多机部署

 

3.2.生成基础配置

推荐在一台主机上下载好fabric以后复制到其他机器上,以保证版本一致。所谓的拆分就是将不同的orderer和peer节点分别部署到其他的物理机器上面,实际上就是修改docker-compose-cli.yaml和其相关联的文件,首先生成组织,创世区块和认证信息:sh generateArtifacts.sh mychannel

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

3.3.复制组织和认证信息

执行完以后会生成crypto-config和channel-artifacts目录内容如下:将这俩个目录分别复制到其他机器

fabric-1.1单机、多机部署

 

3.4.修改配置

3.4.1 orderer节点配置

生成orderer节点配置文件,复制docker-compose-cli.yaml.bak 改名成docker-compose-orderer.yaml

Orderer部分:

fabric-1.1单机、多机部署

 

Cli部分:注释掉command部分,后面的初始化用手动方式执行

fabric-1.1单机、多机部署

 

base/docker-compose-base.yaml修改部分,并且所有的peer节点的端口都改成对应的端口,应为peer分布在不同的机器

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

 

 

base/peer-base.yaml文件修改

fabric-1.1单机、多机部署

 

3.4.2 peer0.org1节点配置

 peer0.org1.example.com节点,复制docker-compose-cli.yaml.bak 改名成docker-compose-cli.yaml

fabric-1.1单机、多机部署

 

Cli部分

fabric-1.1单机、多机部署

 

 

 

 

 

base/docker-compose-base.yaml

 

 

fabric-1.1单机、多机部署

 

 

 

 

 

base/peer-base.yaml

fabric-1.1单机、多机部署

 

3.4.3 peer.1org1配置

 peer1.org1.example.com节点的修改一样,修改的配置文件也一样。只不过需要注意修改名称和图中框里面的内容

fabric-1.1单机、多机部署

 

3.4.4 peer0.org2配置

 peer0.org2.example.com节点复制docker-compose-cli.yaml.bak 改名成docker-compose-cli.yaml修改docker-compose-cli.yaml

fabric-1.1单机、多机部署

 

Cli部分

fabric-1.1单机、多机部署

 

base/docker-compose-base.yaml

fabric-1.1单机、多机部署

 

 

 

 

 

 

 

 

 

 

 

 

base/peer-base.yaml

fabric-1.1单机、多机部署

 

3.4.5 peer1.org2配置

 peer1.org2.example.com配置修改,值得注意的地方就是

fabric-1.1单机、多机部署

 

3.5.启动orderer排序节点

docker-compose -f docker-compose-orderer.yaml up –d

fabric-1.1单机、多机部署

 

3.6.启动peer节点

启动其他机器上面的peer,未执行初始化之前只有框里面的容器启动,每个peer节点应该能看到peer和cli容器。

docker-compose -f docker-compose-cli.yaml up –d

fabric-1.1单机、多机部署

 

3.7.初始化

登录orderer节点的cli容器中,执行初始化执行script.sh脚本,其中定义了创建通道、节点加入通道、下载安装chaincode

初始化chaincode、更新锚点、查询等操作。

docker exec -it cli /bin/bash

./scripts/script.sh mychannel

执行过程与单节点过程一样

 

 

fabric-1.1单机、多机部署

fabric-1.1单机、多机部署

4.测试

列出通道peer channel list

fabric-1.1单机、多机部署

 

获取通道信息peer channel getinfo -c mychannel

fabric-1.1单机、多机部署

 

链码:peer chaincode list --installed

fabric-1.1单机、多机部署

 

查询原账户金额

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

fabric-1.1单机、多机部署

 

转账5元

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","5"]}'

fabric-1.1单机、多机部署

 

再次查询

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

fabric-1.1单机、多机部署