docker搭建fabric

前置准备

修改/etc/hosts文件的域名映射

vim /etc/hosts

# 新增

192.168.2.130 orderer0.example.com
192.168.2.130 orderer1.example.com
192.168.2.130 orderer2.example.com

192.168.2.130 peer0.org1.example.com
192.168.2.130 peer1.org1.example.com

192.168.2.130 peer0.org2.example.com
192.168.2.130 peer1.org2.example.com

把order以及peer的各个证书通道生成完毕,如果没有生成各个证书通道文件,可以去看下面的这篇文章
生成通道以及证书文件

编写docker-compose-3orderer.yaml

  1. 进入根目录
mkdir docker
mkdir chaincodes
cd docker
vim docker-compose-3orderer.yaml


version: '2.0'

services:

    cli:
        image: hyperledger/fabric-tools:2.4.1
        restart: always
        container_name: fabric-cli
        hostname: fabric-cli
        tty: true
        extra_hosts:
            - "orderer0.example.com:192.168.2.130"
            - "orderer1.example.com:192.168.2.130"
            - "orderer2.example.com:192.168.2.130"
            - "peer0.org1.example.com:192.168.2.130"
            - "peer1.org1.example.com:192.168.2.130"
            - "peer0.org2.example.com:192.168.2.130"
            - "peer1.org2.example.com:192.168.2.130"
        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:
            - ../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.4.1
        restart: always
        container_name: orderer0.example.com
        hostname: orderer0.example.com
        ports:
            - "7050:7050"
        extra_hosts:
            - "orderer0.example.com:192.168.2.130"
            - "orderer1.example.com:192.168.2.130"
            - "orderer2.example.com:192.168.2.130"
            - "peer0.org1.example.com:192.168.2.130"
            - "peer1.org1.example.com:192.168.2.130"
            - "peer0.org2.example.com:192.168.2.130"
            - "peer1.org2.example.com:192.168.2.130"
        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/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/orderer.genesis.block:/etc/hyperledger/fabric/orderer.genesis.block
        expose:
            - "7050"  # gRPC
            - "8443"  # Operation REST
        command: orderer start

    orderer1.example.com:
        image: hyperledger/fabric-orderer:2.4.1
        restart: always
        container_name: orderer1.example.com
        hostname: orderer1.example.com
        ports:
            - "8050:7050"
        extra_hosts:
            - "orderer0.example.com:192.168.2.130"
            - "orderer1.example.com:192.168.2.130"
            - "orderer2.example.com:192.168.2.130"
            - "peer0.org1.example.com:192.168.2.130"
            - "peer1.org1.example.com:192.168.2.130"
            - "peer0.org2.example.com:192.168.2.130"
            - "peer1.org2.example.com:192.168.2.130"
        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/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/orderer.genesis.block:/etc/hyperledger/fabric/orderer.genesis.block
        command: orderer start    


    orderer2.example.com:
        image: hyperledger/fabric-orderer:2.4.1
        restart: always
        container_name: orderer2.example.com
        hostname: orderer2.example.com
        ports:
            - "9050:7050"
        extra_hosts:
            - "orderer0.example.com:192.168.2.130"
            - "orderer1.example.com:192.168.2.130"
            - "orderer2.example.com:192.168.2.130"
            - "peer0.org1.example.com:192.168.2.130"
            - "peer1.org1.example.com:192.168.2.130"
            - "peer0.org2.example.com:192.168.2.130"
            - "peer1.org2.example.com:192.168.2.130"
        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/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/orderer.genesis.block:/etc/hyperledger/fabric/orderer.genesis.block
        command: orderer start
  1. 启动配置文件

    docker-compose -f docker-compose-3orderer.yaml up -d
    

    如果想停止并且删除服务:

    docker-compose -f docker-compose-3orderer.yaml down
    

    ps:想要在图形化界面中进行访问需要安装portainer.io

    安装命令:

    docker pull portainer/portainer
    docker run -d -p 9000:9000 -v /root/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer
    

