一、为什么要脱离 Docker 部署 Fabric 网络?
1、使用 Docker 部署相对比较复杂,不适合入门学习
在我开始学习 Fabric 的时候,由于之前没有学习使用过 Docker,所以光是弄明白如何在我的系统上安装 Docker 以及如何使用 Docker 就折腾了一段时间,在加上之后因为各种 Docker 镜像下载问题和 Docker 数据缓存、Docker镜像版本等问题,又是一顿折腾。
虽然使用 Docker 有诸多优势和便利,但我认为这样添加了很多概念,对入门学习 Docker 的人来说实在是不友好,容易让初学者迷失自己要学习的重点问题。我认为多就是没有,能让人一下子抓住重点问题的方法会是一个很有效的方法。
2、脱离 Docker 部署更容易调试 Fabric 的源码
很多时候当我们遇到问题,一通搜索询问无法解决的时候,最直接的方法就是查看源码。通过调试源码可以更直接更准确的定位到问题。
另外,如果使用 Docker 部署 Fabric 测试网络的调试代码话,我们每次不得不重新 make docker。每次 make docker 我都要等几分钟,甚至十几分钟,这让我很抓狂,而 go build 去编译一个节点程序仅仅需要几秒钟,便捷之处不言而喻。
对代码调试方面更无需多说,每次修改代码、添加日志输出之后,我只需重新启动下节点即可。我甚至可以在 IDE 里面直接 debug 节点程序。这对于调试源码来说太方便了。
3、脱离 Docker 运行 Fabric 网络可以节省系统性能
这一点其实也是我琢磨脱离 Docker 部署 Fabric 的初衷。最初是想主机上如果不运行 Docker,那意味着少了一些程序来和节点程序竞争计算机的资源,理论上应该会提升 Fabric 网络的系统性能。我测试后的数据也验证了我的猜测。
4、Fabric 2.0 的新特性使得完全脱离 Docker 部署更容易
Fabric 2.0 添加了 chaincode external builder 功能,可以使 chaincode 以一个独立的外部服务形式运行。在 2.0 之前的版本中,chaincode 必须被编译成一个 Docker 镜像才可以运行。有了这个新特性之后 Fabric 就可以完全脱离开 Docker 去运行了。
二、使用脚本自动部署脱离 Docker 的 Fabric 网络
需要说明的是当前脚本仅支持 Linux 和 MacOS 操作系统,对 Windows 操作系统的支持我会在以后添加,请持续关注我的项目。
1、Clone 脚本代码到本地
git clone https://github.com/yiwenlong/fabric-samples-nodocker
2、配置环境依赖
对于依赖这些东西我是想了很多方法尽量减少依赖,除非非常必要,我觉得没必要让新入门学习 Fabric 的同学去花时间搞明白 Fabric 之外的其他东西,焦点聚焦在 Fabric 上面是最重要的。
在自己的主机上安装 supervisor,并启动 supervisor
考虑在不同系统上的可移植性,我在这里使用 supervisor 用于做进程管理。
对于 MacOS
# 首先去定已经安装了 homebrew,如果没有,执行以下脚本
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install supervisor
brew services start supervisor
对于 Ubuntu
apt install supervisor
systemctl start supervisor
对于 CentOS
yum install supervisor
systemctl start supervisor
配置 SUPERVISOR_CONFD_DIR 环境变量
我写了脚本自动去配置 supervisor,当节点程序需要启动的时候,boot.sh 启动脚本会在 supervisor 的配置目录下创建节点进程的启动配置文件。因此需要使用 $SUPERVISOR_CONFD_DIR 环境变量指向 supervisor 的配置目录。详细实现可以查看代码 scripts/config-scripts.sh
# MacOS
export SUPERVISOR_CONFD_DIR=/usr/local/etc/supervisor.d
# CentOS
export SUPERVISOR_CONFD_DIR=/etc/supervisord.d
# Ubuntu
export SUPERVISOR_CONFD_DIR=/etc/supervisor/conf.d
3、执行 config.sh 脚本
cd $fabric-samples-nodocker
./config.sh
config.sh 主要是去下载 Fabric 和 一个Demo chaincode 的二进制程序,执行成功后会生成以下目录:
./build/bin
./build/config
./build/chaincode
4、启动测试网络
网络配置我都是设置成可配置的,可以参照 samples/network-single-org 的配置自行配置网络节点。后面我会详细介绍如何配置以及如何使用。
使用测试网络前请先配置 /etc/hosts 文件,添加以下内容:
127.0.0.1 peer0.org1.example.com
127.0.0.1 peer1.org1.example.com
127.0.0.1 orderer0.example.com
127.0.0.1 orderer1.example.com
127.0.0.1 orderer2.example.com
如果仅仅是使用测试网络,可以直接执行以下脚本:
cd samples/network-single-org
./network up
这个脚本会自动启动节点程序、创建一个 channel 并安装一个名为 tps 的 chaincode。最后脚本会调用脚本的 init invoke query 函数测试 chancode 的运行情况。如图:

三、写在后面
因为能力和时间问题,文档写得很粗略,如果有疑问,欢迎大家留言交流,我会尽我所能回答各位遇到的问题,脚本代码可能会有一些问题,欢迎大家 pr 和 提issue。
https://github.com/yiwenlong/fabric-samples-nodocker
