在踩了好多坑之后,终于成功的在三台虚拟机上搭起来fabric网络
配置文件使用的是e2e_cli的基础上进行修改,但是运行还是要分步骤来,直接使用script.sh容易在出错的时候不知道哪一步出了问题,而且把环境搞的乱七八糟,修复起来连续踩坑。
在修完所有的bug之后,发现80%的问题都是环境清理遗留问题,而且即使知道是这个问题,也不好定位到底是哪里被修改了。
三台机器角色设置:
15.1.0.167 order节点
15.1.0.101 peer0.Org1
15.1.20.229 Peer0.Org2
保证三台机器本机都能运行fabric网络
修改hosts文件
vim /etc/hosts
添加
15.1.0.167 orderer.example.com
15.1.0.101 peer0.org1.example.com
15.1.20.229 peer0.org2.example.com
生成channel-artifacts;crypto-config文件夹(生成一次即可)
./generateArtifacts.sh mychannel
channel-artifacts,里面包含mychannel通道相关的文件
crypto-config,里面包含各个节点的公私钥和证书的信息
(后面挂载到镜像文件中)
设置docker-compose-order.yaml
基于自带的docker-compose.cli修改
cp docker-compose-cli.yaml docker-compose-peer.yaml
只保留order,其他删除
version: '2'
services:
orderer.example.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.example.com
container_name: orderer.example.com
设置docker-compose-peer.yaml
peer0.org1
只保留一个peer和cli
修改:extra_hosts,(cli)depends on ; extra_hosts,去掉command一行
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: //add
- "orderer.example.com:15.1.0.167" //add
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.exampl
e.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.ex
ample.com/peers/peer0.org1.example.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.exampl
e.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:15.1.0.167"
- "peer0.org1.example.com:15.1.0.101"
- "peer0.org2.example.com:15.1.20.229"
peer0.Org2
基于peer0.Org1
修改:extra_hosts,(cli)depends on ; extra_hosts,去掉command一行
所有org1都改为org2
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:15.1.0.167"
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.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.exampl
e.com/peers/peer0.org2.example.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example
.com/peers/peer0.org2.example.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.ex
ample.com/peers/peer0.org2.example.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.exampl
e.com/users/Admin@org2.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:15.1.0.167"
- "peer0.org1.example.com:15.1.0.101"
- "peer0.org2.example.com:15.1.20.229"
修改base/docker-compose-base.yaml
此文件主要进行网络设置
去掉不存在的节点,由于不在同一个机子上,所以不需要端口映射
ports:
- 7051:7051
- 7052:7052
- 7053:7053
以上在order中修改,其他两个主机的e2e_cli直接替换
替换后org1 org2的docker-compose-peer.yaml按上面对应修改
启动容器
在order节点上
docker-compose -f docker-compose-orderer.yaml up -d
在两个peer节点上
docker-compose -f docker-compose-peer.yaml up -d
都启动完成时docker ps -a 查看容器,可以看到 order节点上一个order容器,peer上分别两个,peer和cli容器
Org1节点操作
容器启动成功后在peer节点上操作
进入cli容器(不关闭容器退出 Ctrl + P + Q,关闭容器退出 exit)
docker exec -it cli bash
设置变量,方便后面使用(要设置,不然后面的语句找不到参数,不设置太长没办法输)
CHANNEL_NAME=mychannel
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
第一个peer节点:
创建通道(同一个通道只需要创建一次)
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA
加入通道
peer channel join -b mychannel.block
更新为锚节点(本次每个组织只有一个节点,所以可以选择性设置)
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile $ORDERER_CA
安装链码(代码地址与映射的地址相关)
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
实例化链码(只需实例化一次)
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}'
测试是否成功:
query查询(此时100)
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
invoke交互(交互完a减少10)
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'
再次query,变为90,成功
Org2节点操作
获取通道文件(Org1创建的通道)
peer channel fetch oldest mychannel.block -o orderer.example.com:7050 -c mychannel --tls --cafile $ORDERER_CA
加入通道
peer channel join -b mychannel.block
安装链码
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
测试:
query查询,结果是Org1 invoke操作后的90,说明成功
遇到的问题
firewall-cmd --zone=public --add-port=7051/tcp --permanent //开启7051端口
firewall-cmd --reload //立即生效
firewall-cmd --zone=public --list-ports // 查看已经开放的端口
docker-compose -f docker-compose-peer.yaml down --volumes --remove-orphans
sudo docker rm -f $(docker ps -a | grep "hyperledger/*" | awk "{print \$1}")
sudo docker volume prune
最开始就是因为出现了这个错误,导致连环错。网上关于这个问题的回答是 环境没有清理干净,重启docker/重启网络,但是这些方法并没有用,反而把环境弄的更乱(猜测文件就是因为这个丢失的)
错误提示是在这个路径下找不到东西,在xftp里面按这个路径根本就没有这些文件夹,就卡在了这里
实际上是因为,这个路径是虚拟路径,没办法直接进行文件操作
这就与前面的docker-compose-peer.yaml里的cli地方的配置有关,volumes其实是对文件进行挂载,后面的虚拟路径下的文件是通过:前的文件对应加载过来的,所以前面说crypto里面找不到文件,就在xftp中更新正确的crypto文件夹即可(第一步生成的,其他机子上也有,保持一致即可)
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
语法示意
/var/run --系统路径
/host/var/run/ --docker容器内部路径
./ --当前目录
../ --父级目录
正常crypto里面有peer,msp,ca 等等,发生错误的时候crypto里只有一个peer,所以无法运行
参考:
深蓝居Fabric 1.0的多机部署
搭建fabric多机部署环境
联盟链 Hyperledger Fabric v1.4.4 四台分机搭建1orderer+3peer
手动部署hyperledger fabric单机多节点网络
搭建基于hyperledger fabric的联盟社区(五) --启动Fabric网络
踩了很多坑,中间也有心态爆炸的时候,改bug真的很考验细心和耐心,