编写docker-compose-org1-2peer-couchdb.yaml

  1. 进入到docker目录下

  2. 编写docker-compose-org1-2peer-couchdb.yaml文件

version: '2.0'
    
services:
       peer0.org1.example.com:
           image: hyperledger/fabric-peer:2.4.1
           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:192.168.2.130"
               - "orderer1.example.com:192.168.2.130"
               - "orderer2.example.com:192.168.2.130"
               - "peer0.org1.example.com:192.168.2.130"
               - "peer1.org1.example.com:192.168.2.130"
               - "peer0.org2.example.com:192.168.2.130"
               - "peer1.org2.example.com:192.168.2.130"
           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.4.1
               - CORE_CHAINCODE_GOLANG_RUNTIME=hyperledger/fabric-baseos:2.4.1
               - CORE_CHAINCODE_JAVA_RUNTIME=hyperledger/fabric-javaenv:2.4.1
               - CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.4.1
               - 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
               - 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
               - "9443"  # Operation REST
           #command: bash -c 'bash /tmp/peer_build.sh; peer node start'
           command: peer node start
           depends_on:
               - peer0.org1.couchdb
    
    
       peer1.org1.example.com:
           image: hyperledger/fabric-peer:2.4.1
           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:192.168.2.130"
               - "orderer1.example.com:192.168.2.130"
               - "orderer2.example.com:192.168.2.130"
               - "peer0.org1.example.com:192.168.2.130"
               - "peer1.org1.example.com:192.168.2.130"
               - "peer0.org2.example.com:192.168.2.130"
               - "peer1.org2.example.com:192.168.2.130"
           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.4.1
               - CORE_CHAINCODE_GOLANG_RUNTIME=hyperledger/fabric-baseos:2.4.1
               - CORE_CHAINCODE_JAVA_RUNTIME=hyperledger/fabric-javaenv:2.4.1
               - CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.4.1
               - 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
               - 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:
               - peer1.org1.couchdb
    
       
                       
       peer0.org1.couchdb:
           image: couchdb:3.1.1
           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.1.1
           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
  1. 启动配置文件

    docker-compose -f docker-compose-org1-2peer-couchdb.yaml up -d
    

编写docker-compose-org2-2peer-couchdb.yaml

  1. 进入docker目录

  2. 编辑docker-compose-org2-2peer-couchdb.yaml

version: '2.0'

services:

   peer0.org2.example.com:
       image: hyperledger/fabric-peer:2.4.1
       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:192.168.2.130"
           - "orderer1.example.com:192.168.2.130"
           - "orderer2.example.com:192.168.2.130"
           - "peer0.org1.example.com:192.168.2.130"
           - "peer1.org1.example.com:192.168.2.130"
           - "peer0.org2.example.com:192.168.2.130"
           - "peer1.org2.example.com:192.168.2.130"
       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.4.1
           - CORE_CHAINCODE_GOLANG_RUNTIME=hyperledger/fabric-baseos:2.4.1
           - CORE_CHAINCODE_JAVA_RUNTIME=hyperledger/fabric-javaenv:2.4.1
           - CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.4.1
           - 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
           - 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/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
           - "9445"  # Operation REST
       #command: bash -c 'bash /tmp/peer_build.sh; peer node start'
       command: peer node start
       depends_on:
           - peer0.org1.couchdb


   peer1.org2.example.com:
       image: hyperledger/fabric-peer:2.4.1
       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:192.168.2.130"
           - "orderer1.example.com:192.168.2.130"
           - "orderer2.example.com:192.168.2.130"
           - "peer0.org1.example.com:192.168.2.130"
           - "peer1.org1.example.com:192.168.2.130"
           - "peer0.org2.example.com:192.168.2.130"
           - "peer1.org2.example.com:192.168.2.130"
       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.4.1
           - CORE_CHAINCODE_GOLANG_RUNTIME=hyperledger/fabric-baseos:2.4.1
           - CORE_CHAINCODE_JAVA_RUNTIME=hyperledger/fabric-javaenv:2.4.1
           - CORE_CHAINCODE_NODE_RUNTIME=hyperledger/fabric-nodeenv:2.4.1
           - 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
           - 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
           - "9446"  # Operation REST
       #command: bash -c 'bash /tmp/peer_build.sh; peer node start'
       command: peer node start
       depends_on:
           - peer1.org2.couchdb


   peer0.org1.couchdb:
       image: couchdb:3.1.1
       container_name: peer0.org1.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.1.1
       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
  1. 启动配置文件

    docker-compose -f docker-compose-org2-2peer-couchdb.yaml up -d
    

  2. 登录进去docker 容器中

    docker exec -it fabric-cli bash
    

