多個 fabric 區塊鏈網絡: docker swarm


環境說明

  • 測試環境,1台機器
  • 操作系統:ubutun 16 4c 64G
  • docker 版本
  • 實現功能:開發(java程序)接收參數NETWORKNAME(網絡名稱)、ORGNAME(組織名稱)、HOSTNAME(域名),根據模板yaml文件,實例化不同組織的yaml 文件,結合shell腳本啟動實例化的網絡。
  • 注意:在yaml的版本2中能使用peer1.org2.example.com ,在版本3中只能使用peer1_org2_example_com。在yaml版本2中能使用extends,yaml版本3中不能。后面有做詳細轉換說明。
# docker version
Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        2d0083d
 Built:             Fri Aug 16 14:19:38 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.7
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       2d0083d
  Built:            Thu Aug 15 15:12:41 2019
  OS/Arch:          linux/amd64
  Experimental:     false

docker swarm

# docker swarm init

fabric 的配置

配置是根據官網的源碼進行改造。
下載fabric-samples源碼

# mkdir -p /opt/fabric
# cd  /opt/fabric
# git clone -b master https://github.com/hyperledger/fabric-samples.git

查看源碼中的配置

參考:docker-compose-ca.yaml、docker-compose-cli.yaml 、docker-compose-couch.yaml、docker-compose-etcdraft2.yaml配置文件進行改造。
改造后的文件:

stack-ca.yaml

version: '3'
#參數說明:NETWORKNAME(網絡名稱)、ORGNAME(組織名稱)、HOSTNAME(域名)。使用shell腳本,加上3個參數生成對應的不同的組織的ca啟動文件,然后進行啟動。
networks:
  fabric-${NETWORKNAME}:
    external: true

services:

  ca_${ORGNAME}:
    image: hyperledger/fabric-ca
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
      - FABRIC_CA_SERVER_CA_NAME=ca-${ORGNAME}
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.${ORGNAME}.${HOSTNAME}-cert.pem
      - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/${BYFN_CA1_PRIVATE_KEY}
      - FABRIC_CA_SERVER_PORT=10013
    ports:#注意端口不要沖突
    #  - "10013:10013"
    command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.${ORGNAME}.${HOSTNAME}-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/${BYFN_CA1_PRIVATE_KEY} -b admin:adminpw -d'
    volumes:
      - /home/fabric/networks/${NETWORKNAME}/crypto-config/peerOrganizations/${ORGNAME}.${HOSTNAME}/ca/:/etc/hyperledger/fabric-ca-server-config/
# hostname是這個ca容器的主機名稱
    hostname: ca_peer${ORGNAME}
    networks:
      fabric-${NETWORKNAME}:
        aliases:
        - ca_peer${ORGNAME}

stack-cli.yaml (peer 和 cli,可以分開兩個文件。一般多個fabric網絡中只需要有一個cli即可。 )

version: '3'
networks:
  fabric-${NETWORKNAME}:
    external: true
volumes:
  peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:
  peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:
services:
  peer0_${ORGNAME}_${NETWORKNAME}:
    image: hyperledger/fabric-peer:2.1.1
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

    environment:
      # 源碼中的docker-compose是版本2的,支持extends。我們現在用的是yaml 版本3,不支持extends。需要將原來依賴的配置全部寫完整
      ######下面是源碼中的配置
      #peer1.org2.example.com:
        #container_name: peer1.org2.example.com
        #extends:
          #file:  base/docker-compose-base.yaml
          #service: peer1.org2.example.com
        #networks:
      #####需要找到對應base/docker-compose-base.yaml的peer1.org2.example.com那段配置
      #####下面是base/docker-compose-base.yaml的peer1.org2.example.com配置(base/docker-compose-base.yaml中有多個服務)
 #peer1.org2.example.com:
 #   container_name: peer1.org2.example.com
 #   extends:
 #     file: peer-base.yaml   這個位置還依賴了文件peer-base.yaml的peer-base,這個依賴文件也需要。
 #     service: peer-base
 #   environment:
 #     - CORE_PEER_ID=peer1.org2.example.com
 #     - CORE_PEER_ADDRESS=peer1.org2.example.com:10051
 #     - CORE_PEER_LISTENADDRESS=0.0.0.0:10051
 #     - CORE_PEER_CHAINCODEADDRESS=peer1.org2.example.com:10052
 #     - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:10052
 #     - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:10051
 #     - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:9051
 #     - CORE_PEER_LOCALMSPID=Org2MSP
 #   volumes:
 #       - /var/run/:/host/var/run/
 #       - ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp
 #       - ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls
 #       - peer1.org2.example.com:/var/hyperledger/production
 #   ports:
 #     - 10051:10051
