多机部署

1. 搭建环境

本文使用的是Fabric 1.4版本,搭建solo模式的4+1的架构:1Order,4Peer,机器之间的网络需要互通,保证五台机子上的Fabric网络可以正常运行。举例说明如下:

域名 ip
orderer.example.com 172.18.4.49
peer0.org1.example.com 172.18.4.33
peer1.org1.example.com 172.18.4.34
peer0.org2.example.com 172.18.4.35
peer1.org2.example.com 172.18.4.36

Fabric 的环境搭建过程不再详解,例子中的order节点和4个peer节点放在5台不同机子上,我们搭建的过程共使用三台:order1台 + 组织1的peer0和peer1一台,组织2的peer0和peer1一台。

2. 多机环境搭建

只在Orderer节点的机子上修改配置文件,最后通过scp命令将配置文件复制到其余四台机子,保证所有的节点所使用的配置文件都是相同的。

本文使用 first-network 这个文件夹内的配置文件来修改为自己所需要的配置文件。(位于fabric同级目录的fabric-samples官方样例下的first-network)

2.1 准备配置文件(只在Order节点操作)

#step1 进入到first-network文件夹的上一级目录
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/
#step2 拷贝first-network文件夹,并命名为first
cp -r first-network/ first
#step3 进入到first文件夹内
cd first
#step4 删除此次多机环境搭建使用不到的文件,文件夹内剩余的文件有
.
├── base
│   ├── docker-compose-base.yaml
│   └── peer-base.yaml
├── channel-artifacts
├── configtx.yaml
├── crypto-config.yaml
├── docker-compose-cli.yaml
├── docker-compose-couch.yaml

本文就对以上文件进行修改搭建自己的Fabric多机网络
由于官方的 first-network 中的配置文件中使用的就是4+1的架构,所以我们可以直接生成所需要的证书文件,创世区块,通道配置文件。

2.2 生成相关配置文件(只在Order节点操作)

#step1 生成证书文件
cryptogen generate --config=./crypto-config.yaml
#step2 生成创世区块  首先要确保channel-artifacts文件夹存在,如果不存在需要手动创建,不然会报错
configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
#step3 生成通道配置文件  其中通道名mychannel可以修改为自己的
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
#step4 生成锚节点配置文件
#========Org1=============
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
##========Org2=============
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

完成后在 channel-artifacts 中应该有以下几个文件:

2.3 修改节点配置文件(只提醒一次:所有文件内容的格式不能变,前面空格的数量必须和原文件一致)

2.3.1 base/docker-compose-base.yaml(Order主机)

删掉order.example.com下image项的冒号

下面内容暂不需要修改!!!(因为我们是多机环境,不存在端口冲突问题暂时用不到)

peer0.org1.example.com:container_name: peer0.org1.example.comextends:file: peer-base.yamlservice: peer-baseenvironment:- CORE_PEER_ID=peer0.org1.example.com- CORE_PEER_ADDRESS=peer0.org1.example.com:7051- CORE_PEER_LISTENADDRESS=0.0.0.0:7051- CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:8051  #这里更改为7051,因为我们是多机环境,不存在端口冲突问题- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051- CORE_PEER_LOCALMSPID=Org1MSPvolumes:- /var/run/:/host/var/run/- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls- peer0.org1.example.com:/var/hyperledger/productionports:- 7051:7051peer1.org1.example.com:container_name: peer1.org1.example.comextends:file: peer-base.yamlservice: peer-baseenvironment:- CORE_PEER_ID=peer1.org1.example.com- CORE_PEER_ADDRESS=peer1.org1.example.com:8051   #  7051- CORE_PEER_LISTENADDRESS=0.0.0.0:8051    #7051- CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:8052  #7052- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052   #7052- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:8051  #7051- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051- CORE_PEER_LOCALMSPID=Org1MSPvolumes:- /var/run/:/host/var/run/- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls- peer1.org1.example.com:/var/hyperledger/productionports:- 8051:8051   #这里不要忘记修改为   7051:7051
...
#只需要修改当前主机上需要启动的节点的端口就可以,比如当前主机节点为peer0.org1.example.com,那么只需要修改peer0.org1...的端口信息