加入通道

  1. 创建通道,登录进docker容器之中

  2. 创建成功之后会生成businesschannel.block文件

    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
    

  3. 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
    
    

  4. 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
    

  5. 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
    

  6. 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
    

更新锚节点

  1. 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
    
    

  2. 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 通信,共同维护通道账本。后续,用户可以通过智能合约使用通道账本。

安装链码

  1. 进入cli容器

    docker exec -it fabric-cli bash
    

  2. 把链码上传到chaincodes目录中,对应的挂载目录为/etc/hyperledger/fabric/chaincodes/,将chaincode.jar以及META-INF和collections_config.json放到新建的hyperledger-fabric-contract-java-demo目录中

  3. 打包链码

    peer lifecycle chaincode package hyperledger-fabric-contract-java-demo.tar.gz --path /etc/hyperledger/fabric/chaincodes/hyperledger-fabric-contract-java-demo/ --lang java --label hyperledger-fabric-contract-java-demo_1
    
    

  4. 在各个peer上安装链码

    cd /etc/hyperledger/fabric/chaincodes/
    

    这一步可以省略,只要保证在docker容器中的这个目录下即可

    cd /opt/gopath/src/github.com/hyperledger/fabric/peer
    
    

  5. 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 lifecycle chaincode install hyperledger-fabric-contract-java-demo.tar.gz
    
    

    结果如下

    [020 02-18 03:26:06.78 UTC] [cli.lifecycle.chaincode] submitInstallProposal -> INFO Installed remotely: response:<status:200 payload:"\nhhyperledger-fabric-contract-java-demo_1:bbc6a881b7cf349cd608a608d32e638b546341575e48614524761ab51fc6a457\022'hyperledger-fabric-contract-java-demo_1" > 
    
    [021 02-18 03:26:06.78 UTC] [cli.lifecycle.chaincode] submitInstallProposal -> INFO Chaincode code package identifier: hyperledger-fabric-contract-java-demo_1:bbc6a881b7cf349cd608a608d32e638b546341575e48614524761ab51fc6a457
    
    

  6. 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 lifecycle chaincode install hyperledger-fabric-contract-java-demo.tar.gz
    
    

  7. 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 lifecycle chaincode install hyperledger-fabric-contract-java-demo.tar.gz
    
    

  8. 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/peer1.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 lifecycle chaincode install hyperledger-fabric-contract-java-demo.tar.gz
    
    

  9. 查询包ID

    peer lifecycle chaincode queryinstalled
    

  10. 包 ID 是链码标签和链码二进制文件的哈希值的组合。每个 peer 节点将生成相同的包 ID。你应该看到类似于以下内容的输出:

    Installed chaincodes on peer:
    Package ID: hyperledger-fabric-contract-java-demo_1:bbc6a881b7cf349cd608a608d32e638b546341575e48614524761ab51fc6a457, Label: hyperledger-fabric-contract-java-demo_1
    
    

  11. 将包ID保存为环境变量

    export CC_PACKAGE_ID=hyperledger-fabric-contract-java-demo_1:bbc6a881b7cf349cd608a608d32e638b546341575e48614524761ab51fc6a457
    
    

