Playground for Hyperledger - 启动网
我们将利用docker-compose脚本来启动我们的区块链网络,并用之前生成的genesis.block创世块来引导orderer。
在之前的示例中,我们使用的是docker-compose-cli.yaml来启动网络,为了详细了解每个节点和其配置的意义,我们分拆成多个yaml分别启动来看。
在first-network文件夹下创建yaml文件,我们将把自己写的所有的yaml文件放在里面。
CA
首先是CA的配置文件docker-compose-ca.yaml:
version: '2'
networks:
byfn:
services:
ca1:
image: hyperledger/fabric-ca
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca-org1
- FABRIC_CA_SERVER_TLS_ENABLED=${ENABLE_TLS}
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/e5ac2c775a1785aab2314e9a37903b546094990c7b23843fd58aaa323246b4a1_sk
ports:
- "7054:7054"
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/e5ac2c775a1785aab2314e9a37903b546094990c7b23843fd58aaa323246b4a1_sk -b admin:adminpw -d'
volumes:
- ../crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
network_mode: host
container_name: ca_peerOrg1
networks:
- byfn
ca2:
image: hyperledger/fabric-ca
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca-org2
- FABRIC_CA_SERVER_TLS_ENABLED=${ENABLE_TLS}
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/478b238f352735a9e7454af1180f633cee8c50bfe2513510d8f38970b89c7ecc_sk
ports:
- "8054:7054"
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/478b238f352735a9e7454af1180f633cee8c50bfe2513510d8f38970b89c7ecc_sk -b admin:adminpw -d'
volumes:
- ../crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
network_mode: host
container_name: ca_peerOrg2
networks:
- byfn
我们创建了2个ca容器,端口分别为本机的7054和8054,每个ca对应不同的org组织。
需要注意的是,这里volumes是挂载的外部路径,这个路径一定要写对,因为配置文件是在yaml文件夹中,所以需要../,FABRIC_CA_SERVER_TLS_KEYFILE和command中的私钥文件名也要替换成你自己本机路径下的名字。
command命令是ca服务器启动之后的初始化命令,传入参数包含了证书、私钥等配置,还有admin用户的用户名和密码admin: adminpw,如果要修改ca的admin密码,要对应修改这个地方。
启动网路:
$ CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=60 ENABLE_TLS=true docker-compose -f yaml/docker-compose-ca.yaml up -d
Creating network "net_default" with the default driver
Recreating ca_peerOrg2 ...
Recreating ca_peerOrg1 ...
Recreating ca_peerOrg1
Recreating ca_peerOrg2 ... done
查看下docker容器是否两个ca节点都启动了:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a23424f40e9 hyperledger/fabric-ca "sh -c 'fabric-ca-..." 39 seconds ago Up 53 seconds 0.0.0.0:8054->7054/tcp ca_peerOrg2
a1db6e04d736 hyperledger/fabric-ca "sh -c 'fabric-ca-..." 39 seconds ago Up 54 seconds 0.0.0.0:7054->7054/tcp ca_peerOrg1
现在我们可以进入ca1容器,看看他里面都有些什么东西:
$ docker exec -it ca_peerOrg1 /bin/bash
$ cd /etc/hyperledger/fabric-ca-server
ls
ca-cert.pem ca-key.pem fabric-ca-server-config.yaml fabric-ca-server.db msp
有一些根证书和私钥,yaml文件里包含了ca节点的初始化配置,db是ca验证需要存储的一些账号信息。
Orderer
创建docker-compose-base.yaml文件:
version: '2'
services:
orderer0.example.com:
hostname: orderer0
domainname: example.com
container_name: orderer0.example.com
image: hyperledger/fabric-orderer
environment:
- ORDERER_GENERAL_LOGLEVEL=ERROR
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
# enabled TLS
- ORDERER_KAFKA_RETRY_PERIOD=3s
- ORDERER_KAFKA_RETRY_STOP=10s
- ORDERER_KAFKA_VERBOSE=true
- ORDERER_GENERAL_TLS_ENABLED=${ENABLE_TLS}
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: /bin/bash -c 'sleep 10 && orderer'
volumes:
- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/genesis.block
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp:/var/hyperledger/orderer/msp
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/:/var/hyperledger/orderer/tls
ports:
- 7050:7050
orderer1.example.com:
hostname: orderer1.example.com
container_name: orderer1.example.com
image: hyperledger/fabric-orderer
environment:
- ORDERER_GENERAL_LOGLEVEL=ERROR
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
- ORDERER_KAFKA_RETRY_PERIOD=3s
- ORDERER_KAFKA_RETRY_STOP=10s
# enabled TLS
- ORDERER_KAFKA_VERBOSE=true
- ORDERER_GENERAL_TLS_ENABLED=${ENABLE_TLS}
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: /bin/bash -c 'sleep 10 && orderer'
volumes:
- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/genesis.block
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/msp:/var/hyperledger/orderer/msp
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/tls/:/var/hyperledger/orderer/tls
ports:
- 8050:7050
orderer2.example.com:
hostname: orderer2.example.com
container_name: orderer2.example.com
image: hyperledger/fabric-orderer
environment:
- ORDERER_GENERAL_LOGLEVEL=ERROR
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
# enabled TLS
- ORDERER_KAFKA_RETRY_PERIOD=3s
- ORDERER_KAFKA_RETRY_STOP=10s
- ORDERER_KAFKA_VERBOSE=true
- ORDERER_GENERAL_TLS_ENABLED=${ENABLE_TLS}
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: /bin/bash -c 'sleep 10 && orderer'
volumes:
- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/genesis.block
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/msp:/var/hyperledger/orderer/msp
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/:/var/hyperledger/orderer/tls
ports:
- 9050:7050
创建docker-compose-orderer.yaml文件:
version: '2'
networks:
byfn:
services:
orderer0.example.com:
extends:
file: docker-compose-base.yaml
service: orderer0.example.com
container_name: orderer0.example.com
depends_on:
- kafka0
networks:
- byfn
orderer1.example.com:
extends:
file: docker-compose-base.yaml
service: orderer1.example.com
container_name: orderer1.example.com
depends_on:
- kafka0
networks:
- byfn
orderer2.example.com:
extends:
file: docker-compose-base.yaml
service: orderer2.example.com
container_name: orderer2.example.com
depends_on:
- kafka0
networks:
- byfn
因为Orderer依赖于Kafka,Kafka依赖于Zookeeper,所以我统一都放在了一个yaml文件中。
启动Orderer:
$ CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=60 ENABLE_TLS=true docker-compose -f yaml/docker-compose-orderer.yaml up -d
Creating orderer0.example.com ...
Creating orderer1.example.com ...
Creating orderer2.example.com ... done
再看看容器,没有问题,ca,orderer都成功启动:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6e078efdbc8 hyperledger/fabric-orderer "/bin/bash -c 'sle..." 50 seconds ago Up About a minute 0.0.0.0:8050->7050/tcp orderer1.example.com
0d455f0d6062 hyperledger/fabric-orderer "/bin/bash -c 'sle..." 50 seconds ago Up About a minute 0.0.0.0:9050->7050/tcp orderer2.example.com
4245900f68f8 hyperledger/fabric-orderer "/bin/bash -c 'sle..." About an hour ago Up About an hour 0.0.0.0:7050->7050/tcp orderer0.example.com
Peer
在docker-compose-base.yaml文件中追加peer节点的配置:
peer-base:
image: hyperledger/fabric-peer
environment:
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_TLS_ENABLED=${ENABLE_TLS}
- CORE_PEER_ENDORSER_ENABLED=true
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: bash -c 'sleep 20 && peer node start --peer-defaultchain=false'
peer0.org1.example.com:
hostname: peer0.org1.example.com
container_name: peer0.org1.example.com
extends:
service: peer-base
environment:
- CORE_PEER_ID=peer0.org1.example.com
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
volumes:
- /var/run/:/host/var/run/
- ../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
ports:
- 7051:7051
- 7053:7053
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
service: peer-base
environment:
- CORE_PEER_ID=peer1.org1.example.com
- CORE_PEER_ADDRESS=peer1.org1.example.com:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
volumes:
- /var/run/:/host/var/run/
- ../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
ports:
- 8051:7051
- 8053:7053
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
service: peer-base
environment:
- CORE_PEER_ID=peer0.org2.example.com
- CORE_PEER_ADDRESS=peer0.org2.example.com:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
volumes:
- /var/run/:/host/var/run/
- ../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
ports:
- 9051:7051
- 9053:7053
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
service: peer-base
environment:
- CORE_PEER_ID=peer1.org2.example.com
- CORE_PEER_ADDRESS=peer1.org2.example.com:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls
ports:
- 10051:7051
- 10053:7053
创建docker-compose-peer.yaml:
version: '2'
networks:
- byfn
services:
couchdb0:
container_name: couchdb0
image: hyperledger/fabric-couchdb
ports:
- "5984:5984"
networks:
- byfn
peer0.org1.example.com:
extends:
file: docker-compose-base.yaml
service: peer0.org1.example.com
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
depends_on:
- couchdb0
networks:
- byfn
couchdb1:
container_name: couchdb1
image: hyperledger/fabric-couchdb
ports:
- "6984:5984"
networks:
- byfn
peer1.org1.example.com:
extends:
file: docker-compose-base.yaml
service: peer1.org1.example.com
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb1:5984
depends_on:
- couchdb1
networks:
- byfn
couchdb2:
container_name: couchdb2
image: hyperledger/fabric-couchdb
ports:
- "7984:5984"
networks:
- byfn
peer0.org2.example.com:
extends:
file: docker-compose-base.yaml
service: peer0.org2.example.com
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb2:5984
depends_on:
- couchdb2
networks:
- byfn
couchdb3:
container_name: couchdb3
image: hyperledger/fabric-couchdb
ports:
- "8984:5984"
networks:
- byfn
peer1.org2.example.com:
extends:
file: docker-compose-base.yaml
service: peer1.org2.example.com
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb3:5984
depends_on:
- couchdb3
networks:
- byfn
启动Peer节点:
$ CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=60 ENABLE_TLS=true docker-compose -f yaml/docker-compose-peer.yaml up -d
Creating couchdb3 ...
Creating couchdb1 ...
Creating couchdb0 ...
Creating couchdb2 ...
Creating couchdb3
Creating couchdb1
Creating couchdb2
Creating couchdb3 ... done
Creating peer1.org2.example.com ...
Creating couchdb1 ... done
Creating peer1.org1.example.com ...
Creating couchdb2 ... done
Creating couchdb0 ... done
Creating peer1.org1.example.com ... done
Creating peer0.org1.example.com ...
Creating peer0.org2.example.com ... done
查看容器状态:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
749acf8eebf8 hyperledger/fabric-peer "bash -c 'sleep 20..." 45 minutes ago Up About an hour 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
8689b9152000 hyperledger/fabric-peer "bash -c 'sleep 20..." 45 minutes ago Up 45 minutes 0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp peer0.org2.example.com
b16444eac623 hyperledger/fabric-peer "bash -c 'sleep 20..." 45 minutes ago Up About an hour 0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp peer1.org1.example.com
f29ac84f381d hyperledger/fabric-peer "bash -c 'sleep 20..." 45 minutes ago Up About an hour 0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp peer1.org2.example.com
Cli节点
我们还需要创建一个Cli客户端容器节点,方便对区块链执行一些操作。
创建文件:docker-compose-cli.yaml:
version: '2'
networks:
byfn:
services:
cli:
container_name: cli
image: hyperledger/fabric-tools
tty: true
network_mode: host
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_ENABLED=${ENABLE_TLS}
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: bash -c 'sleep 30000000000000000000000'
volumes:
- /var/run/:/host/var/run/
- ../../chaincode/:/opt/gopath/src/github.com/chaincode
- ../crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ../scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
- ../channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
networks:
- byfn
查看容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6e078efdbc8 hyperledger/fabric-orderer "/bin/bash -c 'sle..." 50 seconds ago Up About a minute 0.0.0.0:8050->7050/tcp orderer1.example.com
0d455f0d6062 hyperledger/fabric-orderer "/bin/bash -c 'sle..." 50 seconds ago Up About a minute 0.0.0.0:9050->7050/tcp orderer2.example.com
27f3688beec8 hyperledger/fabric-tools "bash -c 'sleep 30..." 15 minutes ago Up 16 minutes cli
749acf8eebf8 hyperledger/fabric-peer "bash -c 'sleep 20..." 45 minutes ago Up About an hour 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
8689b9152000 hyperledger/fabric-peer "bash -c 'sleep 20..." 45 minutes ago Up 45 minutes 0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp peer0.org2.example.com
b16444eac623 hyperledger/fabric-peer "bash -c 'sleep 20..." 45 minutes ago Up About an hour 0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp peer1.org1.example.com
f29ac84f381d hyperledger/fabric-peer "bash -c 'sleep 20..." 45 minutes ago Up About an hour 0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp peer1.org2.example.com
32f849c44e0f hyperledger/fabric-couchdb "tini -- /docker-e..." 45 minutes ago Up About an hour 4369/tcp, 9100/tcp, 0.0.0.0:6984->5984/tcp couchdb1
02b770dfd4ed hyperledger/fabric-couchdb "tini -- /docker-e..." 45 minutes ago Up About an hour 4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp couchdb0
f0c72c40c793 hyperledger/fabric-couchdb "tini -- /docker-e..." 45 minutes ago Up About an hour 4369/tcp, 9100/tcp, 0.0.0.0:8984->5984/tcp couchdb3
2eb63e7efa08 hyperledger/fabric-couchdb "tini -- /docker-e..." 45 minutes ago Up About an hour 4369/tcp, 9100/tcp, 0.0.0.0:7984->5984/tcp couchdb2
4245900f68f8 hyperledger/fabric-orderer "/bin/bash -c 'sle..." About an hour ago Up About an hour 0.0.0.0:7050->7050/tcp orderer0.example.com
faf06e00031a hyperledger/fabric-ca "sh -c 'fabric-ca-..." About an hour ago Up About an hour 0.0.0.0:8054->7054/tcp ca_peerOrg2
496e8e0a7df6 hyperledger/fabric-ca "sh -c 'fabric-ca-..." About an hour ago Up About an hour 0.0.0.0:7054->7054/tcp ca_peerOrg1
总结
到此,我们已经成功启动了网络中的所有节点,下一章将会在这些节点中运行我们的区块链~