容器方式获取

除了手动进行本地编译外,还可以采用容器(Docker)镜像的方式快速获取和运行 Fabric 网络,节约本地编译等待的时间。

安装 Docker 服务

Docker 支持 Linux 常见的发行版(如 Redhat/Centos/Ubuntu)和 MacOS 等,推荐使用 1.18 或者更新的版本。

Linux 操作系统下可以通过如下命令来快速安装 Docker:

  1. $ curl -fsSL https://get.docker.com/ | sh

Ubuntu 18.04 中默认采用了 systemd 管理启动服务,配置文件在 /lib/systemd/system/docker.service

对服务配置修改后,需要通过如下命令重启 Docker 服务:

  1. $ sudo systemctl daemon-reload
  2. $ sudo systemctl restart docker.service

对于使用 upstart 管理启动服务的操作系统(如旧版本的 Ubuntu、Debian),则可以采用如下命令重启 Docker 服务:

  1. $ sudo service docker restart

MacOS 下可以通过访问 https://docs.docker.com/docker-for-mac/install 下载 Docker for Mac 安装包进行安装,在此不再赘述。

安装 docker-compose

docker-compose 是 Docker 官方推出的服务模板引擎,可以快速管理由多个 Docker 容器组成的服务。

首先,安装 python-pip 软件包:

  1. $ sudo aptitude install python-pip

安装 docker-compose(推荐为 1.10.0 及以上版本):

  1. $ sudo pip install docker-compose>=1.10.0

获取 Docker 镜像

Docker 镜像可以自行从源码编译,或通过从 DockerHub 仓库下载等方式。

目前,Fabric 项目相关的 Docker 镜像有十几个,这些镜像都在 hyperledger 仓库中,它们之间的相互依赖关系如下图所示。

镜像之间的依赖关系

从用途上,可以可以大致分为三类:核心镜像、辅助镜像和第三方镜像。

核心镜像

提供 Fabric 网络运行的核心功能,目前包括 fabric-peer、fabric-orderer、fabric-ca、fabric-baseos、fabric-ccenv、fabric-javaenv、fabric-nodeenv 共 7 种镜像。如下表所示。

镜像名称 父镜像 功能描述
fabric-peer alpine:3.10 peer 节点镜像,安装了 peer 相关文件。生成过程使用 golang:1.13.4-alpine3.10 镜像。
fabric-orderer alpine:3.10 orderer 节点镜像,安装了 orderer 相关文件。生成过程使用 golang:1.13.4-alpine3.10 镜像。
fabric-ca alpine:3.10 fabric-ca 镜像,安装了 fabric-ca 相关文件。生成过程使用 golang:1.13.4-alpine 镜像。
fabric-baseos alpine:3.10 基础镜像,用来生成其它镜像(包括 Peer、Orderer、fabric-ca),并作为 Go 链码的默认运行时镜像。
fabric-ccenv golang:1.13.4-alpine3.10 支持 Go 语言的链码基础镜像,其中安装了 g++、gcc、git、musl-dev 等,并创建 chaincode 存放目录。在链码实例化过程中作为默认编译环境将链码编译为二进制文件。
fabric-javaenv adoptopenjdk/openjdk11:jdk-11.0.4_11-alpine 支持 Java 语言的链码基础镜像,其中安装了 Gradle、Maven、Java 链码 shim 层等,作为 Java 链码的默认运行时镜像。
fabric-nodeenv node:12.13.0-alpine 支持 Node.Js 语言的链码基础镜像,其中安装了 make、python、g++。在链码实例化过程中作为默认编译环境生成 Node.Js 链码镜像,同时作为 Node.Js 链码运行环境。

辅助镜像

提供支持功能,目前包括 fabric-baseimage、fabric-tools 镜像。如下表所示。

镜像名称 父镜像 功能描述
fabric-baseimage adoptopenjdk:8u222-b10-jdk-openj9-0.15.1 基础镜像,安装了 wget、Golang、Node.JS、Python、Protocol buffer 支持等,用来生成其它镜像。作为运行时可以用来生成 Node.Js 链码镜像。
fabric-tools golang:1.13.4-alpine 安装了 bash、jq、peer、cryptogen、configtxgen 等常见命令,可以作为测试客户端使用。

第三方镜像

主要是一些第三方开源软件,提供支持功能,目前包括 coudhdb、kafka、zookeeper 共 3 种镜像。如下表所示。

