2017-01-08

上次介绍chaincode的部署,不过采用的是dev模式,这次记录net模式,fabric通过docker启动chaincode

背景阅读

  • 本文针对V0.6.1版本
  • validator peer的配置文件core.yaml中配置参数chaincode.mode默认为net,该参数可用CORE_CHAINCODE_MODE覆盖
  • chaincode.mode dev 为开发模式本地命令行运行,开发者自行启动cc服务,cc向vp的7051注册建立两者gRPC通道
  • chaincode.mode net 为用docker启动container运行,在部署时chaincodeSupport根据默认chaincode.(golang/car/java).Dockerfile
    和CLI指定的-p接口自行构建docker image,然后create

实验操作

  • 采用src/github.com/hyperledger/fabric/bddtests/bdd-docker内的docker-compose文件
  • src/github.com/hyperledger/fabric/bddtests/bdd-docker/compose-defaults.yml
  • src/github.com/hyperledger/fabric/bddtests/bdd-docker/docker-compose-4-consensus-base.yml
  • src/github.com/hyperledger/fabric/bddtests/bdd-docker/docker-compose-4-consensus-batch.yml

compose-defaults.yml

  • 这两定义了两种节点的基础信息作为公共通用部分 vp节点和负责成员管理的membersrvc
vp:
  image: hyperledger/fabric-peer
  environment:
    - CORE_PEER_ADDRESSAUTODETECT=true
    - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
    # TODO:  This is currently required due to BUG in variant logic based upon log level.
    - CORE_LOGGING_LEVEL=DEBUG
    # 笔者自增,利用docker exec -ti时使用clear需要设置TERM变量,此处自己引入
    - TERM=xterm
    # 笔者自增:如果采用dev模式添加如下行,并取消注释
    # - CORE_CHAINCODE_MODE=dev
  # Script will wait until membersrvc is up (if it exists) before starting
  # $$GOPATH (double dollar) required to prevent docker-compose doing its own
  # substitution before the value gets to the container
  command: sh -c "exec $$GOPATH/src/github.com/hyperledger/fabric/bddtests/scripts/start-peer.sh"
  # Ideally we'd only mount /var/run/docker.sock but v1.5.2 of docker-compose
  # does not have to capability to mount individual files. Hence we mount the
  # entire folder in specific folder and specify it explicitly above.
  # This issue seems to be sorted in docker-compose 1.8.0 however that requires
  # Docker 1.10 and CI isn't at that version yet.
  volumes:
    - /var/run/:/host/var/run/

  # Use these options if coverage desired for peers
  #image: hyperledger/fabric-peer-coverage
  #command: ./peer.test --test.coverprofile=coverage.cov node start
membersrvc:
   image: hyperledger/fabric-membersrvc
   command: membersrvc

docker-compose-4-consensus-base.yml

  • 定义了vp节点指向membersrvc连接需要的参数,membersrvc服务于端口7054
  • 指定了PBFT的副本数,这个在PBFT插件引擎中需要使用,同样参数在src/github.com/hyperledger/fabric/consensus/pbft/config.yaml
vpBase:
  extends:
    file: compose-defaults.yml
    service: vp
  environment:
    - CORE_SECURITY_ENABLED=true
    - CORE_PEER_PKI_ECA_PADDR=membersrvc0:7054
    - CORE_PEER_PKI_TCA_PADDR=membersrvc0:7054
    - CORE_PEER_PKI_TLSCA_PADDR=membersrvc0:7054
    - CORE_PEER_PKI_TLS_ROOTCERT_FILE=./bddtests/tlsca.cert
    # TODO: Currently required due to issue reading obbca configuration location
    - CORE_PBFT_GENERAL_N=4
    # The checkpoint interval in sequence numbers
    - CORE_PBFT_GENERAL_K=2

vpBatch:
  extends:
    service: vpBase
  environment:
    - CORE_PEER_VALIDATOR_CONSENSUS_PLUGIN=pbft
    - CORE_PBFT_GENERAL_TIMEOUT_REQUEST=10s
    - CORE_PBFT_GENERAL_MODE=batch
    # TODO: This is used for testing as to assure deployment goes through to block
    - CORE_PBFT_GENERAL_BATCHSIZE=1

docker-compose-4-consensus-batch.yml

  • 最终docker-compose文件
  • 在主机上运行docker-compose -f docker-compose-4-consensus-batch.yml up
  • 6060端口是性能分析的端口,笔者认为在初始极端用不到
  • 笔者自行增加了vp0到宿主机的端口映射
  • 7050 REST API
  • 7051 peer service 如果采用dev模式在宿主机上启动cc需要向该端口注册建立gRPC连接
membersrvc0:
  extends:
    file: compose-defaults.yml
    service: membersrvc

