通过docker启动fabric网络
(同样以Ubuntu为例)在此之前确保已经有身份信息文件,如果没有请移步:Fabric生成身份信息文件 - Nichols1205 - 博客园 (cnblogs.com)
0.添加主机端口信息
vim /etc/hosts # 在文件中添加以下内容,根据自己主机的ip修改 10.2.136.116 orderer0.example.com 10.2.136.116 orderer1.example.com 10.2.136.116 orderer2.example.com 10.2.136.116 peer0.org1.example.com 10.2.136.116 peer1.org1.example.com 10.2.136.116 peer0.org2.example.com 10.2.136.116 peer1.org2.example.com
1.创建order节点的docker-compose文件
vim docker-compose-3order.yaml
文件内容如下:
version: '2.0' services: cli: image: hyperledger/fabric-tools:2.5.0 # 修改为自己的版本 restart: always container_name: fabric-cli hostname: fabric-cli tty: true extra_hosts: # 根据自己的hosts修改 - "orderer0.example.com:10.2.136.116" - "orderer1.example.com:10.2.136.116" - "orderer2.example.com:10.2.136.116" - "peer0.org1.example.com:10.2.136.116" - "peer1.org1.example.com:10.2.136.116" - "peer0.org2.example.com:10.2.136.116" - "peer1.org2.example.com:10.2.136.116" environment: - CORE_PEER_ID=fabric-cli - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 # default to operate on peer0.org1 - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp - FABRIC_LOGGING_SPEC=DEBUG - FABRIC_LOGGING_FORMAT=%{color}[%{id:03x} %{time:01-02 15:04:05.00 MST}] [%{module}] %{shortfunc} -> %{level:.4s}%{color:reset} %{message} - CORE_PEER_TLS_ENABLED=true # to enable TLS, change to true - ORDERER_CA=/etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem volumes: - ../config/crypto-config.yaml:/etc/hyperledger/fabric/crypto-config.yaml # 挂载的目录 :前的修改为自己文件所在位置 - ../config/configtx.yaml:/etc/hyperledger/fabric/configtx.yaml - ../crypto-config:/etc/hyperledger/fabric/crypto-config - ../channel-artifacts:/tmp/channel-artifacts - ../chaincodes:/etc/hyperledger/fabric/chaincodes working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer command: bash -c 'cd /tmp; source scripts/func.sh; while true; do sleep 20170504; done' orderer0.example.com: # There can be multiple orderers image: hyperledger/fabric-orderer:2.5.0 restart: always container_name: orderer0.example.com hostname: orderer0.example.com ports: # 不同主机端口可以相同,本例为同一个虚拟机,通过不同端口映射实现 - "7050:7050" extra_hosts: - "orderer0.example.com:10.2.136.116" - "orderer1.example.com:10.2.136.116" - "orderer2.example.com:10.2.136.116" - "peer0.org1.example.com:10.2.136.116" - "peer1.org1.example.com:10.2.136.116" - "peer0.org2.example.com:10.2.136.116" - "peer1.org2.example.com:10.2.136.116" environment: - FABRIC_LOGGING_FORMAT="%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}" - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 # default: 127.0.0.1 - ORDERER_GENERAL_LISTENPORT=7050 - ORDERER_GENERAL_GENESISMETHOD=file # default: provisional - ORDERER_GENERAL_BOOTSTRAPFILE=/etc/hyperledger/fabric/channel-artifacts/orderer.genesis.block # by default, all materials should be put under $FABRIC_CFG_PATH, which defaults to /etc/hyperledger/fabric - ORDERER_GENERAL_LOCALMSPID=OrdererMSP # default: DEFAULT - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/fabric/msp - ORDERER_GENERAL_LEDGERTYPE=file #- ORDERER_GENERAL_LEDGERTYPE=json # default: file - ORDERER_OPERATIONS_LISTENADDRESS=0.0.0.0:8443 # operation RESTful API - ORDERER_METRICS_PROVIDER=prometheus # prometheus will pull metrics from orderer via /metrics RESTful API #- ORDERER_RAMLEDGER_HISTORY_SIZE=100 #only useful when use ram ledger # enabled TLS - ORDERER_GENERAL_TLS_ENABLED=true # default: false - ORDERER_GENERAL_TLS_PRIVATEKEY=/etc/hyperledger/fabric/tls/server.key - ORDERER_GENERAL_TLS_CERTIFICATE=/etc/hyperledger/fabric/tls/server.crt - ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/fabric/tls/ca.crt] # Only required by raft mode - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/etc/hyperledger/fabric/tls/server.key - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/etc/hyperledger/fabric/tls/server.crt - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/etc/hyperledger/fabric/tls/ca.crt] - FABRIC_LOGGING_SPEC=DEBUG volumes: - ../crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp:/etc/hyperledger/fabric/msp - ../crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/:/etc/hyperledger/fabric/tls - ../channel-artifacts:/etc/hyperledger/fabric/channel-artifacts expose: - "7050" # gRPC - "8443" # Operation REST command: orderer start orderer1.example.com: image: hyperledger/fabric-orderer:2.5.0 restart: always container_name: orderer1.example.com hostname: orderer1.example.com ports: - "8050:7050" extra_hosts: - "orderer0.example.com:10.2.136.116" - "orderer1.example.com:10.2.136.116" - "orderer2.example.com:10.2.136.116" - "peer0.org1.example.com:10.2.136.116" - "peer1.org1.example.com:10.2.136.116" - "peer0.org2.example.com:10.2.136.116" - "peer1.org2.example.com:10.2.136.116" environment: - FABRIC_LOGGING_SPEC=DEBUG - FABRIC_LOGGING_FORMAT="%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}" - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 # default: 127.0.0.1 - ORDERER_GENERAL_LISTENPORT=7050 - ORDERER_GENERAL_GENESISMETHOD=file # default: provisional - ORDERER_GENERAL_BOOTSTRAPFILE=/etc/hyperledger/fabric/channel-artifacts/orderer.genesis.block # by default, all materials should be put under $FABRIC_CFG_PATH, which defaults to /etc/hyperledger/fabric - ORDERER_GENERAL_LOCALMSPID=OrdererMSP # default: DEFAULT - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/fabric/msp - ORDERER_GENERAL_LEDGERTYPE=file #- ORDERER_GENERAL_LEDGERTYPE=json # default: file - ORDERER_OPERATIONS_LISTENADDRESS=0.0.0.0:8443 # operation RESTful API - ORDERER_METRICS_PROVIDER=prometheus # prometheus will pull metrics from orderer via /metrics RESTful API #- ORDERER_RAMLEDGER_HISTORY_SIZE=100 #only useful when use ram ledger # enabled TLS - ORDERER_GENERAL_TLS_ENABLED=true # default: false - ORDERER_GENERAL_TLS_PRIVATEKEY=/etc/hyperledger/fabric/tls/server.key - ORDERER_GENERAL_TLS_CERTIFICATE=/etc/hyperledger/fabric/tls/server.crt - ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/fabric/tls/ca.crt] # Only required by raft mode - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/etc/hyperledger/fabric/tls/server.key - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/etc/hyperledger/fabric/tls/server.crt - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/etc/hyperledger/fabric/tls/ca.crt] - ORDERER_GENERAL_CLUSTER_SENDBUFFERSIZE=10 volumes: - ../crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/msp:/etc/hyperledger/fabric/msp - ../crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/tls/:/etc/hyperledger/fabric/tls - ../channel-artifacts:/etc/hyperledger/fabric/channel-artifacts command: orderer start orderer2.example.com: image: hyperledger/fabric-orderer:2.5.0 # 改为自己的版本 restart: always container_name: orderer2.example.com hostname: orderer2.example.com ports: - "9050:7050" extra_hosts: # 根据自己的host修改 - "orderer0.example.com:10.2.136.116" - "orderer1.example.com:10.2.136.116" - "orderer2.example.com:10.2.136.116" - "peer0.org1.example.com:10.2.136.116" - "peer1.org1.example.com:10.2.136.116" - "peer0.org2.example.com:10.2.136.116" - "peer1.org2.example.com:10.2.136.116" environment: - FABRIC_LOGGING_SPEC=DEBUG # default: INFO - FABRIC_LOGGING_FORMAT="%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}" - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 # default: 127.0.0.1 - ORDERER_GENERAL_LISTENPORT=7050 - ORDERER_GENERAL_GENESISMETHOD=file # default: provisional - ORDERER_GENERAL_BOOTSTRAPFILE=/etc/hyperledger/fabric/channel-artifacts/orderer.genesis.block # by default, all materials should be put under $FABRIC_CFG_PATH, which defaults to /etc/hyperledger/fabric - ORDERER_GENERAL_LOCALMSPID=OrdererMSP # default: DEFAULT - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/fabric/msp - ORDERER_GENERAL_LEDGERTYPE=file #- ORDERER_GENERAL_LEDGERTYPE=json # default: file - ORDERER_OPERATIONS_LISTENADDRESS=0.0.0.0:8443 # operation RESTful API - ORDERER_METRICS_PROVIDER=prometheus # prometheus will pull metrics from orderer via /metrics RESTful API #- ORDERER_RAMLEDGER_HISTORY_SIZE=100 #only useful when use ram ledger # enabled TLS - ORDERER_GENERAL_TLS_ENABLED=true # default: false - ORDERER_GENERAL_TLS_PRIVATEKEY=/etc/hyperledger/fabric/tls/server.key - ORDERER_GENERAL_TLS_CERTIFICATE=/etc/hyperledger/fabric/tls/server.crt - ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/fabric/tls/ca.crt] # Only required by raft mode - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/etc/hyperledger/fabric/tls/server.key - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/etc/hyperledger/fabric/tls/server.crt - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/etc/hyperledger/fabric/tls/ca.crt] - ORDERER_GENERAL_CLUSTER_SENDBUFFERSIZE=10 volumes: - ../crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/msp:/etc/hyperledger/fabric/msp # 挂载目录 :前的文件路径更改为自己对应的文件目录 - ../crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/:/etc/hyperledger/fabric/tls - ../channel-artifacts:/etc/hyperledger/fabric/channel-artifacts command: orderer start
修改完成后启动order节点:
docker-compose -f docker-compose-3order.yaml up -d
停止命令(关闭fabric的docker镜像时使用):
docker-compose -f docker-compose-3order.yaml down
但此时还没有正式运行,因为peer节点还没有启动。
2.创建org1的peer节点的docker-compose文件
vim docker-compose-org1-2peer.yaml
文件内容如下:
version: '2.0' services: peer0.org1.example.com: image: hyperledger/fabric-peer:2.5.0 # 修改方式通order的yaml文件 restart: always container_name: peer0.org1.example.com hostname: peer0.org1.example.com ports: - 7051:7051 - 7052:7052 - 9443:9443 extra_hosts: - "orderer0.example.com:10.2.136.116" - "orderer1.example.com:10.2.136.116" - "orderer2.example.com:10.2.136.116" - "peer0.org1.example.com:10.2.136.116" - "peer1.org1.example.com:10.2.136.116" - "peer0.org2.example.com:10.2.136.116" - "peer1.org2.example.com:10.2.136.116" environment: - FABRIC_LOGGING_SPEC=INFO - FABRIC_LOGGING_FORMAT="%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}" - CORE_PEER_ADDRESSAUTODETECT=false - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=host # uncomment this to use specific network - CORE_PEER_GOSSIP_USELEADERELECTION=true - CORE_PEER_GOSSIP_ORGLEADER=false # whether this node is the org leader, default to false - CORE_OPERATIONS_LISTENADDRESS=0.0.0.0:9443 # operation RESTful API - CORE_METRICS_PROVIDER=prometheus # prometheus will pull metrics from fabric via /metrics RESTful API - CORE_PEER_PROFILE_ENABLED=false - CORE_PEER_TLS_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_CHAINCODE_BUILDER=hyperledger/fabric-ccenv:2.5.0 - CORE_CHAINCODE_GOLANG_RUNTIME=hyperledger/fabric-baseos:2.5.0 - CORE_CHAINCODE_JAVA_RUNTIME=hyperledger/fabric-javaenv:2.4 - CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.4 - CORE_PEER_ID=peer0.org1.example.com - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 - CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051 - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051 - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/msp - FABRIC_LOGGING_SPEC=DEBUG # info:core.chaincode=debug - CORE_LEDGER_STATE_STATEDATABASE=CouchDB - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=peer0.org1.couchdb:5984 - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpw volumes: - /var/run/docker.sock:/var/run/docker.sock - ../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 expose: - "7051" # gRPC - "11052" # chaincode - "9443" # Operation REST #command: bash -c 'bash /tmp/peer_build.sh; peer node start' command: peer node start depends_on: #- orderer.example.com - peer0.org1.couchdb peer1.org1.example.com: image: hyperledger/fabric-peer:2.5.0 restart: always container_name: peer1.org1.example.com hostname: peer1.org1.example.com ports: - 8051:7051 - 8052:7052 - 9444:9443 extra_hosts: - "orderer0.example.com:10.2.136.116" - "orderer1.example.com:10.2.136.116" - "orderer2.example.com:10.2.136.116" - "peer0.org1.example.com:10.2.136.116" - "peer1.org1.example.com:10.2.136.116" - "peer0.org2.example.com:10.2.136.116" - "peer1.org2.example.com:10.2.136.116" environment: - FABRIC_LOGGING_SPEC=INFO - FABRIC_LOGGING_FORMAT="%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}" - CORE_PEER_ADDRESSAUTODETECT=false - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=host # uncomment this to use specific network - CORE_PEER_GOSSIP_USELEADERELECTION=true - CORE_PEER_GOSSIP_ORGLEADER=false # whether this node is the org leader, default to false - CORE_OPERATIONS_LISTENADDRESS=0.0.0.0:9443 # operation RESTful API - CORE_METRICS_PROVIDER=prometheus # prometheus will pull metrics from fabric via /metrics RESTful API - CORE_PEER_PROFILE_ENABLED=false - CORE_PEER_TLS_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_CHAINCODE_BUILDER=hyperledger/fabric-ccenv:2.5.0 - CORE_CHAINCODE_GOLANG_RUNTIME=hyperledger/fabric-baseos:2.5.0 - CORE_CHAINCODE_JAVA_RUNTIME=hyperledger/fabric-javaenv:2.4 - CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.4 - CORE_PEER_ID=peer1.org1.example.com - CORE_PEER_ADDRESS=peer1.org1.example.com:8051 - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 - CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:8052 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:8051 - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:8051 - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/msp - FABRIC_LOGGING_SPEC=DEBUG # info:core.chaincode=debug - CORE_LEDGER_STATE_STATEDATABASE=CouchDB - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=peer1.org1.couchdb:5984 - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpw volumes: - /var/run/docker.sock:/var/run/docker.sock - ../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 expose: - "8051" # gRPC - "8052" # chaincode - "9444" # Operation REST #command: bash -c 'bash /tmp/peer_build.sh; peer node start' command: peer node start depends_on: #- orderer.example.com - peer1.org1.couchdb peer0.org1.couchdb: image: couchdb:3.2.2 container_name: peer0.org1.couchdb ports: - 5984:5984 # this is the restful API addr, can also access fauxton web ui thru http://localhost:5984/_utils/ environment: - COUCHDB_USER=admin - COUCHDB_PASSWORD=adminpw peer1.org1.couchdb: image: couchdb:3.2.2 container_name: peer1.org1.couchdb ports: - 6984:5984 # this is the restful API addr, can also access fauxton web ui thru http://localhost:5984/_utils/ environment: - COUCHDB_USER=admin - COUCHDB_PASSWORD=adminpw
修改完成后启动org1的peer节点:
docker-compose -f docker-compose-org1-2peer.yaml up -d
3.创建并启动org2的peer节点的docker-compose文件
vim docker-compose-org2-2peer.yaml
文件内容如下(修改方式同order的yaml文件):
version: '2.0' services: peer0.org2.example.com: image: hyperledger/fabric-peer:2.5.0 restart: always container_name: peer0.org2.example.com hostname: peer0.org2.example.com ports: - 9051:7051 - 9052:7052 - 9445:9443 extra_hosts: - "orderer0.example.com:10.2.136.116" - "orderer1.example.com:10.2.136.116" - "orderer2.example.com:10.2.136.116" - "peer0.org1.example.com:10.2.136.116" - "peer1.org1.example.com:10.2.136.116" - "peer0.org2.example.com:10.2.136.116" - "peer1.org2.example.com:10.2.136.116" environment: - FABRIC_LOGGING_SPEC=INFO - FABRIC_LOGGING_FORMAT="%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}" - CORE_PEER_ADDRESSAUTODETECT=false - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=host # uncomment this to use specific network - CORE_PEER_GOSSIP_USELEADERELECTION=true - CORE_PEER_GOSSIP_ORGLEADER=false # whether this node is the org leader, default to false - CORE_OPERATIONS_LISTENADDRESS=0.0.0.0:9443 # operation RESTful API - CORE_METRICS_PROVIDER=prometheus # prometheus will pull metrics from fabric via /metrics RESTful API - CORE_PEER_PROFILE_ENABLED=false - CORE_PEER_TLS_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_CHAINCODE_BUILDER=hyperledger/fabric-ccenv:2.5.0 - CORE_CHAINCODE_GOLANG_RUNTIME=hyperledger/fabric-baseos:2.5.0 - CORE_CHAINCODE_JAVA_RUNTIME=hyperledger/fabric-javaenv:2.4 - CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.4 - CORE_PEER_ID=peer0.org2.example.com - CORE_PEER_ADDRESS=peer0.org2.example.com:9051 - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 - CORE_PEER_CHAINCODEADDRESS=peer0.org2.example.com:9052 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:9051 - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:9051 - CORE_PEER_LOCALMSPID=Org2MSP - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/msp - FABRIC_LOGGING_SPEC=DEBUG # info:core.chaincode=debug - CORE_LEDGER_STATE_STATEDATABASE=CouchDB - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=peer0.org2.couchdb:5984 - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpw volumes: - /var/run/docker.sock:/var/run/docker.sock - ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp - ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls expose: - "9051" # gRPC - "9052" - "9445" # Operation REST #command: bash -c 'bash /tmp/peer_build.sh; peer node start' command: peer node start depends_on: #- orderer.example.com - peer0.org2.couchdb peer1.org2.example.com: image: hyperledger/fabric-peer:2.5.0 restart: always container_name: peer1.org2.example.com hostname: peer1.org2.example.com ports: - 10051:7051 - 10052:7052 - 9446:9443 extra_hosts: - "orderer0.example.com:10.2.136.116" - "orderer1.example.com:10.2.136.116" - "orderer2.example.com:10.2.136.116" - "peer0.org1.example.com:10.2.136.116" - "peer1.org1.example.com:10.2.136.116" - "peer0.org2.example.com:10.2.136.116" - "peer1.org2.example.com:10.2.136.116" environment: - FABRIC_LOGGING_SPEC=INFO - FABRIC_LOGGING_FORMAT="%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}" - CORE_PEER_ADDRESSAUTODETECT=false - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=host # uncomment this to use specific network - CORE_PEER_GOSSIP_USELEADERELECTION=true - CORE_PEER_GOSSIP_ORGLEADER=false # whether this node is the org leader, default to false - CORE_OPERATIONS_LISTENADDRESS=0.0.0.0:9443 # operation RESTful API - CORE_METRICS_PROVIDER=prometheus # prometheus will pull metrics from fabric via /metrics RESTful API - CORE_PEER_PROFILE_ENABLED=false - CORE_PEER_TLS_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_CHAINCODE_BUILDER=hyperledger/fabric-ccenv:2.5.0 - CORE_CHAINCODE_GOLANG_RUNTIME=hyperledger/fabric-baseos:2.5.0 - CORE_CHAINCODE_JAVA_RUNTIME=hyperledger/fabric-javaenv:2.4 - CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.4 - CORE_PEER_ID=peer1.org2.example.com - CORE_PEER_ADDRESS=peer1.org2.example.com:10051 - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 - CORE_PEER_CHAINCODEADDRESS=peer1.org2.example.com:10052 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:10051 - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:10051 - CORE_PEER_LOCALMSPID=Org2MSP - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/msp - FABRIC_LOGGING_SPEC=DEBUG # info:core.chaincode=debug - CORE_LEDGER_STATE_STATEDATABASE=CouchDB - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=peer1.org2.couchdb:5984 - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpw volumes: - /var/run/docker.sock:/var/run/docker.sock - ../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 expose: - "10051" # gRPC - "10052" - "9446" # Operation REST #command: bash -c 'bash /tmp/peer_build.sh; peer node start' command: peer node start depends_on: #- orderer.example.com - peer1.org2.couchdb peer0.org2.couchdb: image: couchdb:3.2.2 container_name: peer0.org2.couchdb ports: - 7984:5984 # this is the restful API addr, can also access fauxton web ui thru http://localhost:5984/_utils/ environment: - COUCHDB_USER=admin - COUCHDB_PASSWORD=adminpw peer1.org2.couchdb: image: couchdb:3.2.2 container_name: peer1.org2.couchdb ports: - 8984:5984 # this is the restful API addr, can also access fauxton web ui thru http://localhost:5984/_utils/ environment: - COUCHDB_USER=admin - COUCHDB_PASSWORD=adminpw
修改完成后启动org2的peer节点:
docker-compose -f docker-compose-org2-2peer.yaml up -d
4.创建通道
进入cli容器:
docker exec -it fabric-cli bash
export APP_CHANNEL=businesschannel export TIMEOUT=30 export CORE_PEER_LOCALMSPID=Org1MSP export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp peer channel create -o orderer0.example.com:7050 -c ${APP_CHANNEL} -f "/tmp/channel-artifacts/$APP_CHANNEL.tx" --timeout "${TIMEOUT}s" --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
创建成功后会在当前路径下生成 businesschannel.block 文件,移动到特定路径:
mv businesschannel.block /tmp/channel-artifacts/
5.加入通道(注意每个节点的端口)
同样在cli容器中:
org1-peer0加入通道:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer0.org1.example.com:7051 # 注意,以下不提示 peer channel join -b /tmp/channel-artifacts/businesschannel.block
结果如下:
[020 02-18 03:57:28.30 UTC] [channelCmd] executeJoin -> INFO Successfully submitted proposal to join channel
org1-peer1加入通道:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer1.org1.example.com:8051 peer channel join -b /tmp/channel-artifacts/businesschannel.block
org2-peer0加入通道:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer0.org2.example.com:9051 peer channel join -b /tmp/channel-artifacts/businesschannel.block
org2-peer1加入通道:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer1.org2.example.com:10051 peer channel join -b /tmp/channel-artifacts/businesschannel.block
6.更新锚节点
org1更新锚节点:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer0.org1.example.com:7051 # 注意 peer channel update -o orderer0.example.com:7050 -c businesschannel -f /tmp/channel-artifacts/Org1MSPanchors.tx --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
org2更新锚节点:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer0.org2.example.com:9051 peer channel update -o orderer0.example.com:7050 -c businesschannel -f /tmp/channel-artifacts/Org2MSPanchors.tx --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
锚节点配置更新后,同一通道内不同组织之间的 Peer 也可以进行 Gossip 通信,共同维护通道账本。后续,用户可以通过智能合约使用通道账本。
安装链码放在后续,或者可以去参考链接学习。
文章参考链接:Hyperledger Fabric Docker 方式多机部署生产网络 - DevX的个人空间 - OSCHINA - 中文开源技术交流社区

浙公网安备 33010602011771号