镜像名称 父镜像 功能描述
fabric-couchdb debian:stretch-20190910-slim couchdb 镜像,可以启动 couchdb 服务,供 peer 使用。
fabric-kafka adoptopenjdk:8u222-b10-jre-openj9-0.15.1 kafka 镜像,可以启动 kafka 服务,供 orderer 在 kafka 模式下使用。已经不再支持。
fabric-zookeeper adoptopenjdk:8u222-b10-jre-openj9-0.15.1 zookeeper 镜像,可以启动 zookeeper 服务,供 orderer 在 kafka 模式下使用。已经不再支持。

从源码生成镜像

可以通过如下命令在本地快速生成包括 fabric-baseos、fabric-peer、fabric-orderer、fabric-ccenv、fabric-tools 等多个 Docker 镜像:

  1. $ make docker

注意,从源码直接生成的镜像,除了版本标签外,还会带有所编译版本快照信息的标签,例如 amd64-2.0.0-snapshot123456

从 Dockerhub 获取镜像

除了从源码编译外,还可以直接从 Dockerhub 来拉取相关的镜像,命令格式为 docker pull <IMAGE_NAME:TAG>

例如,从社区仓库直接获取 fabric-peer、fabric-orderer、fabric-ca、fabric-tools 等镜像的 2.0.0 版本可以使用如下命令:

  1. $ ARCH=amd64
  2. $ BASEIMAGE_RELEASE=0.4.18
  3. $ PROJECT_VERSION=2.0.0
  4. # 拉取镜像
  5. $ docker pull hyperledger/fabric-peer:$ARCH-$PROJECT_VERSION \
  6. && docker pull hyperledger/fabric-orderer:$ARCH-$PROJECT_VERSION \
  7. && docker pull hyperledger/fabric-ca:$ARCH-$PROJECT_VERSION \
  8. && docker pull hyperledger/fabric-tools:$ARCH-$PROJECT_VERSION \
  9. && docker pull hyperledger/fabric-ccenv:$ARCH-$PROJECT_VERSION \
  10. && docker pull hyperledger/fabric-baseimage:$ARCH-$BASEIMAGE_RELEASE \
  11. && docker pull hyperledger/fabric-baseos:$ARCH-$PROJECT_VERSION

此外,还可以从第三方仓库获取镜像,拉取后可以添加默认的镜像标签别名。

例如,笔者仓库中构建了基于 Golang 基础镜像的相关 fabric 镜像,可以通过如下命令获取:

  1. # 拉取镜像
  2. $ docker pull yeasy/hyperledger-fabric-base:$PROJECT_VERSION \
  3. && docker pull yeasy/hyperledger-fabric-peer:$PROJECT_VERSION \
  4. && docker pull yeasy/hyperledger-fabric-orderer:$PROJECT_VERSION \
  5. && docker pull yeasy/hyperledger-fabric-ca:$PROJECT_VERSION
  6. # 添加标签
  7. $ docker tag yeasy/hyperledger-fabric-peer:$PROJECT_VERSION hyperledger/fabric-peer:$ARCH-$PROJECT_VERSION \
  8. && docker tag yeasy/hyperledger-fabric-orderer:$PROJECT_VERSION hyperledger/fabric-orderer:$ARCH-$PROJECT_VERSION \
  9. && docker tag yeasy/hyperledger-fabric-ca:$PROJECT_VERSION hyperledger/fabric-ca:$ARCH-$PROJECT_VERSION \
  10. && docker tag yeasy/hyperledger-fabric-peer:$PROJECT_VERSION hyperledger/fabric-tools:$ARCH-$PROJECT_VERSION \
  11. && docker tag yeasy/hyperledger-fabric-base:$PROJECT_VERSION hyperledger/fabric-ccenv:$ARCH-$PROJECT_VERSION \
  12. && docker tag yeasy/hyperledger-fabric-base:$PROJECT_VERSION hyperledger/fabric-baseimage:$ARCH-$BASEIMAGE_RELEASE \
  13. && docker tag yeasy/hyperledger-fabric-base:$PROJECT_VERSION hyperledger/fabric-baseos:$ARCH-$PROJECT_VERSION

注:BASEIMAGE_RELEASE 是基础镜像 fabric-baseimage 的版本号;PROJECT_VERSION 是具体版本号。这些版本号需要跟所使用的 Fabric 配置中保持一致。

镜像 Dockerfile

读者也可自行通过编写 Dockefile 的方式来生成相关镜像。

Dockerfile 中指令跟本地编译过程十分类似,这里给出笔者编写的 fabric-base 镜像、fabric-orderer 镜像和 fabric-peer 镜像等关键镜像的 Dockerfile,供读者参考使用。

fabric-base 镜像

笔者提供的 fabric-base 镜像基于 golang:1.13 镜像生成,可以作为 Go 链码容器的基础镜像。该镜像中包含了 Fabric 相关的代码,并安装了一些有用的工具,包括 gotools、 configtxgen、configtxlator、cryptogen、discover、token、idemixgen 等。

该 Dockerfile 内容如下,也可从 https://github.com/yeasy/docker-hyperledger-fabric-base 下载获取:

  1. # https://github.com/yeasy/docker-hyperledger-fabric-base
  2. #
  3. # Dockerfile for Hyperledger fabric base image.
  4. # If you only need quickly deploy a fabric network, please see
  5. # * yeasy/hyperledger-fabric-peer
  6. # * yeasy/hyperledger-fabric-orderer
  7. # * yeasy/hyperledger-fabric-ca
  8. # Workdir is set to $GOPATH/src/github.com/hyperledger/fabric
  9. # Data is stored under /var/hyperledger/production
  10. FROM golang:1.13
  11. LABEL maintainer "Baohua Yang <yeasy.github.com>"
  12. ENV DEBIAN_FRONTEND noninteractive
  13. # Only useful for this Dockerfile
  14. ENV FABRIC_ROOT=$GOPATH/src/github.com/hyperledger/fabric
  15. ENV CHAINTOOL_RELEASE=1.1.3
  16. # version for the base images (baseos, baseimage, ccenv, etc.)
  17. ENV BASEIMAGE_RELEASE=0.4.18
  18. # BASE_VERSION is used in metadata.Version as major version
  19. ENV BASE_VERSION=2.0.0
  20. # PROJECT_VERSION is required in core.yaml for fabric-baseos and fabric-ccenv
  21. ENV PROJECT_VERSION=2.0.0
  22. # generic golang cc builder environment (core.yaml): builder: $(DOCKER_NS)/fabric-ccenv:$(ARCH)-$(PROJECT_VERSION)
  23. ENV DOCKER_NS=hyperledger
  24. # for golang or car's baseos for cc runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASEIMAGE_RELEASE)
  25. ENV BASE_DOCKER_NS=hyperledger
  26. ENV LD_FLAGS="-X github.com/hyperledger/fabric/common/metadata.Version=${PROJECT_VERSION} \
  27. -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric \
  28. -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger \
  29. -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger"
  30. # -X github.com/hyperledger/fabric/common/metadata.Experimental=true \
  31. # -linkmode external -extldflags '-static -lpthread'"
  32. # Peer config path
  33. ENV FABRIC_CFG_PATH=/etc/hyperledger/fabric
  34. RUN mkdir -p /var/hyperledger/production \
  35. $GOPATH/src/github.com/hyperledger \
  36. $FABRIC_CFG_PATH \
  37. /chaincode/input \
  38. /chaincode/output
  39. # Install development dependencies
  40. RUN apt-get update \
  41. && apt-get install -y apt-utils python-dev \
  42. && apt-get install -y libsnappy-dev zlib1g-dev libbz2-dev libyaml-dev libltdl-dev libtool \
  43. && apt-get install -y python-pip \
  44. && apt-get install -y vim tree jq unzip \
  45. && rm -rf /var/cache/apt
  46. # Install chaintool
  47. #RUN curl -L https://github.com/hyperledger/fabric-chaintool/releases/download/v0.10.3/chaintool > /usr/local/bin/chaintool \
  48. RUN curl -fL https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/chaintool-${CHAINTOOL_RELEASE}/hyperledger-fabric-chaintool-${CHAINTOOL_RELEASE}.jar > /usr/local/bin/chaintool \
  49. && chmod a+x /usr/local/bin/chaintool
  50. # install gotools
  51. RUN go get github.com/golang/protobuf/protoc-gen-go \
  52. && go get github.com/maxbrunsfeld/counterfeiter \
  53. && go get github.com/axw/gocov/... \
  54. && go get github.com/AlekSi/gocov-xml \
  55. && go get golang.org/x/tools/cmd/goimports \
  56. && go get golang.org/x/lint/golint \
  57. && go get github.com/estesp/manifest-tool \
  58. && go get github.com/client9/misspell/cmd/misspell \
  59. && go get github.com/estesp/manifest-tool \
  60. && go get github.com/onsi/ginkgo/ginkgo
  61. # Clone the Hyperledger Fabric code and cp sample config files
  62. RUN cd $GOPATH/src/github.com/hyperledger \
  63. && wget https://github.com/hyperledger/fabric/archive/v${PROJECT_VERSION}-beta.zip \
  64. && unzip v${PROJECT_VERSION}-beta.zip \
  65. && rm v${PROJECT_VERSION}-beta.zip \
  66. && mv fabric-${PROJECT_VERSION}-beta fabric \
  67. && echo "* hard nofile 65536" >> /etc/security/limits.conf \
  68. && echo "* soft nofile 65536" >> /etc/security/limits.conf \
  69. && cp -r $FABRIC_ROOT/sampleconfig/* $FABRIC_CFG_PATH/
  70. # Add external farbric chaincode dependencies
  71. RUN go get github.com/hyperledger/fabric-chaincode-go/shim \
  72. && go get github.com/hyperledger/fabric-protos-go/peer
  73. # Install configtxgen, cryptogen, configtxlator, discover and idemixgen
  74. RUN cd $FABRIC_ROOT/ \
  75. && CGO_CFLAGS=" " go install -tags "" github.com/hyperledger/fabric/cmd/configtxgen \
  76. && CGO_CFLAGS=" " go install -tags "" github.com/hyperledger/fabric/cmd/cryptogen \
  77. && CGO_CFLAGS=" " go install -tags "" github.com/hyperledger/fabric/cmd/configtxlator \
  78. && CGO_CFLAGS=" " go install -tags "" -ldflags "-X github.com/hyperledger/fabric/cmd/discover/metadata.Version=2.0.0" github.com/hyperledger/fabric/cmd/discover \
  79. #&& CGO_CFLAGS=" " go install -tags "" -ldflags "-X github.com/hyperledger/fabric/cmd/token/metadata.Version=2.0.0" github.com/hyperledger/fabric/cmd/token \
  80. && CGO_CFLAGS=" " go install -tags "" github.com/hyperledger/fabric/cmd/idemixgen
  81. # The data and config dir, can map external one with -v
  82. VOLUME /var/hyperledger
  83. # Temporarily fix the `go list` complain problem, which is required in chaincode packaging, see core/chaincode/platforms/golang/platform.go#GetDepoymentPayload
  84. ENV GOROOT=/usr/local/go
  85. WORKDIR $FABRIC_ROOT
  86. # This is only a workaround for current hard-coded problem when using as the fabric-baseimage.
  87. RUN ln -s $GOPATH /opt/gopath
  88. LABEL org.hyperledger.fabric.version=${PROJECT_VERSION} \
  89. org.hyperledger.fabric.base.version=${BASEIMAGE_RELEASE}

该镜像也可以用作替代 hyperledger/fabric-baseimage:latest 镜像。

fabric-orderer 镜像

fabric-orderer 镜像基于 fabric-base 生成,编译安装了 orderer 组件。

参考 Dockerfile 内容如下,可从 https://github.com/yeasy/docker-hyperledger-fabric-orderer 下载获取:

  1. # https://github.com/yeasy/docker-hyperledger-fabric-orderer
  2. #
  3. # Dockerfile for Hyperledger fabric-orderer image.
  4. FROM yeasy/hyperledger-fabric-base:2.0.0
  5. LABEL maintainer "Baohua Yang <yeasy.github.com>"
  6. EXPOSE 7050
  7. ENV ORDERER_GENERAL_LOCALMSPDIR $FABRIC_CFG_PATH/msp
  8. ENV ORDERER_GENERAL_LISTENADDRESS 0.0.0.0
  9. # ENV CONFIGTX_ORDERER_ORDERERTYPE=etcdraft
  10. RUN mkdir -p $FABRIC_CFG_PATH $ORDERER_GENERAL_LOCALMSPDIR
  11. # Install fabric orderer
  12. RUN CGO_CFLAGS=" " go install -tags "" -ldflags "$LD_FLAGS" github.com/hyperledger/fabric/cmd/orderer \
  13. && go clean
  14. CMD ["orderer", "start"]

fabric-peer 镜像

fabric-peer 镜像基于 fabric-base 生成,编译安装了 peer 命令。

Dockerfile 内容如下,可从 https://github.com/yeasy/docker-hyperledger-fabric-peer 下载获取:

  1. # https://github.com/yeasy/docker-hyperledger-fabric-peer
  2. #
  3. # Dockerfile for Hyperledger peer image. This actually follow yeasy/hyperledger-fabric
  4. # image and add default start cmd.
  5. # Data is stored under /var/hyperledger/production
  6. FROM yeasy/hyperledger-fabric-base:2.0.0
  7. LABEL maintainer "Baohua Yang <yeasy.github.io>"
  8. # Peer
  9. EXPOSE 7051
  10. # ENV CORE_PEER_MSPCONFIGPATH $FABRIC_CFG_PATH/msp
  11. # Install fabric peer
  12. RUN CGO_CFLAGS=" " go install -tags "" -ldflags "$LD_FLAGS" github.com/hyperledger/fabric/cmd/peer \
  13. && go clean
  14. # First need to manually create a chain with `peer channel create -c test_chain`, then join with `peer channel join -b test_chain.block`.
  15. CMD ["peer","node","start"]

fabric-ca 镜像

fabric-ca 镜像基于 golang:1.13 镜像生成,提供对证书的签发功能。

Dockerfile 内容如下,可从 https://github.com/yeasy/docker-hyperledger-fabric-ca 下载获取。

  1. # https://github.com/yeasy/docker-hyperledger-fabric-ca
  2. #
  3. # Dockerfile for Hyperledger fabric-ca image.
  4. # If you need a peer node to run, please see the yeasy/hyperledger-peer image.
  5. # Workdir is set to $GOPATH/src/github.com/hyperledger/fabric-ca
  6. # More usage infomation, please see https://github.com/yeasy/docker-hyperledger-fabric-ca.
  7. FROM golang:1.13
  8. LABEL maintainer "Baohua Yang <yeasy.github.com>"
  9. ENV PROJECT_VERSION 2.0.0
  10. # ca-server and ca-client will check the following env in order, to get the home cfg path
  11. ENV FABRIC_CA_HOME /etc/hyperledger/fabric-ca-server
  12. ENV FABRIC_CA_SERVER_HOME /etc/hyperledger/fabric-ca-server
  13. ENV FABRIC_CA_CLIENT_HOME $HOME/.fabric-ca-client
  14. ENV CA_CFG_PATH /etc/hyperledger/fabric-ca
  15. # This is to simplify this Dockerfile
  16. ENV FABRIC_CA_ROOT $GOPATH/src/github.com/hyperledger/fabric-ca
  17. # Usually the binary will be installed into $GOPATH/bin, but we add local build path, too
  18. ENV PATH=$FABRIC_CA_ROOT/bin:$PATH
  19. #ARG FABRIC_CA_DYNAMIC_LINK=false
  20. # fabric-ca-server will open service to '0.0.0.0:7054/api/v1/'
  21. EXPOSE 7054
  22. RUN mkdir -p $GOPATH/src/github.com/hyperledger \
  23. $FABRIC_CA_SERVER_HOME \
  24. $FABRIC_CA_CLIENT_HOME \
  25. $CA_CFG_PATH \
  26. /var/hyperledger/fabric-ca-server
  27. # Need libtool to provide the header file ltdl.h
  28. RUN apt-get update \
  29. && apt-get install -y libtool unzip \
  30. && rm -rf /var/cache/apt
  31. # Install yq to update config for fabric-ca
  32. RUN wget -O /go/bin/yq https://github.com/mikefarah/yq/releases/download/2.4.1/yq_linux_amd64 \
  33. && chmod a+x /go/bin/yq
  34. # clone and build ca
  35. RUN cd $GOPATH/src/github.com/hyperledger \
  36. && wget https://github.com/hyperledger/fabric-ca/archive/v${PROJECT_VERSION}.zip \
  37. && unzip v${PROJECT_VERSION}.zip \
  38. && rm v${PROJECT_VERSION}.zip \
  39. && mv fabric-ca-${PROJECT_VERSION} fabric-ca \
  40. # This will install fabric-ca-server and fabric-ca-client into $GOPATH/bin/
  41. && go install -ldflags "-X github.com/hyperledger/fabric-ca/lib/metadata.Version=$PROJECT_VERSION -linkmode external -extldflags '-static -lpthread'" github.com/hyperledger/fabric-ca/cmd/... \
  42. # Copy example ca and key files
  43. #&& cp $FABRIC_CA_ROOT/images/fabric-ca/payload/*.pem $FABRIC_CA_HOME/ \
  44. && go clean
  45. VOLUME $FABRIC_CA_SERVER_HOME
  46. VOLUME $FABRIC_CA_CLIENT_HOME
  47. WORKDIR $FABRIC_CA_ROOT
  48. # if no config exists under $FABRIC_CA_HOME, will init fabric-ca-server-config.yaml and fabric-ca-server.db
  49. CMD ["bash", "-c", "fabric-ca-server start -b admin:adminpw"]
  50. #CMD ["bash", "-c", "fabric-ca-server start --ca.certfile $FABRIC_CA_HOME/ca-cert.pem --ca.keyfile $FABRIC_CA_HOME/ca-key.pem -b admin:adminpw -n test_ca"]