2.3.2 docker-compose-cli.yaml(Order主机)

本文需要使用该文件启动节点,我们将该文件复制一份,以orderer节点为例

#复制该文件,并命名为docker-compose-orderer.yaml
cp docker-compose-cli.yaml docker-compose-orderer.yaml
#用编辑器打开该文件
sudo vim docker-compose-orderer.yaml

我们只在这台电脑上启动orderer节点,所以关于peer节点的信息用不到,我们将配置文件中多余的字段删除,只留下这些内容

version: '2'volumes:orderer.example.com:networks:byfn:services:orderer.example.com:extends:file:   base/docker-compose-base.yamlservice: orderer.example.comcontainer_name: orderer.example.comnetworks:- byfn

执行以下命令启动Orderer节点

sudo docker-compose -f docker-compose-orderer.yaml up

可能问题:no such image: hyperledger/fabric-ordered::invalid reference format

**原因:**base/docker-compose-base.yaml没有删掉order.example.com下image的冒号

对于Order节点,关闭网络的命令:

sudo docker-compose -f docker-compose-orderer.yaml down --volumes

建议在每一次启动网络之前都执行一次关闭网络的命令。

2.3.3 peer节点配置

以下以peer0.org1节点为例,其余peer节点操作相同

orderer 节点启动成功后,我们使用 scp 命令将 first 文件夹传输到 peer0.org1节点服务器。

#step1 进入到上级目录
cd ..
#step2 传输文件
sudo scp -r first/ [peer0.org1节点主机名]@10.65.26.64:/home/[用户名]/

比如对我来说,我运行以下指令

sudo scp -r first/ lzz@172.18.4.33:/home/lzz/

输入peer0.org1节点主机登录密码后,在peer0.org1节点主机/home/[用户名]下查看到first文件夹,将first移动到fabric-samples内first-network同级目录

然后,我们去peer0.org1节点主机,对 peer0.org1节点进行配置,同样,我们复制一份 docker-compose-cli.yaml 文件:

#step1:进入传输到的first文件夹
cd ~/first
#step2:复制docker-compose-cli.yaml文件 并命名为docker-compose-peer0-Org1.yaml
cp docker-compose-cli.yaml docker-compose-peer0-Org1.yaml
#step3:用编辑器打开该文件
vim docker-compose-peer0-Org1.yaml

对于peer0.Org1节点,同样,首先删除多余的部分,添加一些字段,记得根据自己的情况修改cli 部分的路径!如果你和默认一样就不用改了。如果不同一定要修改!!否则后面会出现问题。最终文件内容为:

  • volumes只保留当前节点

  • extra_hosts 字段除了当前节点不写,其他节点都写(比如我的Org1的peer0、peer1放在一台主机,那么当前主机的此文件只写orderer、peer0.org2、peer1.org2的配置ip)

  • cli下的image删除$IMAGE_TAG前面的冒号

  • cli下的environment、working_dir、volumes中存储路径要和我们具体情况对应

    默认文件里的路径是/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/…,我们要把中间的fabric/peer/crypto/替换为fabric-samples/first/crypto-config/()

  • depends_on保留当前节点、extra_hosts保留所有节点

version: '2'volumes:               #只保留当前节点peer0.org1.example.com:networks:byfn:services:peer0.org1.example.com:container_name: peer0.org1.example.comextends:file:  base/docker-compose-base.yamlservice: peer0.org1.example.comnetworks:- byfnextra_hosts:       #=========需要添加的额外字段,这里不写当前节点- "orderer.example.com:172.18.4.49"- "peer1.org1.example.com:172.18.4.34"- "peer0.org2.example.com:172.18.4.35"- "peer1.org2.example.com:172.18.4.36"cli:container_name: cliimage: hyperledger/fabric-tools$IMAGE_TAG #====删除此处$IMAGE_TAG前面的冒号tty: truestdin_open: trueenvironment:- GOPATH=/opt/gopath- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock- FABRIC_LOGGING_SPEC=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#上面四处替换如下- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp#working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peerworking_dir: /opt/gopath/src/github.com/hyperledger/fabric-samples/firstcommand: /bin/bashvolumes:- /var/run/:/host/var/run/#- ./../chaincode/:/opt/gopath/src/github.com/chaincode#- ./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# 上述四行替换如下- ./../chaincode/:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric-samples/first/scripts/- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric-samples/first/channel-artifactsdepends_on:       #========只保留当前节点- peer0.org1.example.comnetworks:- byfnextra_hosts:       #=========所有节点,包括order- "orderer.example.com:172.18.4.49"- "peer0.org1.example.com:172.18.4.33"     #这里需要写当前节点,因为cli容器需要与peer0.org1节点进行通信- "peer1.org1.example.com:172.18.4.34"- "peer0.org2.example.com:172.18.4.35"- "peer1.org2.example.com:172.18.4.36"