vp0:
  extends:
    file: docker-compose-4-consensus-base.yml
    service: vpBatch
  environment:
    - CORE_PEER_ID=vp0
    - CORE_SECURITY_ENROLLID=test_vp0
    - CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT
    - CORE_PEER_PROFILE_ENABLED=true
  links:
    - membersrvc0
  ports:
    # 原始端口映射
    # - 7050:6060
    
    # 笔者修改端口映射
    - 6060:6060
    - 7050:7050
    - 7051:7051
    
vp1:
  extends:
    file: docker-compose-4-consensus-base.yml
    service: vpBatch
  environment:
    - CORE_PEER_ID=vp1
    - CORE_PEER_DISCOVERY_ROOTNODE=vp0:7051
    - CORE_SECURITY_ENROLLID=test_vp1
    - CORE_SECURITY_ENROLLSECRET=5wgHK9qqYaPy
  links:
    - membersrvc0
    - vp0

vp2:
  extends:
    file: docker-compose-4-consensus-base.yml
    service: vpBatch
  environment:
    - CORE_PEER_ID=vp2
    - CORE_PEER_DISCOVERY_ROOTNODE=vp0:7051
    - CORE_SECURITY_ENROLLID=test_vp2
    - CORE_SECURITY_ENROLLSECRET=vQelbRvja7cJ
  links:
    - membersrvc0
    - vp0

vp3:
  extends:
    file: docker-compose-4-consensus-base.yml
    service: vpBatch
  environment:
    - CORE_PEER_ID=vp3
    - CORE_PEER_DISCOVERY_ROOTNODE=vp0:7051
    - CORE_SECURITY_ENROLLID=test_vp3
    - CORE_SECURITY_ENROLLSECRET=9LKqKH5peurL
  links:
    - membersrvc0
    - vp0

docker环境

  • 以net模式运行除了fabric-peer,fabric-membersrvc镜像,还需要一个基础镜像作为构建cc镜像的基础fabric-baseimage
root@ubuntu:~# docker images
REPOSITORY                      TAG                    IMAGE ID            CREATED             SIZE
hyperledger/fabric-baseimage    latest                 4ac07a26ca7a        5 weeks ago         1.241 GB
hyperledger/fabric-baseimage    x86_64-0.2.2           4ac07a26ca7a        5 weeks ago         1.241 GB
hyperledger/fabric-membersrvc   latest                 b3654d32e4f9        12 weeks ago        1.417 GB
hyperledger/fabric-membersrvc   x86_64-0.6.1-preview   b3654d32e4f9        12 weeks ago        1.417 GB
hyperledger/fabric-peer         latest                 21cb00fb27f4        12 weeks ago        1.424 GB
  • core.yaml中可以看出具体的依赖情况
chaincode:

    # The id is used by the Chaincode stub to register the executing Chaincode
    # ID with the Peerand is generally supplied through ENV variables
    # the Path form of ID is provided when deploying the chaincode. The name is
    # used for all other requests. The name is really a hashcode
    # returned by the system in response to the deploy transaction. In
    # development mode where user runs the chaincode, the name can be any string
    id:
        path:
        name:

    golang:

        # This is the basis for the Golang Dockerfile.  Additional commands will
        # be appended depedendent upon the chaincode specification.
        # 下方配置作为构建cc镜像的基础,配合代码中的部分构建cc的镜像
        Dockerfile:  |
            from hyperledger/fabric-baseimage
            #from utxo:0.1.0
            COPY src $GOPATH/src
            WORKDIR $GOPATH

部署chaincode

  • docker-compose -f docker-compose-4-consensus-batch.yml up 启动4个vp,1个membersrvc
  • docker exec -ti 203e938d987b bash 选择一个vp进入其terminal
root@ubuntu:~# docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
94f2b5e300b4        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   46 minutes ago      Up 31 seconds                                                                  deploy_vp2_1
c975eed06fc0        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   46 minutes ago      Up 31 seconds                                                                  deploy_vp3_1
85895149db4d        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   46 minutes ago      Up 31 seconds                                                                  deploy_vp1_1
203e938d987b        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   46 minutes ago      Up 32 seconds       0.0.0.0:6060->6060/tcp, 0.0.0.0:7050-7051->7050-7051/tcp   deploy_vp0_1
257f51d77585        hyperledger/fabric-membersrvc   "membersrvc"             46 minutes ago      Up 32 seconds                                                                  deploy_membersrvc0_1
root@ubuntu:~# docker exec -ti 203e938d987b bash
root@203e938d987b:/opt/gopath/src/github.com/hyperledger/fabric#

#执行chaincode路径
#该路径需要为$GOPATH/src的相对路径
export CCPATH=github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

#登录
peer network login jim -p 6avZQLwcUe9b
04:04:29.756 [logging] LoggingInit -> DEBU 001 Setting default logging level to DEBUG for command 'network'
04:04:29.756 [networkCmd] networkLogin -> INFO 002 CLI client login...
04:04:29.757 [networkCmd] networkLogin -> INFO 003 Local data store for client loginToken: /var/hyperledger/production/client/
04:04:29.757 [networkCmd] networkLogin -> INFO 004 Logging in user 'jim' on CLI interface...
04:04:29.826 [networkCmd] networkLogin -> INFO 005 Storing login token for user 'jim'.
04:04:29.827 [networkCmd] networkLogin -> INFO 006 Login successful for user 'jim'.
04:04:29.827 [main] main -> INFO 007 Exiting.....

