使用须知:
阅读并使用本文档的人需要一定的linux命令行知识基础与相关的docker基础,否则相关问题出错,不容易解决。
安装环境:
VMware14 Pro (虚拟机版本不限制)+ Centos7 64位操作系统(其他linux操作系统大部分操作都一样,只是部分安装命令换成相对应的指令)
安装前准备:
第一:Centos 7系统安装配置完成,保证网络畅通。以下所有操作最好以root账户进行(dcoker的服务启动和设置需要root权限),所以先切换到root账户,打开终端并输入命令sudo su,输入root账户密码进入。也可以直接注销当前用户,使用root账户登入系统(本教程直接以root账户操作)。
第二:关闭centos自动升级,免得安装时提示yum被锁定。即将/etc/yum/pluginconf.d/langpacks.conf 中的 enable=1改为enable=0。输入命令:
# sed -i 's/enabled=1/enabled=0/g' /etc/yum/pluginconf.d/langpacks.conf
如果提示被锁定就执行命令:
# rm /var/run/yum.id
第三:安装需要的基本工具(这里安装的pip是为了安装docker-compose),先保证curl命令和git可用
# yum install git
# yum install curl
安装pip
# yum -y install epel-release
# yum install python-pip --安装pip
# pip install --upgrade pip --对安装好的pip进行升级
更新软件包(需要几分钟的时间)
# yum update
第一步:安装docker_ce版
Tips:如果已经安装了老版的docker,请先卸载。
# yum remove docker docker-common docker-selinux docker-engine
安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的:
# yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum源:
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
查看所有的docker版本:
# yum list docker-ce --showduplicates | sort -r
安装docker:
# yum install docker-ce
可以选择安装版本# yum install
2.启动Docker服务,查看Docker运行状态并设置Docker开机启动:
# service docker start --设置服务启动
# service docker status --查看运行状态
# systemctl enable docker --设置开机启动
执行命令docker version,如果出现下图,说明安装成功。(失败了卸载重新安装)
3.配置docker加速器(如果能就不用配置加速):
Docker安装完成之后,最好配置国内的Docker Hub,因为默认的Docker Hub在国外,安装会比较慢,这样拉取镜像的速度会很快。国内的镜像仓库有许多,例如:DaoCloud,阿里云,网易蜂巢,灵雀云等都可以选择,这里选择用阿里云进行镜像加速,网址:https://cr.console.aliyun.com/cn-hangzhou/mirrors 注册一个帐号。然后查看Docker Hub 镜像站点。指导文档写的很清楚。拷贝其中的内容执行即可。内容如下:https后面的应该是你自己的镜像地址。
# mkdir -p /etc/docker
# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://jbpz0ctk.mirror.aliyuncs.com"]
}
EOF
# systemctl daemon-reload
# systemctl restart docker
Docker-compose是支持通过模板脚本批量创建docker容器的一个组件,它可以根据配置文件自动构建、管理、编排一组容器。这里简单介绍下两种安装docker-compose的方式,第一种方式相对简单,但是由于网络问题,常常安装不上,并且经常会断开,第二种方式略微麻烦,但是安装过程比较稳定。
方法一:使用curl命令安装(参照官网给出的方法,需要网络较好)
# sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
你可以通过修改URL中的版本,可以自定义你需要的版本。待安装完成之后,执行查询版本的命令,如下所示安装成功:
# docker-compose --version
方法二:用pip安装
用pip安装docker-compose:
# pip install docker-compose
这里可能会报错: Cannot uninstall ‘requests’. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
解决办法:
# pip install docker-compose --ignore-installed requests
待安装完成之后,执行查询版本的命令,如下所示安装成功:
# docker-compose --version
前往GO语言的官网https://golang.org/dl/下载最新版本的安装包,没的同学就前往GO语言中文网https://studygolang.com/dl或者GO中国https://www.golangtc.com/download下载最新版本的安装包。在网络较好前提下也可以直接执行下面的curl命令下载最新版本的安装包。目前linux的最新版本为go1.11.linux-amd64.tar.gz。
# cd /opt
# mkdir golang
# cd golang
# curl -O https://storage.googleapis.com/golang/go1.11.linux-amd64.tar.gz
下载完成之后执行解压命令,解压到当前目录下。
# tar -zxf go1.10.1.linux-amd64.tar.gz
# cd /opt
# mkdir gopath
网络不好的情况下容易下载失败,此时就可以手动下载安装包利用PSCP软件将安装包拷贝到虚拟机系统下,然后同样执行解压命令,将安装包解压到/opt/golang文件夹下。在/etc/profile中配置go的环境变量,将下面的配置信息写入profile,然后存盘并退出。
# vim /etc/profile
写入下面的环境变量配置信息
export GOROOT=/opt/golang/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=/opt/gopath
然后刷新一下
# source /etc/profile
查看go语言版本
# go version
Tips:这里解释一点,go语言安装在哪里都可以,但是配置环境变量时一定要清晰自己gopath下目录的设置,因为后面fabric源码一定要放在gopath目录下才能成功运行
安装gcc,这里yum安装的gcc是4.8.5版本的。
# yum install gcc gcc-c++
# gcc -v
安装Node.js,前往Node.js选择对应版本下载,这里选择node-v9.9.0.tar.gz这个版本。(这里如果不着急开发,可以先选择跳过安装Node.js,因为它不是运行fabric官方例子的必备环境,而是SDK开发所需的环境。安装高版本的Node.js需要高版本的gcc支持,升级gcc需要花费很长时间)
# wget https://npm.taobao.org/mirrors/node/v9.9.0/node-v9.9.0.tar.gz
解压到/usr/local目录下
# tar -C /usr/local -xzf node-v9.9.0.tar.gz
此时gcc的版本为4.8.5,执行编译fabric例子足够用。但是如果要支持新版的Node.js,则需要我们手动升级gcc,因为Node.js8.7.0在编译时要求gcc版本在4.9.4+版本才行。若已为最新版请跳过以下步骤,接下来手动升级gcc,前往http://ftp.gnu.org/gnu/gcc/下载你想要的版本,这里选择gcc-7.3.0。
获取安装包并解压
# wget http://ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz
# tar -C /usr/local -xzf gcc-7.3.0.tar.gz
# cd /usr/local/gcc-7.3.0
进入解压后的gcc文件夹,下载供编译需求的依赖项
# ./contrib/download_prerequisites
建立一个文件夹存放编译文件
# mkdir build
# cd build
# ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
# make (此处make编译需要大量的时间,如果你的虚拟机配置不高,编译时间很长大约2个小时,你可以选择出去跑几圈再回来)
# make install
# reboot
重启之后再次执行gcc -v,出现下图gcc版本7.3.0说明升级成功。
升级之后,如果我们直接安装编译Node.js会出现问题,原因是升级gcc时,生成的动态库没有替换老版本gcc动态库导致的。所以先查找编译gcc时生成的最新动态库。
# find / -name "libstdc++.so*"
找到最新的动态库,结果如下:
将找到的动态库libstdc++.so.6.0.21复制到/usr/lib64
# cp /usr/local/gcc-7.3.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.24 /usr/lib64
切换到工作目录至/usr/lib64,删除原来的软连接,将默认库的软连接指向最新动态库
# cd /usr/lib64
# rm -rf libstdc++.so.6
# ln -s libstdc++.so.6.0.24 libstdc++.so.6
替换之后,接着再继续安装Node.js
# cd /usr/local/node-v9.9.0/
# ./configure
# make
# make install
# reboot
重启之后输入命令检查是否安装成功,出现下图显示版本号则正常。
# node -v
接着安装npm
# npm install npm -g
# npm -v
gcc与Node.js安装具体可以参考下面这两篇博客:
CentOS7 中安装 gcc:http://www.cnblogs.com/lpbottle/p/install_gcc.html
CentOS7 中安装 Nodejs:https://www.cnblogs.com/lpbottle/p/7733397.html
下载Fabric源码是因为要用到源码中提到的列子和工具,工具编译需要用到go语言环境,因此需要把源码目录放到$GOPATH下。通过前面对go的安装配置,$GOPATH设置为/opt/gopath。
# mkdir -p /opt/gopath/src/github.com/hyperledger
# cd /opt/gopath/src/github.com/hyperledger
# git clone https://github.com/hyperledger/fabric.git
这个网不好的情况下可能需要等待一小段时间,等完成后,我们可以在hyperledger/fabric中找到所有的最新的源代码。由于Fabric一直在更新,所有我们并不需要最新最新的源码,需要切换到v1.0.0版本的源码即可:
# cd /opt/gopath/src/github.com/hyperledger/fabric
# git checkout v1.0.0
# ls
进入e2e_cli文件夹下,下载所需的docker镜像,这样就可以下载所有需要的Fabric Docker镜像了。由于我们设置了国内的镜像,所以下载应该是比较快的。
# cd /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/
# source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0
这里需要等待一小段时间,拉取所需的镜像。由于我们设置了国内的镜像,所以下载应该是比较快的。镜像下载完成之后,会自动显示下载完成的镜像,我们也可以运行一下命令检查下载的镜像列表
# docker images
我们仍然停留在e2e_cli文件夹,这里提供了启动、关闭Fabric网络的自动化脚本。在启动Fabric网络之前,先修改一个阻塞执行的bug。(注:fabric最新代码已修复该bug,但我们拉取的是V1.0.0版本的源码,所以需要手动修改该bug) 进入e2e_cli/base目录,修改该下的base/peer-base.yaml文件:
# vim base/peer-base.yaml
这里将
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2ecli_default
修改为:
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2e_cli_default
完成之后,执行一个命令会自动运行Example02 ChainCode的测试:
# ./network_setup.sh up
这个脚本做了一下一系列操作:
1.编译生成Fabric公私钥、证书的程序,程序在目录:fabric/release/linux-amd64/bin
2.基于configtx.yaml生成创世区块和通道相关信息,并保存在channel-artifacts文件夹。
3.基于crypto-config.yaml生成公私钥和证书信息,并保存在crypto-config文件夹中。
4.基于docker-compose-cli.yaml启动1Orderer+4Peer+1CLI的Fabric容器。
5.在CLI启动的时候,会运行scripts/script.sh文件,这个脚本文件包含了创建Channel,加入Channel,安装Example02,运行Example02等功能。
最后运行完毕,我们可以看到这样的界面,说明整个Fabric网络已经跑通了。
测试fabric网络,我们仍然是以现在安装好的Example02为例,在官方例子中,channel名字是mychannel,链码的名字是mycc。fabric提供了SDK和CLI两种交互方式,这里不讨论SDK的方式。我们首先进入CLI执行peer命令,先Ctrl+C结束,然后输入以下命令进入。
# docker exec -it cli bash
进入这样的一个状态下,说明我们已经进入容器内部的peer节点中,可以进行相关吗命令操作,查询余额,例如查询a账户的余额。
# peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
看到query result:90。然后,我们试一试把a账户的余额再转20元给b账户。
# peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}'
看到 INFO 00a Chaincode invoke successful. result: status:200。我们在执行查询操作,发现a确实是少了20。到此为止就一切正常。最后我们要关闭Fabric网络,首先需要运行exit命令退出cli容器。关闭Fabric的命令与启动类似,命令为:
退出容器命令。
# exit
关闭fabric命令。
# ./network_setup.sh down
停止所有容器并删除。
到此为止,单机的例子算是已经部署成功了,接下来就继续部署多机环境。
多机部署与单机非常类似。首先可以根据官方Fabric自带的e2e_cli列子中的集群方案来生成我们自己的集群,与案例不同的是我们需要把容器都分配到不同的服务器上,彼此之间通过网络来进行通信,网络构建完成后则进行相关的channel和chaincode操作。
这里申请了五台服务器,所有的服务器均是按照上述e2e_cli环境构建与测试步骤配置,计划其中四台服务器运行peer节点,另外一台服务器运行orderer节点。
名称 |
IP地址 |
节点标识 |
节点Hostname |
Organization |
Server1 |
192.168.1.103 |
orderer |
orderer.example.cn |
Orderer |
Server2 |
192.168.1.104 |
sp0 |
peer0.org1.example.cn |
Org1 |
Server3 |
192.168.1.105 |
Sp1 |
Peer1.org1.example.cn |
Org1 |
Server4 |
192.168.1.106 |
Sp2 |
peer0.org2.example.cn |
Org2 |
Server5 |
192.168.1.107 |
Sp3 |
Peer1.org2.example.cn |
Org2 |
公私钥和证书是用于Server与Server之间的安全通信,另外要创建channel并让其它节点加入channel就需要创世区块,这些必备文件都可以通过一个命令生成,并且官方已经给出了脚本,在如下目录中的文件:
/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/ generateArtifacts.sh
使用generateArtifacts.sh生成证书和config.tx,具体执行命令如下:
# bash generateArtifacts.sh mychannel
这里创建了5台服务器,在任意一台服务器的该目录下执行此项命令即可,将会生成两个目录,它们分别为channel-artifacts和crypto-config,两个目录的结果和含义如下视图:
在上述目录里的文件用于orderer创建channel,它们根据configex.yaml的配置生成。
在上述目录里有orderer和peer的证书、私钥和用于通信加密的tls证书等文件,它通过configex.yaml配置文件生成。
根据之前所述的gopath目录等配置方案,我们假定所有的服务器都是按照上述单机操作文档的配置来操作,所有服务器都有Fabric源码且目录为
/opt/gopath/src/github.com/hyperledger/fabric,我们在server1上执行命令生成构建Fabric网络所需的成员证书等必要材料:
# bash generateArtifacts.sh mychannel
该命令只需在其中某一台服务器上运行一次即可,其它服务器无需再次运行。在运行该命令的服务器/opt/...../e2e_cli目录下会生成channel-artifacts和crypto-config目录,第二步已经提到过。此时需要把它们拷贝到其它服务器相同的e2e_cli目录下,如果在其它服务器中已经存在该目录,则先把此目录删除。
当所有服务器都有同一个channel-artifacts和crypto-config目录后,接下来就开始配置compose文件。
e2e_cli中提供了多个yaml文件,我们可以基于docker-compose-cli.yaml文件创建,具体可执行如下命令:
# cp docker-compose-cli.yaml docker-compose-peer.yaml
然后修改docker-compose-peer.yaml,去掉orderer的配置,只保留一个peer和cli,因为我们要多级部署,节点与节点之前又是通过主机名通讯,所以需要修改容器中的host文件,也就是extra_hosts设置,修改后的peer配置如下:
同样,cli也需要能够和各个节点通讯,所以cli下面也需要添加extra_hosts设置,去掉无效的依赖,并且去掉command这一行,因为我们是每个peer都会有个对应的客户端,也就是cli,所以我只需要去手动执行一次命令,而不是自动运行。修改后的cli配置如下:
之前单机模式下,4个peer会映射主机不同的端口,但是我们在多机部署的时候是不需要映射不同端口的,所以需要修改base/docker-compose-base.yaml文件,将所有peer的端口映射都改为相同的:
ports:
- 7051:7051
- 7052:7052
- 7053:7053
与peer0.org1.example.com节点compose文件配置一样,不过需要将启动的容器改为peer1.org1.example.com,并且添加peer0.org1.example.com的IP映射,对应的cli中也改成对peer1.org1.example.com的依赖。这是修改后的peer1.org1.example.com上的配置示例:
与上述类似,再次设置peer0.org2.example.com及peer1.org2.example.com节点compose配置文件。peer0.org2.example.com与peer0.org1.example.com类似,
peer1.org2.example.com与peer1.org1.example.com类似。
CLI的配置同之前的一模一样。没个节点的端口文件别忘记都改成相同的。
与创建peer的配置文件类似,我们也复制一个yaml文件出来进行修改:
# cp docker-compose-cli.yaml docker-compose-orderer.yaml
orderer服务器上我们只需要保留order设置,其他peer和cli设置都可以删除。orderer可以不设置extra_hosts。
以下是order compose的配置示例:
启动orderer节点服务
上述操作完成后,此时各节点的compose配置文件及证书验证目录都已经准备完成,可以开始尝试启动多机Fabric集群。首先启动orderer节点,切换至orderer.example.com服务器,即前文指定的192.168.1.103服务器,执行如下命令进入启动docker进程:
# docker-compose -f docker-compose-orderer.yaml up -d
运行完成后我们可以使用docker ps看到运行一个名为orderer.example.com的节点。如下图所示:
启动peer节点服务
切换到peer0.org1.example.com服务器,即前文指定的192.168.1.104服务器,启动本服务器的peer节点和cli,执行如下命令:
# docker-compose -f docker-compose-peer.yaml up -d
运行完毕后我们使用docker ps应该可以看到2个正在运行的容器,如下图:
接下来依次在另外3台服务器(192.168.1.105/192.168.1.106/192.168.1.107)运行启动peer节点容器的命令,执行命令与上述方案一致,如下所示:
# docker-compose -f docker-compose-peer.yaml up -d
现在我们整个Fabric4+1服务器网络已经成型,接下来是创建channel和运行ChainCode。
切换到peer0.org1.example.com(192.168.1.104)服务器上,使用该服务器上的cli来运行创建Channel和运行ChainCode的操作。首先需要进入cli容器,执行如下命令:
# docker exec -it cli bash
进入容器后我们可以看到命令提示变为如下所示:
说明我们已经以root的身份进入到cli容器内部。官方已经提供了完整的创建Channel和测试ChainCode的脚本,并且已经映射到cli容器内部,所以我们只需要在cli内运行如下命令:
# ./scripts/script.sh mychannel
该脚本会一步一步的完成创建通道,将其他节点加入通道,更新锚节点,创建ChainCode,初始化账户,查询,转账,再次查询等链上代码的各个操作都可以自动化实现。直到最后,系统提示如下视图:
说明我们的4+1的Fabric多级部署成功了。我们现在是在peer0.org1.example.com的cli容器内,我们也可以切换到peer0.org2.example.com服务器,运行docker ps命令,可以看到本来是2个容器的,现在已经变成了3个容器,因为ChainCode会创建一个容器,如下视图:
上图第一个docker ps执行只有最开始创建的两个容器,后一个docker ps命令执行后会发现有三个容器。接着我们可以在任意一个节点上执行查询与转账操作,都会出现相应的结果。退出多机部署的fabric,需要分别在对应节点上执行
# docker-compose -f docker-compose-orderer.yaml down
# docker-compose -f docker-compose-peer.yaml down
并删除所有容器,否则下次启动会报错
# docker rm -f $(docker ps -aq)
至此,整个官方给予的Fabric多机集群部署的工作都已经验证完成。
到此整个安装测试结束,此篇仅为测试fabric框架在centos 7 中的安装测试。中间坑无数,如:
go语言需要设置GOPATH、GOROOT环境变量,否则运行./network_setup.sh up命令会出现找不到mycc链。
node.js需要gcc编译支持,而yum install安装的gcc版本过低,不能顺利安装,因此需要对gcc版本升级,而升级的时候make实在实在实在太慢了!!!
docker镜像安装,最好在后面写入版本信息,否则下载的可能与git checkout所对应版本不一致,./network_setup.sh up命令时会出现各类奇葩问题。
单机与多机部署参考链接:
1>链接:https://www.jianshu.com/p/cb032c42c909
作者:四丢皮得,來源:简书。
2>链接:https://www.cnblogs.com/aberic/p/7542167.html
https://www.cnblogs.com/aberic/p/7541470.html
作者:Aberic,来源:博客园
3>链接:https://www.cnblogs.com/zixia/p/8360079.html
作者:紫霞315,来源:博客园
4>链接:https://www.taohui.pub/530.html
作者:陶辉 来源:https://www.taohui.pub/
5>链接:http://www.cnblogs.com/studyzy/p/6973334.html
作者:深蓝居 来源:博客园
CentOS7下安装Docker-Compose:
链接:https://www.cnblogs.com/YatHo/p/7815400.html
hyperledger fabric 1.0环境搭建出错记录:
链接:https://blog.csdn.net/cnq2328/article/details/79664991
链接:https://blog.csdn.net/alphags/article/details/79177044