深度学习
启动Fabric网络是一个比较复杂的过程,主要步骤包括计划拓扑、准备相关配置文件、启动Orderer节点、启动Peer节点和操作网络等。这里以Fabric代码中自带的示例为基础讲解相关的操作步骤。
9.4.1 网络拓扑
启动的Fabric网络中包括一个Orderer节点和四个Peer节点,以及一个管理节点生成相关启动文件,在网络启动后作为操作客户端执行命令。
四个Peer节点分属于同一个管理域(example.com)下的两个组织Org1和Org2,这两个组织都加入同一 个应用通道(business-channel)中。每个组织中的第一个节点(peer0节点)作为锚节点与其他组织进行通信,所有节点通过域名都可以相 互访问,整体网络拓扑如图9-2所示。
图9-2 网络拓扑结构
9.4.2 准备相关配置文件
Fabric网络在启动之前,需要提前生成一些用于启动的配置文件,主要包括MSP相关文件(msp/*)、TLS相关 文件(tls/*)、系统通道初始区块(orderer.genesis.block)、新建应用通道交易文件 (businesschannel.tx)、锚节点配置更新交易文件Org1MSPanchors.tx和Org2MSPanchors.tx)等。各个 文件的功能如表9-2所示。
表9-2 启动配置文件及主要功能
注意,本小节主要描述如何生成这些启动配置文件,关于这些配置更详细的讲解可以参考后续相关章节。
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中配置一致)路径下。
注意 目前,组织结构一旦生成,如果要进行修改,只能手动对证书进行调整,因此需要提前做好联盟的规划。未来会支持对组织结构和节点身份进行动态在线调整。
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}
所生成的配置交易文件会在后续步骤被客户端使用,因此可以放在客户端节点上。
注意 由于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 环境变量配置及其功能
配置完成后,用户可以采用如下命令来快速启动一个本地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 环境变量配置及其功能
配置完成后,用户可以采用如下命令在多个服务器上启动本地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:
[...]
注意 目前,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
微信号:qq444848023 QQ号:444848023
加入【我是码农】QQ群:864689844(加群验证:我是码农)
全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试
var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!
评论专区