#部署
peer chaincode deploy -u jim -l golang -p $CCPATH -c '{"Args": ["init", "a","100", "b", "200"]}'
04:04:35.577 [logging] LoggingInit -> DEBU 001 Setting default logging level to DEBUG for command 'chaincode'
04:04:35.577 [chaincodeCmd] getChaincodeSpecification -> INFO 002 Local user 'jim' is already logged in. Retrieving login token.
04:04:38.171 [chaincodeCmd] chaincodeDeploy -> INFO 003 Deploy result: type:GOLANG chaincodeID:<path:"github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02" name:"ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539" > ctorMsg:<args:"init" args:"a" args:"100" args:"b" args:"200" > 
Deploy chaincode: ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
04:04:38.174 [main] main -> INFO 004 Exiting.....
  • peer chaincode deploy的-p参数必须为$GOPATH/src的相对路径
  • 等待一段时间, 查看镜像
root@ubuntu:~# docker images
REPOSITORY                                                                                                                                 TAG                    IMAGE ID            CREATED             SIZE
dev-vp0-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539   latest                 b65b4c49674b        41 seconds ago      1.276 GB
dev-vp2-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539   latest                 058823c6e614        42 seconds ago      1.276 GB
dev-vp1-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539   latest                 809f1274b811        42 seconds ago      1.276 GB
dev-vp3-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539   latest                 f908b0c50bea        42 seconds ago      1.276 GB
hyperledger/fabric-baseimage                                                                                                               latest                 4ac07a26ca7a        5 weeks ago         1.241 GB
hyperledger/fabric-baseimage                                                                                                               x86_64-0.2.2           4ac07a26ca7a        5 weeks ago         1.241 GB
hyperledger/fabric-membersrvc                                                                                                              latest                 b3654d32e4f9        12 weeks ago        1.417 GB
hyperledger/fabric-membersrvc                                                                                                              x86_64-0.6.1-preview   b3654d32e4f9        12 weeks ago        1.417 GB
hyperledger/fabric-peer                                                                                                                    latest                 21cb00fb27f4        12 weeks ago        1.424 GB
  • 容器运行状态
root@ubuntu:~# docker ps 
CONTAINER ID        IMAGE                                                                                                                                      COMMAND                  CREATED              STATUS              PORTS                                                      NAMES
35a35d05d0eb        dev-vp0-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539   "/opt/gopath/bin/ee5b"   16 seconds ago       Up 15 seconds                                                                  dev-vp0-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
92100fe587b7        dev-vp1-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539   "/opt/gopath/bin/ee5b"   16 seconds ago       Up 15 seconds                                                                  dev-vp1-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
33618a7c5773        dev-vp2-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539   "/opt/gopath/bin/ee5b"   16 seconds ago       Up 15 seconds                                                                  dev-vp2-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
7a2af08a0881        dev-vp3-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539   "/opt/gopath/bin/ee5b"   16 seconds ago       Up 16 seconds                                                                  dev-vp3-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
8bfabdb9bb13        hyperledger/fabric-peer                                                                                                                    "sh -c 'exec $GOPATH/"   About a minute ago   Up About a minute                                                              deploy_vp2_1
d1aea97c21eb        hyperledger/fabric-peer                                                                                                                    "sh -c 'exec $GOPATH/"   About a minute ago   Up About a minute                                                              deploy_vp3_1
b9c81f8e89a9        hyperledger/fabric-peer                                                                                                                    "sh -c 'exec $GOPATH/"   About a minute ago   Up About a minute                                                              deploy_vp1_1
4076525d77a2        hyperledger/fabric-peer                                                                                                                    "sh -c 'exec $GOPATH/"   About a minute ago   Up About a minute   0.0.0.0:6060->6060/tcp, 0.0.0.0:7050-7051->7050-7051/tcp   deploy_vp0_1
e4893b9fc5da        hyperledger/fabric-membersrvc                                                                                                              "membersrvc"             About a minute ago   Up About a minute                                                              deploy_membersrvc0_1

其它事项

  • dev模式-n参数可用,后续调用也用部署时-n指定参数,net模式下-n参数不可用chaincodeid.name会被cc代码的哈希值填充,后续调用也需要使用。
  • net模式部署完毕后cc的哈希值会反馈
  • 删除所有运行容器、已经dev-vp开头的镜像命令。删除动作,谨慎操作!
#删除所有运行容器
docker ps -a | awk 'NR >1 {print $1}' |xargs -I {} docker rm -f {}

#删除所有dev-vp开头镜像
docker images | awk 'NR >1 {print $1}' | awk '/dev-vp*/'|xargs -I {} docker rmi {}