Michael.W谈hyperledger Fabric第8期-手动搭建Fabric网络之编写用于启动网络的docker-compose配置文件-orderer节点
3 修改orderer节点容器的配置
看一下测试用例中的orderer节点部分的配置文件是如何写的:
services: # 服务。 其中每个服务都对应一个docker容器。
orderer.example.com: # 第一个服务名(orderer节点),可自定义。官方给出的配置文件是用orderer节点的域名来做服务名,也可以改成其他字符串来代替。
extends: # 表名该服务是继承于base/docker-compose-base.yaml文件中的orderer.example.com服务。
file: base/docker-compose-base.yaml
service: orderer.example.com # 继承于的服务名
container_name: orderer.example.com # 自定义orderer节点容器的容器名
networks: # 该容器所处的网络
- byfn # 前面已声明过byfn网络
可见orderer服务继承于文件base/docker-compose-base.yaml。接着来看一下docker-compose-base.yaml中的orderer.example.com服务都做了什么配置:
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2' # 版本号,不用修改
services: # 服务
orderer.example.com: # docker-compose-cli.yaml中的order服务就是继承于本文件的该服务
container_name: orderer.example.com # 该服务对应的容器名[1]
image: hyperledger/fabric-orderer:$IMAGE_TAG # 基于的镜像。前面讲过$IMAGE_TAG可以删除掉。
environment: #环境变量设置
# 日志级别
- ORDERER_GENERAL_LOGLEVEL=INFO
# orderer节点监听本机地址[4]。
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
# 生成创始区块时的数据来源。以文件形式
- ORDERER_GENERAL_GENESISMETHOD=file
# 生成创始区块的数据来自于哪个文件。此处跟下面的数据卷挂载有关。
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
# 当前orderer节点属于的组织的ID。去configtx.yaml文件中找。
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
# 当前orderer节点的证书路径(账号目录)。此处跟下面的数据卷挂载有关。
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
# enabled TLS
# orderer节点通信是是否进行TLS加密
- ORDERER_GENERAL_TLS_ENABLED=true
# 如果ORDERER_GENERAL_TLS_ENABLED为true,下面三个环境变量生效
# 容器中order节点的TLS秘钥文件。此处跟下面的数据卷挂载有关。
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
# 容器中order节点的TLS证书文件。此处跟下面的数据卷挂载有关。
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
# 容器中order节点的TLS根证书文件。此处跟下面的数据卷挂载有关。这里的文件路径用中括号括了起来[5]。
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
working_dir: /opt/gopath/src/github.com/hyperledger/fabric # 容器启动后会进入到的进程路径
command: orderer # 容器启动起来默认执行的命令[2]
volumes: # 数据卷挂载
# 将创世区块文件挂载到该容器对应目录。修改时要将自己生成创世区块的文件名和路径写对![3]
- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
# orderer节点的身份证书(账号信息)的映射
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
# 有关orderer节点的tls通信加密的文件映射
- orderer.example.com:/var/hyperledger/production/orderer
# 一个目录映射,与docker-compose-cli.yaml文件最前面的volumes有关。先无视它,后面的帖子我会讲解。
ports:
- 7050:7050 # 端口映射:宿主机的7050端口映射到容器的7050端口。
# 注:orderer节点容器开放的端口默认是7050,peer节点容器默认的是7051。
[1] 如果一个服务的设置了容器名,该服务继承的服务也设置了容器名,到底该服务的容器名以哪个为准?
答:以执行顺序中最后一次设置容器名的那次操作为准。所以orderer容器名的设置要以docker-compose-cli.yaml中那次container_name的赋值为准。
[2] 这个orderer指令从何而来?
答:官方在制作镜像的时候,将orderer命令放到了该镜像中。
[3] 在做创世区块的文件挂载时,配置文件将文件映射后的文件名从genesis.block(宿主机)改成了orderer.genesis.block(容器)。但是这个并不重要,别看到文件名变了一头雾水就好。
[4] 当地址填成0.0.0.0表示系统会自动读取网卡并解析本机的IP,然后自动导入。
[5] 中括号括起来表示在中括号里面可以填多个地址。
综上,环境变量的设置都是基于容器内路径的设置。成败关键在于volumes中的数据卷挂载是否正确,也就是说宿主机这边的各个路径在映射的时候千万要弄清楚!
我对orderer节点相关的配置文件修改如下:
# 文件:docker-compose-cli.yaml
version: '2'
volumes:
orderer.michael.com:
peer0.org1.michael.com:
peer1.org1.michael.com:
peer0.org2.michael.com:
peer1.org2.michael.com:
networks:
byfn:
services:
orderer.michael.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.michael.com
container_name: orderer.michael.com
networks:
- byfn
# 文件:base/docker-compose-base.yaml
version: '2'
services:
orderer.michael.com: # 修改
container_name: orderer.michael.com # 修改
image: hyperledger/fabric-orderer
environment:
- ORDERER_GENERAL_LOGLEVEL=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
- ORDERER_GENERAL_TLS_ENABLED=true
- 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: orderer
volumes:
- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
# 修改
- ../crypto-config/ordererOrganizations/michael.com/orderers/orderer.michael.com/msp:/var/hyperledger/orderer/msp
# 修改
- ../crypto-config/ordererOrganizations/michael.com/orderers/orderer.michael.com/tls/:/var/hyperledger/orderer/tls
# 修改
- orderer.michael.com:/var/hyperledger/production/orderer
ports:
- 7050:7050
orderer节点的配置相对来说简单一些。最关键的地方还是在base/docker-compose-base.yaml文件中volumes的地方,一定要仔细再仔细!
ps:
本人热爱图灵,热爱中本聪,热爱V神,热爱一切被梨花照过的姑娘。
以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。
同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下!
如果需要转发,麻烦注明作者。十分感谢!
公众号名称:后现代泼痞浪漫主义奠基人