#######以上是base/docker-compose-base.yaml的peer1.org2.example.com配置,里面有依賴peer-base.yaml的peer-base,將這段配置放在stack-cli.yaml 文件#######相應位置
      #以下配置來自base/peer-base.yaml的peer-base
      - 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=fabric-${NETWORKNAME}
      - 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.crt
      # Allow more time for chaincode container to build on install.
      - CORE_CHAINCODE_EXECUTETIMEOUT=300s
      #以上配置來自base/peer-base.yaml的peer-base
      #以下配置來自base/docker-compose-base.yaml的peer1.org2.example.com
      - CORE_PEER_ID=peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}
      - CORE_PEER_ADDRESS=peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:20
      - CORE_PEER_LISTENADDRESS=0.0.0.0:20
      - CORE_PEER_CHAINCODEADDRESS=peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:21
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:21
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:1020
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:20
      - CORE_PEER_LOCALMSPID=${ORGNAME}MSP
      #以上配置來自base/docker-compose-base.yaml的peer1.org2.example.com
      #注意,增加了數據庫的配置。數據庫端口號是固定的,會根據不同數據庫服務名稱訪問到不同數據庫。請不要修改端口號。
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=peer0_${ORGNAME}_couchdb:5984
      # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
      # provide the credentials for ledger to connect to CouchDB.  The username and password must
      # match the username and password set for the associated CouchDB.
      - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
      - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
   #下面配置來自base/peer-base.yaml的peer-base
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
   #以上配置來自base/peer-base.yaml的peer-base
    hostname: peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}
    volumes:
      - /var/run/:/host/var/run/
      - /home/vbaas/fabric/networks/${NETWORKNAME}/crypto-config/peerOrganizations/test.nettest.b.com/peers/peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/msp:/etc/hyperledger/fabric/msp
      - /home/vbaas/fabric/networks/${NETWORKNAME}/crypto-config/peerOrganizations/${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/peers/peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/tls:/etc/hyperledger/fabric/tls
      - /home/vbaas/fabric/networks/${NETWORKNAME}/mount/peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/var/hyperledger/production:/var/hyperledger/production
    ports:
   #   - 20:20

    networks:
      fabric-${NETWORKNAME}:
        aliases:
          - peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}
#peer1的參考peer0即可。
  peer1_${ORGNAME}_${NETWORKNAME}:
    image: hyperledger/fabric-peer:2.1.1
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

    environment:
      - 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=fabric-${NETWORKNAME}
      - 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.crt
      - CORE_PEER_ID=peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}
      - CORE_PEER_ADDRESS=peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:1020
      - CORE_PEER_LISTENADDRESS=0.0.0.0:1020
      - CORE_PEER_CHAINCODEADDRESS=peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:1021
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:1021
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:1020
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:20
      - CORE_PEER_LOCALMSPID=${ORGNAME}MSP
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=peer1_${ORGNAME}_couchdb:5984
      # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
      # provide the credentials for ledger to connect to CouchDB.  The username and password must
      # match the username and password set for the associated CouchDB.
      - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
      - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
      # Allow more time for chaincode container to build on install.
      - CORE_CHAINCODE_EXECUTETIMEOUT=300s
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    hostname: peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}
    volumes:
      - /var/run/:/host/var/run/
      - /home/vbaas/fabric/networks/${NETWORKNAME}/crypto-config/peerOrganizations/${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/peers/peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/msp:/etc/hyperledger/fabric/msp
      - /home/vbaas/fabric/networks/${NETWORKNAME}/crypto-config/peerOrganizations/test.nettest.b.com/peers/peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/tls:/etc/hyperledger/fabric/tls
      - /home/vbaas/fabric/networks/${NETWORKNAME}/mount/peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/var/hyperledger/production:/var/hyperledger/production
    ports:#注意端口不要沖突
      - 1020:1020

    networks:
      fabric-${NETWORKNAME}:
        aliases:
          - peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}

  cli:
    image: hyperledger/fabric-tools:2.1.1
    tty: true
    stdin_open: true
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

    environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      #- FABRIC_LOGGING_SPEC=DEBUG
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}:20
      - CORE_PEER_LOCALMSPID=${ORGNAME}MSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/peers/peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/peers/peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/peers/peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/users/Admin@${ORGNAME}.${NETWORKNAME}.${HOSTNAME}/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: /bin/bash
    volumes:
      - /var/run/:/host/var/run/
      - /home/vbaas/fabric/networks/${NETWORKNAME}/chaincode/:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
      - /home/vbaas/fabric/networks/${NETWORKNAME}/crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
      - /home/vbaas/fabric/networks/${NETWORKNAME}/scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
      - /home/vbaas/fabric/networks/${NETWORKNAME}/channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    networks:
      - fabric-nettest
    depends_on:
      - peer0.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}
      - peer1.${ORGNAME}.${NETWORKNAME}.${HOSTNAME}