批准链码定义

  1. 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 lifecycle chaincode approveformyorg -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID businesschannel --name hyperledger-fabric-contract-java-demo --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    

    结果如下:

    [025 02-18 05:37:12.44 UTC] [chaincodeCmd] ClientWait -> INFO txid [895c0d4b9eee30419e068072b816906f660c1f9ddb7400b63d6892a001470c38] committed with status (VALID) at peer0.org1.example.com:7051
    
    

  2. 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 lifecycle chaincode approveformyorg -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID businesschannel --name hyperledger-fabric-contract-java-demo --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    

  3. 检查通道成员是否已批准相同的链码定义:

    peer lifecycle chaincode checkcommitreadiness --channelID businesschannel --name hyperledger-fabric-contract-java-demo --version 1.0 --sequence 1 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
    
    

    输出结果如下:

    {
    	"approvals": {
    		"Org1MSP": true,
    		"Org2MSP": true
    	}
    }
    

  4. 将链码提交到通道

    peer lifecycle chaincode commit -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID businesschannel --name hyperledger-fabric-contract-java-demo --version 1.0 --sequence 1 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
    
    

    结果如下

    [029 02-18 05:50:47.62 UTC] [chaincodeCmd] ClientWait -> INFO txid [2c06365cd94ebcc95e4fc6e5a5334aafda35e874bf894ef604fd3a9fe18d86be] committed with status (VALID) at peer0.org2.example.com:7051
    [02a 02-18 05:50:47.81 UTC] [chaincodeCmd] ClientWait -> INFO txid [2c06365cd94ebcc95e4fc6e5a5334aafda35e874bf894ef604fd3a9fe18d86be] committed with status (VALID) at peer0.org1.example.com:7051
    
    

    peer lifecycle chaincode querycommitted 命令来确认链码定义已提交给通道:

    peer lifecycle chaincode querycommitted --channelID businesschannel --name hyperledger-fabric-contract-java-demo --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    

    结果如下:

    Committed chaincode definition for chaincode 'hyperledger-fabric-contract-java-demo' on channel 'businesschannel':
    Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]
    
    

调用链码

# 调用 createCat 函数
peer chaincode invoke -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C businesschannel -n hyperledger-fabric-contract-java-demo --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"createCat","Args":["cat-0" , "tom" ,  "3" , "蓝色" , "大懒猫"]}'

# 调用 queryCat 函数
peer chaincode query -C businesschannel -n hyperledger-fabric-contract-java-demo -c '{"Args":["queryCat" , "cat-0"]}'

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
fabric-explorer的docker镜像可通过以下步骤安装和运行: 1. 首先,打开终端或命令提示符,并在浏览器中输入网址http://localhost:8080,以登录监视浏览器。 2. 接下来,在终端或命令提示符中输入以下命令来启动fabric-explorer的docker容器: ```shell echo "=========== Explorer start Installing ==============" # remove docker container docker rm -f explorer.mynetwork.com docker rm -f explorerdb.mynetwork.com # remove docker volumes docker volume rm artifacts_walletstore docker volume rm artifacts_pgdata # start up the docker container docker-compose up -d echo "=========== Explorer Successfully installed ==============" ``` 3. 之后,进入fabric-explorer的目录,并将fabric网络的crypto-config文件夹复制到该目录下。然后执行以下命令: ```shell cd fabric-explorer cp -R /path/to/crypto-config . touch docker-compose.yaml touch config.json touch connection-profile/test-network.json ``` 4. 最后,在终端或命令提示符中执行以下命令来启动fabric-explorer的docker容器: ```shell docker-compose up -d ``` 这样,fabric-explorer的docker镜像就成功安装并运行了。你可以通过访问http://localhost:8080来访问fabric-explorer,并使用以下登录凭据进行登录: - 用户名:admin - 密码:adminpw 请注意,上述的路径都是相对于docker容器的绝对路径,而不是容器外的路径。你需要根据自己的网络配置进行相应的调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Fabric-explorer 搭建](https://blog.csdn.net/weixin_41946008/article/details/124609204)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [fabric-explorer快速搭建(dockercompose)](https://blog.csdn.net/qq_21553301/article/details/116948043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱写代码的大狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值