修改完docker-compose-peer0-Org1.yaml后,打开base/peer-base.yaml:

  • 删除peer-base和orderer-base下$IMAGE_TAG前的冒号:
  • 修改services-environment-CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE={project_name}_byfn(已经修改,例如first_name)
  • 记得修改所有peer节点的first_byfn
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#version: '2'services:peer-base:image: hyperledger/fabric-peer$IMAGE_TAG #===删除冒号environment:- GODEBUG=netdns=go- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock# the following setting starts chaincode containers on the same# bridge network as the peers# https://docs.docker.com/compose/networking/- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=first_byfn- FABRIC_LOGGING_SPEC=INFO#- FABRIC_LOGGING_SPEC=DEBUG- CORE_PEER_TLS_ENABLED=true- CORE_PEER_GOSSIP_USELEADERELECTION=true- CORE_PEER_GOSSIP_ORGLEADER=false- CORE_PEER_PROFILE_ENABLED=true- CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt- CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key- CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crtworking_dir: /opt/gopath/src/github.com/hyperledger/fabric/peercommand: peer node startorderer-base:image: hyperledger/fabric-orderer$IMAGE_TAG #===删除冒号environment:- FABRIC_LOGGING_SPEC=INFO- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0- ORDERER_GENERAL_GENESISMETHOD=file- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block- ORDERER_GENERAL_LOCALMSPID=OrdererMSP- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp# enabled TLS- ORDERER_GENERAL_TLS_ENABLED=true- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]- ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1- ORDERER_KAFKA_VERBOSE=true- ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key- ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]working_dir: /opt/gopath/src/github.com/hyperledger/fabriccommand: orderer

peer0.org1的配置文件已经修改完毕,接下来我们启动该节点:

sudo docker-compose -f docker-compose-peer0-Org1.yaml up

需要注意的是:如果后续操作有错误或者更新信息,一定要使用

sudo docker-compose -f docker-compose-peer0-Org1.yaml down

先关闭网络然后再重新开启网络生效。

启动该节点后,如下表示成功启动:

如果没有报错的话,peer0.org1节点成功启动。至于其他peer节点,只需要将 first 文件夹使用 scp 命令复制到各个服务器上,按照该模板对配置文件进行修改即可。

3. 创建通道

3.1 创建通道

创建通道需要进入cli容器:(以peer0.org1节点为例)

看到光标前的信息由ubuntu变为xxxxxx则成功进入容器