stack-couch.yaml

version: '3'

networks:
  fabric-${NETWORKNAME}:
    external: true

services:

  peer0_${ORGNAME}_couchdb:
    hostname: peer0_${ORGNAME}_couchdb
    image: couchdb:2.3
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    environment:
      - COUCHDB_USER=
      - COUCHDB_PASSWORD=
    networks:
      fabric-${NETWORKNAME}:
        aliases:
        - peer0_${ORGNAME}_couchdb

  peer1_${ORGNAME}_couchdb:
    hostname: peer1_${ORGNAME}_couchdb
    image: couchdb:2.3
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

    environment:
      - COUCHDB_USER=
      - COUCHDB_PASSWORD=
    networks:
      fabric-${NETWORKNAME}:
        aliases:
        - peer1_${ORGNAME}_couchdb

stack-etcdraft2.yaml

version: '3'

networks:
  fabric-${NETWORKNAME}:
    external: true

services:
  orderer_${ORGNAME}:
    image: hyperledger/fabric-orderer
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    environment:
      - ORDERER_GENERAL_LISTENPORT=10009
      - FABRIC_LOGGING_SPEC=INFO
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_BOOTSTRAPMETHOD=file
      - ORDERER_GENERAL_BOOTSTRAPFILE=/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_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/fabric
    command: orderer
    hostname: orderer.${HOSTNAME}
    volumes:
      - /home/fabric/networks/${NETWORKNAME}/channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
      - /home/fabric/networks/${NETWORKNAME}/crypto-config/ordererOrganizations/${HOSTNAME}/orderers/orderer.${HOSTNAME}/msp:/var/hyperledger/orderer/msp
      - /home/fabric/networks/${NETWORKNAME}/crypto-config/ordererOrganizations/${HOSTNAME}/orderers/orderer.${HOSTNAME}/tls/:/var/hyperledger/orderer/tls
      - /home/fabric/networks/${NETWORKNAME}/mount/orderer.${HOSTNAME}/var/hyperledger/production:/var/hyperledger/production
    ports:#注意端口不要沖突
      - 10009:10009

    networks:
      fabric-${NETWORKNAME}:
        aliases:
        - orderer.${HOSTNAME}


  orderer2_${ORGNAME}:
    image: hyperledger/fabric-orderer
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    environment:
      - ORDERER_GENERAL_LISTENPORT=11009
      - FABRIC_LOGGING_SPEC=INFO
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_BOOTSTRAPMETHOD=file
      - ORDERER_GENERAL_BOOTSTRAPFILE=/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_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/fabric
    command: orderer

    hostname: orderer2.${HOSTNAME}

    networks:
      fabric-${NETWORKNAME}:
        aliases:
        - orderer2.${HOSTNAME}

    volumes:
      - /home/fabric/networks/${NETWORKNAME}/channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
      - /home/fabric/networks/${NETWORKNAME}/crypto-config/ordererOrganizations/${HOSTNAME}/orderers/orderer2.${HOSTNAME}/msp:/var/hyperledger/orderer/msp
      - /home/fabric/networks/${NETWORKNAME}/crypto-config/ordererOrganizations/${HOSTNAME}/orderers/orderer2.${HOSTNAME}/tls/:/var/hyperledger/orderer/tls
      - /home/fabric/networks/${NETWORKNAME}/mount/orderer2.${HOSTNAME}/var/hyperledger/production:/var/hyperledger/production/orderer
    ports:#注意端口不要沖突
      - 11009:11009

  orderer3_${ORGNAME}:
    image: hyperledger/fabric-orderer
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

    environment:
      - ORDERER_GENERAL_LISTENPORT=12009
      - FABRIC_LOGGING_SPEC=INFO
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_BOOTSTRAPMETHOD=file
      - ORDERER_GENERAL_BOOTSTRAPFILE=/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_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/fabric
    command: orderer
    hostname: orderer3.${HOSTNAME}

    networks:
      fabric-${NETWORKNAME}:
        aliases:
        - orderer3.${HOSTNAME}

    volumes:
      - /home/fabric/networks/${NETWORKNAME}/channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
      - /home/fabric/networks/${NETWORKNAME}/crypto-config/ordererOrganizations/${HOSTNAME}/orderers/orderer3.${HOSTNAME}/msp:/var/hyperledger/orderer/msp
      - /home/fabric/networks/${NETWORKNAME}/crypto-config/ordererOrganizations/${HOSTNAME}/orderers/orderer3.${HOSTNAME}/tls/:/var/hyperledger/orderer/tls
      - /home/fabric/networks/${NETWORKNAME}/mount/orderer3.${HOSTNAME}/var/hyperledger/production:/var/hyperledger/production/orderer
    ports:
#注意端口不要沖突
      - 12009:12009

以上是改造完的yaml模板文件。
配合下面的shell腳本可以進行fabric網絡初始化。

# cat initNetWork-stack.sh 
#!/bin/bash

#接收傳參,ORGNAME參數多個時,請用逗號隔開
NETWORKNAME=$1
ORGNAMES=$2
HOSTNAME=$3
NETWORKPATH=$4

i=0

FILEPATH=${NETWORKPATH}/${NETWORKNAME}
ORGNAMELIST=`echo ${ORGNAMES}|sed -r 's/,/ /g'`

if [ ! -d "${NETWORKPATH}/${NETWORKNAME}" ]; then
    echo "network have no config"
    exit 1
fi
#mkdir -p ${NETWORKPATH}/${NETWORKNAME}/chaincode
#mkdir -p ${NETWORKPATH}/${NETWORKNAME}/scripts
#設置環境變量
echo "==========設置環境變量FABRIC_CFG_PATH:"
export FABRIC_CFG_PATH=${NETWORKPATH}/${NETWORKNAME}/
echo 
echo
cd ${NETWORKPATH}/${NETWORKNAME}/
echo
echo
#證書生成
echo "==========證書生成:"
#cryptogen generate --config=${NETWORKPATH}/${NETWORKNAME}/crypto-config.yaml
echo
echo
#生成創世區塊
echo "=======生成創世區塊:"
#configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ${FILEPATH}/channel-artifacts/genesis.block
echo 
echo 

#根據不同組織啟動
for ORGNAME in ${ORGNAMELIST};
do 
    #配置環境變量,CA節點必需
    echo "===========配置CA節點環境變量:"
    i=$(( i+1 ))

    export BYFN_CA${i}_PRIVATE_KEY=$(cd ${NETWORKPATH}/${NETWORKNAME}/crypto-config/peerOrganizations/${ORGNAME}.${HOSTNAME}/ca && ls *_sk)
    echo 
    echo 
done

#啟動服務
docker network create --driver overlay  fabric-${NETWORKNAME}
echo "==========啟動服務:"
docker stack deploy -c ${FILEPATH}/stack-ca.yaml ${NETWORKNAME}-ca
docker stack deploy -c ${FILEPATH}/stack-cli.yaml ${NETWORKNAME}-cli
docker stack deploy -c ${FILEPATH}/stack-couch.yaml ${NETWORKNAME}-couch
docker stack deploy -c ${FILEPATH}/stack-etcdraft2.yaml ${NETWORKNAME}-etcdraft2

實例化的配置和啟動的fabric網絡:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM