9.4 启动Fabric网络

启动Fabric网络是一个比较复杂的过程,主要步骤包括计划拓扑、准备相关配置文件、启动Orderer节点、启动Peer节点和操作网络等。这里以Fabric代码中自带的示例为基础讲解相关的操作步骤。

9.4.1 网络拓扑

启动的Fabric网络中包括一个Orderer节点和四个Peer节点,以及一个管理节点生成相关启动文件,在网络启动后作为操作客户端执行命令。

四个Peer节点分属于同一个管理域(example.com)下的两个组织Org1和Org2,这两个组织都加入同一 个应用通道(business-channel)中。每个组织中的第一个节点(peer0节点)作为锚节点与其他组织进行通信,所有节点通过域名都可以相 互访问,整体网络拓扑如图9-2所示。

image.png

图9-2 网络拓扑结构

9.4.2 准备相关配置文件

Fabric网络在启动之前,需要提前生成一些用于启动的配置文件,主要包括MSP相关文件(msp/*)、TLS相关 文件(tls/*)、系统通道初始区块(orderer.genesis.block)、新建应用通道交易文件 (businesschannel.tx)、锚节点配置更新交易文件Org1MSPanchors.tx和Org2MSPanchors.tx)等。各个 文件的功能如表9-2所示。

表9-2 启动配置文件及主要功能

image.png

注意,本小节主要描述如何生成这些启动配置文件,关于这些配置更详细的讲解可以参考后续相关章节。

1.生成组织关系和身份证书

Fabric网络提供的是联盟链服务,联盟由多个组织构成,组织中的成员提供了节点服务来维护网络,并且通过身份来进行权限管理。

因此,首先需要对各个组织和成员的关系进行规划,分别生成对应的身份证书文件,并部署到其对应的节点上。

用户可以通过PKI服务(如使用fabric-ca)或者OpenSSL工具来手动生成各个实体的证书和私钥。但当组织结构比较复杂时,这种手动生成的方式容易出错,并且效率不高。

Fabric项目提供了cryptogen工具(基于crypto标准库)实现自动化生成。这一过程首先依赖crypto-config.yaml配置文件。

crypto-config.yaml配置文件的结构十分简单,支持定义两种类型(OrdererOrgs和PeerOrgs)的若干组织。每个组织中又可以定义多个节点(Spec)和用户(User)。

一个示例的crypto-config.yaml配置文件内容如下,其中定义了一个OrdererOrgs类型的组织 Orderer(包括一个节点orderer.example.com),以及两个PeerOrgs类型的组织Org1和Org2(分别包括2个节点和1 个普通用户)。


 

OrdererOrgs:
   - Name: Orderer
       Domain: example.com
       Specs:
           - Hostname: orderer
             CommonName: orderer.example.com
PeerOrgs:
   - Name: Org1
       Domain: org1.example.com
       Template:
           Count: 2
       Users:
           Count: 1
   - Name: Org2
       Domain: org2.example.com
       Template:
           Count: 2
       Users:
           Count: 1


使用该配置文件,通过如下命令可以为Fabric网络生成指定拓扑结构的组织和身份文件,存放到crypto-config目录下:


 

$ cryptogen generate --config=./crypto-config.yaml --output ./crypto-config


查看crypto-config目录结构,按照示例crypto-config.yaml中的定义进行生成:


 

$ tree -L 4 crypto-config
crypto-config
|-- ordererOrganizations
|   `-- example.com
|       |-- ca
|       |   |-- 293def0fc6d07aab625308a3499cd97f8ffccbf9e9769bf4107d6781f5e8072b_sk
|       |   `-- ca.example.com-cert.pem
|       |-- msp
|       |   |-- admincerts
|       |   |-- cacerts
|       |   `-- tlscacerts
|       |-- orderers
|       |   `-- orderer.example.com
|       |-- tlsca
|       |   |-- 2be5353baec06ca695f7c3b04ca0932912601a4411939bfcfd44af18274d5a65_sk
|       |   `-- tlsca.example.com-cert.pem
|       `-- users
|           `-- Admin@example.com
`-- peerOrganizations
   |-- org1.example.com
   |   |-- ca
   |   |   |-- 501c5f828f58dfa3f7ee844ea4cdd26318256c9b66369727afe8437c08370aee_sk
   |   |   `-- ca.org1.example.com-cert.pem
   |   |-- msp
   |   |   |-- admincerts
   |   |   |-- cacerts
   |   |   `-- tlscacerts
   |   |-- peers
   |   |   |-- peer0.org1.example.com
   |   |   `-- peer1.org1.example.com
   |   |-- tlsca
   |   |   |-- 592a08f84c99d6f083b3c5b9898b2ca4eb5fbb9d1e255f67df1fa14c123e4368_sk
   |   |   `-- tlsca.org1.example.com-cert.pem
   |   `-- users
   |       |-- Admin@org1.example.com
   |       `-- User1@org1.example.com
   `-- org2.example.com
       |-- ca
       |   |-- 86d97f9eb601868611eab5dc7df88b1f6e91e129160651e683162b958a728162_sk
       |   `-- ca.org2.example.com-cert.pem
       |-- msp
       |   |-- admincerts
       |   |-- cacerts
       |   `-- tlscacerts
       |-- peers
       |   |-- peer0.org2.example.com
       |   `-- peer1.org2.example.com
       |-- tlsca
       |   |-- 4b87c416978970948dffadd0639a64a2b03bc89f910cb6d087583f210fb2929d_sk
       |   `-- tlsca.org2.example.com-cert.pem
       `-- users
           |-- Admin@org2.example.com
           `-- User1@org2.example.com


按照crypto-config.yaml中的定义,所生成的crypto-config目录下包括多级目录结构。其中 ordererOrganizations下包括构成Orderer组织(1个Orderer节点)的身份信息;peerOrganizations下为 所有的Peer节点组织(2个组织,4个节点)的相关身份信息。其中最关键的是msp目录,代表了实体的身份信息。

对于Orderer节点来说,需要将crypto-config/ordererOrganizations /example.com/orderers/orderer.example.com目录下的内容(包括msp和tls两个子目录)复制到 Orderer节点的/etc/hyperledger/fabric路径(与Orderer自身配置一致)下。

对于Peer节点来说,则需要复制peerOrganizations下对应的身份证书文件。以org1的peer0为 例,将crypto-config/peerOrganizations/org1.example.com/peers /peer0.org1.example.com目录下的内容(包括msp和tls)复制到Peer0节点的/etc/hyperledger /fabric(与Peer自身配置一致)路径下。

对于客户端节点来说,为了方便操作,可将完整的crypto-config目录复制到/etc/hyperledger/fabric(与configtx.yaml中配置一致)路径下。

spacer.gif注意  目前,组织结构一旦生成,如果要进行修改,只能手动对证书进行调整,因此需要提前做好联盟的规划。未来会支持对组织结构和节点身份进行动态在线调整。

2.生成Ordering服务启动初始区块

Orderer节点在启动时,可以指定使用提前生成的初始区块文件作为系统通道的初始配置。初始区块中包括了 Ordering服务的相关配置信息以及联盟信息。初始区块可以使用configtxgen工具进行生成。生成过程需要依赖/etc /hyperledger/fabric/configtx.yaml文件。configtx.yaml配置文件定义了整个网络中的相关配置和拓扑结构信 息。

编写configtx.yaml配置文件可以参考Fabric代码中(如examples/e2e_cli路径下或sampleconfig路径下)的示例。这里采用如下内容进行生成:


 

Profiles:
   TwoOrgsOrdererGenesis:
       Orderer:
           <<: *OrdererDefaults
           Organizations:
               - *OrdererOrg
       Consortiums:
           SampleConsortium:
               Organizations:
                   - *Org1
                   - *Org2
   TwoOrgsChannel:
       Consortium: SampleConsortium
       Application:
           <<: *ApplicationDefaults
           Organizations:
               - *Org1
               - *Org2
Organizations:
   - &OrdererOrg
       Name: OrdererOrg
       ID: OrdererMSP
       MSPDir: crypto-config/ordererOrganizations/example.com/msp
       BCCSP:
           Default: SW
           SW:
               Hash: SHA2
               Security: 256
               FileKeyStore:
                   KeyStore:
   - &Org1
       Name: Org1MSP
       ID: Org1MSP
       MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
       BCCSP:
           Default: SW
           SW:
               Hash: SHA2
               Security: 256
               FileKeyStore:
                   KeyStore:
       AnchorPeers:
           - Host: peer0.org1.example.com
             Port: 7051
   - &Org2
       Name: Org2MSP
       ID: Org2MSP
       MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
       BCCSP:
           Default: SW
           SW:
               Hash: SHA2
               Security: 256
               FileKeyStore:
                   KeyStore:
       AnchorPeers:
           - Host: peer0.org2.example.com
             Port: 7051
Orderer: &OrdererDefaults
   OrdererType: solo
   Addresses:
       - orderer.example.com:7050
   BatchTimeout: 2s
   BatchSize:
       MaxMessageCount: 10
       AbsoluteMaxBytes: 99 MB
       PreferredMaxBytes: 512 KB
   Kafka:
       Brokers:
           - 127.0.0.1:9092
   Organizations:
Application: &ApplicationDefaults
   Organizations:


该配置文件定义了两个模板:TwoOrgsOrdererGenesis和TwoOrgsChannel,其中前者可以用来生成Ordering服务的初始区块文件。

通过如下命令指定使用configtx.yaml文件中定义的TwoOrgsOrdererGenesis模板,来生成Ordering服务系统通道的初始区块文件。注意这里排序服务类型采用了简单的solo模式,生产环境中可以采用kafka集群服务:


 

$ configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./orderer.genesis.block


所生成的orderer.genesis.block需要复制到Orderer节点上(与Orderer配置中 ORDERER_GENERAL_GENESISFILE指定文件路径一致,默认放到/etc/hyperledger/fabric路径下),在启动 Orderering服务时进行使用。

3.生成新建应用通道的配置交易

新建应用通道时,需要事先准备好配置交易文件,其中包括属于该通道的组织结构信息。这些信息会写入该应用通道的初始区块中。

同样需要提前编写好configtx.yaml配置文件,之后可以使用configtxgen工具来生成新建通道的配置交易文件。

为了后续命令使用方便,将新建应用通道名称businesschannel复制到环境变量CHANNEL_NAME中:


 

$ CHANNEL_NAME=businesschannel


之后采用如下命令指定使用configtx.yaml配置文件中的TwoOrgsChannel模板,来生成新建通道的配置交易文件。TwoOrgsChannel模板指定了Org1和Org2都属于后面新建的应用通道:


 

$ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./businesschannel.
   tx -channelID ${CHANNEL_NAME}


所生成的配置交易文件会在后续步骤被客户端使用,因此可以放在客户端节点上。

spacer.gif注意  由于Kafka、CouchDB中的命名限制,目前应用通道名称只能包括小写的ASCII字符、点或中划线,长度小于250字符,并且首字符必须为字 母。可参考FAB-2487:Handle CouchDB name collisions due to similar named channels。

4.生成锚节点配置更新文件

锚节点配置更新文件可以用来对组织的锚节点进行配置。

同样基于configtx.yaml配置文件,可以通过如下命令使用configtxgen工具来生成新建通道文件。每个组织都需要分别生成,注意需要分别指定对应的组织名称:


 

$ configtxgen \
   -profile TwoOrgsChannel \
   -outputAnchorPeersUpdate ./Org1MSPanchors.tx \
   -channelID ${CHANNEL_NAME} \
   -asOrg Org1MSP
$ configtxgen \
   -profile TwoOrgsChannel \
   -outputAnchorPeersUpdate \
   ./Org2MSPanchors.tx -channelID ${CHANNEL_NAME} \
   -asOrg Org2MSP


所生成的锚节点配置更新文件会在后续步骤被客户端使用,因此可以放在客户端节点上。

所有用于启动的配置文件生成并部署到对应节点后,可以进行服务的启动操作,首先要启动Orderer节点,然后启动Peer节点。

9.4.3 启动Orderer节点

首先,检查启动节点的所有配置是否就绪:

·在/etc/hyperledger/fabric路径下放置有编写好的orderer.yaml(可以参考sampleconfig/orderer.yaml);

·在/etc/hyperledger/fabric路径下放置生成的msp文件目录、tls文件目录;

·在/etc/hyperledger/fabric路径下放置初始区块文件orderer.genesis.block。

Orderer节点的默认配置文件中指定了简单的Orderer节点功能。

通常情况下,在使用时根据需求往往要对其中一些关键配置进行指定。表9-3总结了如何通过环境变量方式对这些关键配置进行更新。

表9-3 环境变量配置及其功能

image.png

配置完成后,用户可以采用如下命令来快速启动一个本地Orderer节点。启动成功后可以看到本地输出的开始提供服务的消息,此时Orderer采用指定的初始区块文件创建了系统通道:


 

$ orderer start
[msp] getMspConfig -> INFO 001 intermediate certs folder not found at [/etc/
   hyperledger/fabric/msp/intermediatecerts]. Skipping.: [stat /etc/hyperledger/
[msp] getMspConfig -> INFO 002 crls folder not found at [/etc/hyperledger/fabric/
   msp/intermediatecerts]. Skipping.: [stat /etc/hyperledger/fabric/msp/crls:
   no such file or directory]
[orderer/main] initializeMultiChainManager -> INFO 003 Not bootstrapping because
   of existing chains
[orderer/multichain] NewManagerImpl -> INFO 004 Starting with system channel
   testchainid and orderer type solo
[orderer/main] NewServer -> INFO 005 Starting orderer
[orderer/main] main -> INFO 006 Beginning to serve requests
...


9.4.4 启动Peer节点

首先,检查启动所有Peer节点的所有配置是否就绪:

·在/etc/hyperledger/fabric路径下放置有对应编写好的core.yaml(可以参考sampleconfig/core.yaml);

·在/etc/hyperledger/fabric路径下放置生成的对应msp文件目录、tls文件目录。

Peer节点的默认配置文件中指定了适合调试的Peer节点功能。

使用时根据需求可能要对其中一些关键配置进行指定。表9-4总结了如何通过环境变量方式对这些关键配置进行更新。

表9-4 环境变量配置及其功能

image.png

image.png

配置完成后,用户可以采用如下命令在多个服务器上启动本地Peer节点,启动成功后可以看到本地输出的日志消息:


 

$ peer node start
UTC [msp] getMspConfig -> INFO 001 intermediate certs folder not found at [/etc/
   hyperledger/fabric/msp/intermediatecerts]. Skipping.: [stat /etc/hyperledger/
   fabric/msp/intermediatecerts: no such file or directory]
[msp] getMspConfig -> INFO 002 crls folder not found at [/etc/hyperledger/fabric/
   msp/intermediatecerts]. Skipping.: [stat /etc/hyperledger/fabric/msp/crls:
   no such file or directory]
[ledgermgmt] initialize -> INFO 003 Initializing ledger mgmt
[kvledger] NewProvider -> INFO 004 Initializing ledger provider
...


Peer节点启动后,默认情况下没有加入网络中的任何应用通道,也不会与Orderer服务建立连接。需要通过客户端对其进行操作,让它加入网络和指定的应用通道中。

9.4.5 操作网络

网络启动后,默认并不存在任何应用通道,需要手动创建应用通道,并让合作的Peer节点加入通道中。下面在客户端进行相关操作。

1.创建通道

使用加入联盟中的组织管理员身份可以创建应用通道。

在客户端使用Org1的管理员身份来创建新的应用通道,需要指定msp的ID信息、msp文件所在路径、Orderering服务的tls证书位置,以及网络中Ordering服务地址、应用通道名称和交易文件:


 

$ CHANNEL_NAME=businesschannel
$ CORE_PEER_LOCALMSPID="Org1MSP" \
   CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/
       org1.example.com/users/Admin@org1.example.com/msp \
   peer channel create \
   -o orderer.example.com:7050 \
   -c ${CHANNEL_NAME} \
   -f ./businesschannel.tx \
   --tls \
   --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.
       com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.
       pem


创建通道成功后,会自动在本地生成该应用通道同名的初始区块businesschannel.block文件。只有拥有该文件才可以加入创建的应用通道中。

2.加入通道

应用通道所包含组织的成员节点可以加入通道中。

在客户端使用管理员身份依次让组织Org1和Org2中的所有节点都加入新的应用通道,需要指定所操作的Peer的地址,以及通道的初始区块。

这里以操作Org1中的peer0节点为例:


 

$ CORE_PEER_LOCALMSPID="Org1MSP" \
   CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/
       org1.example.com/users/Admin@org1.example.com/msp \
   CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
   peer channel join \
   -b ${CHANNEL_NAME}.block

Peer joined the channel!


此时,所操作的Peer连接到该应用通道的Ordering服务上,开始接收区块信息。

3.更新锚节点配置

锚节点负责代表组织与其他组织中的节点进行Gossip通信。

使用提前生成的锚节点配置更新文件,组织管理员身份可以更新指定应用通道中组织的锚节点配置。

这里在客户端使用了Org1的管理员身份来更新锚节点配置,需要指定msp的ID信息、msp文件所在路径、Ordering服务地址、所操作的应用通道、锚节点配置更新文件,以及Orderering服务tls证书位置:


 

$ CORE_PEER_LOCALMSPID="Org1MSP" \
   CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/
       org1.example.com/users/Admin@org1.example.com/msp \
   peer channel update \
   -o orderer.example.com:7050 \
   -c ${CHANNEL_NAME} \
   -f ./Org1MSPanchors.tx \
   --tls \
--cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.
   com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem


4.测试链码

Peer加入应用通道后,可以执行链码相关操作,进行测试。链码在调用之前,必须先经过安装(Install)和实例化(Instantiate)两个步骤,部署到Peer节点上。

通过如下命令在客户端安装示例链码chaincode_example02到Org1的Peer0上:


 

$ CORE_PEER_LOCALMSPID="Org1MSP" \
   CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/
       org1.example.com/users/Admin@org1.example.com/msp \
   CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
   peer chaincode install \
   -n test_cc \
   -v 1.0 \
   -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02


通过如下命令将链码容器实例化,并注意通过-P指定背书策略。此处OR('Org1MSP.member','Org2MSP.member')代表Org1或Org2的任意成员签名的交易即可调用该链码:


 

$ CORE_PEER_LOCALMSPID="Org1MSP" \
   CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/
       org1.example.com/users/Admin@org1.example.com/msp \
   CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
   peer chaincode instantiate \
   -o orderer.example.com:7050 \
   -C ${CHANNEL_NAME} \
   -n test_cc \
   -v 1.0 \
   -c '{"Args":["init","a","100","b","200"]}' \
   -P "OR ('Org1MSP.member','Org2MSP.member')" \
   --tls \
   --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/
   orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem


实例化完成后,用户即可向网络中发起交易了。例如,可以通过如下命令来调用链码:


 

$ CORE_PEER_LOCALMSPID="Org1MSP" \
   CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/
       org1.example.com/users/Admin@org1.example.com/msp \
   CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
   peer chaincode invoke \
   -o orderer.example.com:7050  \
   -C $CHANNEL_NAME \
   -n test_cc \
   -c '{"Args":["invoke","a","b","10"]}' \
   --tls \
   --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/
   example.com/orderers/orderer.example.com/tlscacerts/tlsca.example.com-
   cert.pem


通过如下命令查询调用链码后的结果:


 

$ CORE_PEER_LOCALMSPID="Org1MSP" \
   CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/
       org1.example.com/users/Admin@org1.example.com/msp \
   CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
   peer chaincode query \
   -n test_cc \
   -C ${CHANNEL_NAME} \
   -c '{"Args":["query","a"]}'

Query Result: 90


5.监听事件

用户也可以通过block-listener工具来监听网络中的事件。该工具支持的命令行选项包括如下几个:

·-events-address"0.0.0.0:7053":监听事件的来源地址,一般为Peer节点的7053端口;

·-events-from-chaincode string:仅监听与指定链码相关的事件;

·-events-mspdir string:本地所使用的MSP路径,默认在sampleconfig下;

·-events-mspid string:所使用的MSP的ID。

例如,用户可以通过如下命令在客户端节点上监听peer0.org1节点的事件:


 

$ block-listener \
   -events-address=peer0.org1.example.com:7053 \
   -events-mspdir=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.
       example.com/peers/peer0.org1.example.com/msp/ \
   -events-mspid=Org1MSP


之后,网络中发生的相关事件(区块、交易、注册、拒绝等)会打印出来,例如当peer0加入新建的应用通道时,会发生如下事件:


 

Event Address: peer0.org1.example.com:7053

Received block
--------------
Received transaction from channel businesschannel:
[...]


spacer.gif注意  目前,block-listener工具不支持TLS,因此相关Peer配置需要指定CORE_PEER_TLS_ENABLED=false。

9.4.6 基于容器方式

除了前面讲解的在服务器上手动部署的方式,读者还可以基于容器方式快速部署一套本地的Fabric网络进行体验。

首先,下载Compose模板文件,进入hyperledger/1.0目录:


 

$ git clone https://github.com/yeasy/docker-compose-files
$ cd docker-compose-files/hyperledger/1.0


如果本地Fabric所需要的相关容器镜像尚不存在,可以通过如下命令快速下载所需的镜像文件:


 

$ bash scripts/download_images.sh


查看目录下内容,包括若干模板文件,功能如下:

·docker-compose.yaml:启动最小化的环境,包括1个Peer节点、1个Orderer节点、1个CA节点;

·docker-compose-dev.yaml:包括1个Peer节点、1个Orderer节点、1个CA节点、1个客户端节点。本地Fabric源码被挂载到了客户端节点中,方便进行调试;

·docker-compose-1peer.yaml:包括1个Peer节点、1个Orderer节点、1个CA节点、1个客户端节点。最小化的网络;

·docker-compose-2orgs-4peer.yaml:包括4个Peer节点(属于两个组织)、1个Orderer节点、1个CA节点、1个客户端节点;

·docker-compose-2orgs-4peer-event.yaml:包括4个Peer节点(属于两个组织)、1个Orderer节点、1个CA节点、1个客户端节点、1个事件监听节点。

用户可以查看这些模板文件中的相关配置,已经包括了手动配置的内容。

之后通过如下命令快速启动网络,在不指定compose_yaml_file文件情况下默认使用docker-compose-2orgs-4peer.yaml:


 

$ bash scripts/start_fabric.sh docker-compose-2orgs-4peers-event.yaml


注意查看启动后输出日志中有无错误信息。

启动后,可以通过docker ps命令查看本地系统中运行的容器:


 

$ docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS                                                                                 NAMES
35dc10a1eee9        dev-peer0.org1.example.com-test_cc-1.0   "chaincode -peer.a..."   11 hours ago        Up 31 minutes                                                                                             dev-peer0.org1.example.com-test_cc-1.0
dde717e163d0        hyperledger/fabric-peer                  "bash -c 'while tr..."   12 hours ago        Up About an hour    7050-7059/tcp                                                                         fabric-cli
cc8d1f8bde00        hyperledger/fabric-tools     "bash -c 'block-li..."   12 hours ago       Up About an hour        7051/tcp                                                                              fabric-event-listener
611c26e86709        hyperledger/fabric-peer                  "peer node start -..."   12 hours ago        Up About an hour    7050/tcp, 7052/tcp, 7054-7059/tcp, 0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp   peer1.org2.example.com
07e621ff8d10        hyperledger/fabric-peer                  "peer node start -..."   12 hours ago        Up About an hour    7050/tcp, 7052/tcp, 7054-7059/tcp, 0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp     peer0.org2.example.com
b5e1f4d3844f        hyperledger/fabric-peer                  "peer node start -..."   12 hours ago        Up About an hour    7050/tcp, 0.0.0.0:7051->7051/tcp, 7052/tcp, 7054-7059/tcp, 0.0.0.0:7053->7053/tcp     peer0.org1.example.com
f11a57b75a28        hyperledger/fabric-peer                  "peer node start -..."   12 hours ago        Up About an hour    7050/tcp, 7052/tcp, 7054-7059/tcp, 0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp     peer1.org1.example.com
ad2b3672e3e6        hyperledger/fabric-orderer               "orderer"                2 days ago          Up About an hour    0.0.0.0:7050->7050/tcp                                                                orderer.example.com
12b849c2cad0        hyperledger/fabric-ca                    "fabric-ca-server ..."   2 days ago          Up About an hour    0.0.0.0:7054->7054/tcp                                                                fabric-ca


用户如果希望在某容器内执行命令,可以通过docker exec命令进入容器中。

例如,如下命令可以让用户登录到客户端节点,在其中执行相关的操作:


 

$ docker exec -it fabric-cli bash


其他操作测试步骤与本地环境下部署情形类似,在此不再赘述。


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=928

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值