首先配置环境变量:(每次退出cli容器之后再次进入需要重新设置环境变量!!!

#当前cli容器默认配置是节点peer0,所以不需要其他配置信息
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#创建通道信息
peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA
#看到如下信息说明创建通道成功
2019-06-20 13:05:55.829 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-06-20 13:05:55.926 UTC [cli.common] readBlock -> INFO 002 Received block: 0
#将生成的文件移动到channel-artifacts文件夹中
mv mychannel.block channel-artifacts/

3.2 加入通道(全在peer0Org1的主机上切换身份进行)

#因为当前cli容器使用的是peer0的配置,所以可以直接将peer0加入通道
peer channel join -b channel-artifacts/mychannel.block
#更新环境变量使其他节点也加入通道
#=========peer1.org1===========  注意这里端口要与上面文件中配置的端口号相同
CORE_PEER_ADDRESS=peer1.org1.example.com:8051
#=========peer0.org2============
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer channel join -b channel-artifacts/mychannel.block
#=========peer1.org2=============
CORE_PEER_ADDRESS=peer1.org2.example.com:10051
peer channel join -b channel-artifacts/mychannel.block
#退出容器
exit

3.3 更新锚节点

CORE_PEER_TLS_ROOTCERT_FILE、CORE_PEER_MSPCONFIGPATH中路径对应正确

#重新进入容器
sudo docker exec -it cli bash
#更新环境变量
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#========Org1================
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA
#========Org2================
#更新环境变量
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
#退出容器
exit

4. 链码的安装测试

4.1 安装链码

所有节点的安装链码一定要在第一台安装链码的机器上切换身份进行安装!!!

请注意,链码的安装需要安装在所有节点,这一步需要如同3.2一样,在peer0Org1节点主机切换身份,四个节点均需要安装链码,因为链码相当于工具,每个节点安装后我们才能调用链码接口

#进入容器
sudo docker exec -it cli bash
#更新环境变量
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#=========peer0.org1===========
#这里很有可能会出现路径不存在的错误,解决方法是在容器内找到对应的链码所在位置,然后替换当前链码路径
##比如本文中链码路径为/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go
##则将下面命令的路径进行替换github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go/chaincode_example02#peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go/
#实例化链码 该步骤创建了a,b两个账户,其中a账户余额定义为100,b账户余额定义为200
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR      ('Org1MSP.member','Org2MSP.member')"
#这一步执行完毕后可以在其他节点上也安装链码
  • 如果出现问题:Error: error getting chaincode code mycc: path to chaincode does not exist ,再订正一遍 docker-compose-peer0-Org1.yaml 中的路径有没有问题,把之前启动的网络关闭,在重启。

  • 如果在其他三个节点身份下,出现Error: Bad response: 500 - error installing chaincode code mycc :1.0(chaincode /var/hyperledger/production/chaincodes/mycc.1.0 exists),执行以下命令,重启网络进行尝试。(但其实这说明已经存在,并不用再次下载)

docker rmi -f $(docker ps -aq)
docker volume prune

4.2 实例化链码

在通道上实例化链码。这会在通道上初始化链码,为链码指定背书策略,然后为目标节点启动链码容器。同时指定 -P “OR (‘Org1MSP.member’,‘Org2MSP.member’)” 作为策略。

ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem #实例化链码 该步骤创建了a,b两个账户,其中a账户余额定义为100,b账户余额定义为200
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
#这一步执行完毕后可以在其他节点上也安装链码

4.3 调用链码

#以peer0.org1为例
#首先进入cli容器
sudo docker exec -it cli bash
#执行以下命令进行查询a账户余额
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
#如果命令行输出100说明链码成功调用.#接下来我们发起一笔交易:通过peer0.org1节点将a账户余额转账给b20
peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'
#然后登陆peer1.org1节点进行查询
CORE_PEER_ADDRESS=peer1.org1.example.com:8051
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
#如果输出结果为:80
说明Fabric网络手动搭建成功
#退出容器
exit

如果出现问题:Error: error getting endorser client for channel: endorser client failed to connect to peer1.org2.example.com:10051: failed to create new connection: context deadline exceeded
解决方法:在 docker-compose-cli.yaml 中 cli 容器下,添加环境变量 GODEBUG=netdns=go,在 base/peer-base.yaml 中 peer-base 容器下,添加环境变量 GODEBUG=netdns=go
无效。

因为我们在每个节点都安装了链码,所以在实例化之后,我们就可以在不同peer节点主机去进行交易,也仍然可以通过一台主机切换身份来进行操作。

5 总结

以上就是Fabric1.4.1的多机部署过程。

Fabric1.4.1多机部署相关推荐

  1. Checkly如何借助Terraform实现零宕机部署

    Checkly是一款验证API端点正确性和浏览器点击流的监控工具.Checkly创始人Tim Nolet分享了他们在AWS上基于Docker的基础设施中借助Terraform实现零宕机部署的经验. C ...

  2. 阿里云多机部署Fabric 1order节点多个peer节点

    多机部署需要有N个固定的IP服务器地址,把order节点和peer节点放在不同的服务器上,如图所示 1.首先,更改配置文件crypto-config.yaml OrdererOrgs:- Name: ...

  3. (50)uniGUI 高大上的HyperServer-多机部署一个硬集群

    (同一个世界,同一个梦想,交流学习C++Builder and Delphi XE10,传承c++builder and Delphi的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码&q ...

  4. (Fabric 学习三)Fabric2.2 多机部署 使用fabcar链码

    注:参考博客: Hyperledger Fabric多机及explorer搭建_routiao的博客-CSDN博客 一.准备条件 硬件环境:Ubuntu虚拟机两台,一共两台主机:主机1的IP:192. ...

  5. Fabric实战(四)-多机部署fabric网络-solo

    ####多机部署fabric(solo模式) 本案例为: 一个orderer节点 两个peer节点 三台物理机: orderer:192.168.2.148peer0org1:192.168.2.10 ...

  6. 蓝鲸社区版单机、多机部署踩坑分享

    蓝鲸社区版单机.多机部署踩坑分享 一.单机版部署 1.报错:current host is not the controller 解决方法: cat /data/install/.controller ...

  7. 局域网环境、多机部署Fabric2.x版本(RAFT共识算法)+ 通道创建

    文章目录 多机部署Fabric2.x(RAFT)版本 fabric局域网多机链管理目录 环境 准备工作 配置文件准备 部署fabric网络 创建通道 多机部署Fabric2.x(RAFT)版本 fab ...

  8. Jumpserver堡垒机部署和基本使用

    Jumpserver堡垒机部署和基本使用 一.JumpServer介绍 1.JumpServer介绍 2.JumpServer特点 3.JumpServerd官网 二.环境要求 1.数据库版本要求 2 ...

  9. Xcode证书破解 iphone真机部署

    Xcode证书破解 iphone真机部署 证书伪造: 先按照该教程的步骤添加证书.注意,原教程选择的是"系统"证书,这里我们用"登录"证书,切记. Xcode破 ...

最新文章

  1. 多任务版udp聊天器
  2. 摘自《解析极限编程-拥抱变化》
  3. 打通NTFS权限 文件共享各取所需
  4. mysql中的get_lock锁机制解析
  5. 关于21年电赛,这些一定要熟悉!
  6. python在windows上安装_在Windows上安装Python | 严佳冬
  7. Linux 查看内存插槽数、最大容量和频率
  8. Python easy_insatll 安装包
  9. ad中电容用什么封装_【AD封装】VH3.96mm插件座子(带3D)
  10. Linux 配置IP
  11. 苏炫杰全国计算机等级考试,高二升高三的主题班会
  12. linux 扩lv文件系统,Linux LVM系列(五)lv xfs文件系统在线扩容
  13. CentOS文件系统 磁盘格式化及挂载的两种方法
  14. 如何压缩图片大小?这几种图片压缩方法总有一款适合你
  15. Java基础系列1-Java语言概述
  16. pip问题集锦(pip是干什么的,pip安装速度过慢怎么办,--user是什么意思?)
  17. 校园歌手大赛10分c语言,校园歌手大赛评分细则
  18. 2019天津市二级计算机考试,天津市2019年9月计算机等级考试都有哪些考点可以报名?...
  19. YouTube 双字幕浏览器辅助
  20. 苹果状态栏HTML,有关HTML5页面在iPhoneX适配问题

热门文章

  1. 开关灯效果HTML,开关灯效果
  2. 一般人我都不告诉他们
  3. ActiveX如何在Google上运行
  4. error ‘onMounted‘ is not defined no-undef,已解决,已更正了
  5. ACM/ICPC竞赛指南
  6. 将数据库中的表导出到word
  7. Home Assistant初学者指南 - 5 之 如何在Home Assistant中设置Picture Elements卡 - Lovelace
  8. 论文趋势分析——数据理解与分析
  9. 制作可以用航模遥控器遥控的ESP32小车
  10. 网站url后带spm参数的作用