2017-06-09

版权声明:本文为博主原创文章,转载注明“龙棠博客”字样和原文链接。

系统环境

#前置要求

- Docker V1.12 或更高
- Docker Compose V1.8 或更高
- Docker Toolbx 【用于Windows本文为Linux不需要】
- Go V1.7 或更高

#CentOS7
[root@host1 go]# uname -a
Linux host1 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

-+#docker
1root@host1 go]# docker version
Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:06:25 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:06:25 2017
 OS/Arch:      linux/amd64
 Experimental: false
 
 #docker compose
[root@host1 go]# docker-compose version
docker-compose version 1.13.0, build 1719ceb
docker-py version: 2.2.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

下载二进制

https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/fabric-binary/linux-amd64-1.0.0-beta/fabric-binary-linux-amd64-1.0.0-beta.tar.gz

#或者
curl -O https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/fabric-binary/linux-amd64-1.0.0-beta/fabric-binary-linux-amd64-1.0.0-beta.tar.gz

#解压进入release/linux-amd64

#注释docker-compose-cli.yaml 第57行 
command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
#注释此句的目的是防止cli容器进行类似后续操作:创建channel,加入,安装cc,初始化cc,当后续手动操作实践后可以取消注释,cli容器实例启动
时会主动创建channel并循坏加四个peer加入,具体过程阅读宿主机目录release/linux-amd64/scripts/script.sh

#下载docker镜像,常规速度较慢可以采用阿里云加速,国外VPN等方式
[root@host1 linux-amd64]# pwd
/root/release/linux-amd64
[root@host1 linux-amd64]# ./download-dockerimages.sh 
===> Pulling fabric Images
==> FABRIC IMAGE: peer
......

生成密码和配置,宿主机执行

#注释docker-compose-cli.yaml 第57行 【如果已经注释可以忽略此注释操作】
command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'

#以下在shell中执行
$CHANNEL_NAME=king
$./generateArtifacts.sh $CHANNEL_NAME
#上述命令执行完毕后channel-artifacts, crypto-config内将有文件生成

#启动镜像,会将生成的文件映射到部分容器实例
$CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=1000 docker-compose -f docker-compose-cli.yaml up -d

#如果使用CouchDB,和上述命令选择一个执行
$CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=1000 docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d

#执行之后如下,创建了4个peer,1个order,1个cli,后续操作基本在cli容器实例内执行
[root@host1 linux-amd64]# docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                                              NAMES
4f96d53c21b6        hyperledger/fabric-tools     "/bin/bash"         30 minutes ago      Up 30 minutes                                                          cli
782328887b9d        hyperledger/fabric-peer      "peer node start"   30 minutes ago      Up 30 minutes       0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp   peer1.org2.example.com
46ea947206f1        hyperledger/fabric-orderer   "orderer"           30 minutes ago      Up 30 minutes       0.0.0.0:7050->7050/tcp                             orderer.example.com
f055c5ffa368        hyperledger/fabric-peer      "peer node start"   30 minutes ago      Up 30 minutes       0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp     peer0.org1.example.com
e7cfd965640f        hyperledger/fabric-peer      "peer node start"   30 minutes ago      Up 30 minutes       0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp     peer1.org1.example.com
5d7bcae4e38a        hyperledger/fabric-peer      "peer node start"   30 minutes ago      Up 30 minutes       0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp     peer0.org2.example.com

创建Channel并加入

#进入操作容器实例,cli为容器实例名称,也可以使用id作为参数,比如docker exec -it 4f96d53c21b6 bash
$docker exec -it cli bash

#后续操作在cli容器执行
#引入参数
$CHANNEL_NAME=king

#生成创世块
$peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem

#加入
$peer channel join -b $CHANNEL_NAME.block

安装CC并初始化,cli容器内执行

#安装CC,只是打包代码,路径和宿主机release/linux-amd64/chaincode/go
$peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
#-p 参数制定的为GOPATH的相对路径

#初始化,并生成docker镜像并启动容器实例
#example02 示例为基本数值账户,下述为初始化名为a,b两个账户,初始值均为100
$peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

#执行完毕新增docker实例
[root@host1 ~]# docker ps
CONTAINER ID        IMAGE                                 COMMAND                  CREATED              STATUS              PORTS                                              NAMES
542cd374810f        dev-peer0.org1.example.com-mycc-1.0   "chaincode -peer.a..."   5 seconds ago        Up 4 seconds                                                           dev-peer0.org1.example.com-mycc-1.0
0e8d5f77cc8c        hyperledger/fabric-tools              "/bin/bash"              About a minute ago   Up About a minute                                                      cli
eac20816bda1        hyperledger/fabric-orderer            "orderer"                About a minute ago   Up About a minute   0.0.0.0:7050->7050/tcp                             orderer.example.com
e57c8f794455        hyperledger/fabric-peer               "peer node start"        About a minute ago   Up About a minute   0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp     peer0.org1.example.com
6d995eeba05d        hyperledger/fabric-peer               "peer node start"        About a minute ago   Up About a minute   0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp   peer1.org2.example.com
4e7873e1ab0b        hyperledger/fabric-peer               "peer node start"        About a minute ago   Up About a minute   0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp     peer0.org2.example.com
a59c5bb01bd8        hyperledger/fabric-peer               "peer node start"        About a minute ago   Up About a minute   0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp     peer1.org1.example.com

查询和调用,cli容器内执行

#查询
$peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

#调用,进行转账交易
$peer chaincode invoke -o orderer.example.com:7050  --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem  -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

#日志查看,宿主机执行
$docker logs peer0.org1.example.com 

#日志实时查看,宿主机执行
$docker logs -f peer0.org1.example.com 

结束清理重置,宿主机执行

#清理所有容器实例和密码相关配置
[root@host1 linux-amd64]# ./network_setup.sh down

#清理前
[root@host1 linux-amd64]# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
dev-peer0.org1.example.com-mycc-1.0       latest              d9ab7374192d        23 minutes ago      173MB

如果使用CouchDB,使用其他Chaincode示例

#基本步骤同上述类似,在安装cc时使用marbles02
#安装
$peer chaincode install -o orderer.example.com:7050 -n marbles -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/marbles02

#初始化
$peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/marbles02 -c '{"Args":["init"]}' -P "OR ('Org0MSP.member','Org1MSP.member')"

#初始化数据
$peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble1","blue","35","tom"]}'

$eer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble2","red","50","tom"]}'

$peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble3","blue","70","tom"]}'

$peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarble","marble2","jerry"]}'

$peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarblesBasedOnColor","blue","jerry"]}'

$peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["delete","marble1"]}'

#因为使用了CouchDB,支持一些其他查询
$peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["getHistoryForMarble","marble2"]}'

#访问CouchDB Web控制台,将172.18.0.77 替换为宿主机IP
http://172.18.0.77:5984/_utils/

# 查看容器实例5984映射到了宿主机
$docker ps 

参考官方

开始应用开发