Hyperledger-fabric_麒麟系统_arm64搭建
<h1 id="hyperledger-fabric_麒麟系统_arm64搭建">Hyperledger-fabric_麒麟系统_arm64搭建</h1><h2 id="准备环境">准备环境</h2>
<h3 id="服务器准备">服务器准备</h3>
<p>自己没有麒麟系统没关系。花几十块钱去华为云上购买一个<br>
规格: 鲲鹏通用计算增强型 | kc1.small.1 | 1vCPUs | 1GiB<br>
镜像: CentOS 7.6 64bit with ARM</p>
<h3 id="安装docker">安装docker</h3>
<pre><code>yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-18.06.3.ce docker-ce-cli-18.06.3.ce containerd.io
</code></pre>
<h3 id="安装go">安装go</h3>
<p>网站:https://studygolang.com/dl<br>
查1.16版本arm64的go:<br>
<img src="https://img2022.cnblogs.com/blog/1444147/202204/1444147-20220428153158927-2097873752.png"><br>
<img src="https://img2022.cnblogs.com/blog/1444147/202204/1444147-20220428153238156-187221793.png"></p>
<pre><code>#wget https://studygolang.com/dl/golang/go1.16.15.linux-arm64.tar.gz
#tar zxvf go1.16.15.linux-arm64.tar.gz
#rm /usr/lib/golang/* -rf
#cp go/*/usr/lib/golang/ -rf
#go version显示
go version go1.16.15 linux/arm64
</code></pre>
<h3 id="下载go基础镜像">下载go基础镜像</h3>
<pre><code>docker pull docker.io/golang:1.16.10
</code></pre>
<p>查看镜像:<br>
<img src="https://img2022.cnblogs.com/blog/1444147/202204/1444147-20220428163318881-1845525069.png"></p>
<h2 id="制作镜像">制作镜像</h2>
<p>制作镜像是参考官方网站进行修改。</p>
<h3 id="目录结构">目录结构</h3>
<p>参考官方网站,创建目录,目录树如下:</p>
<pre><code>/data/
├── build
│ └── images
└── images
├── fabric
│ ├── baseos
│ ├── ccenv
│ ├── orderer
│ ├── peer
│ └── tools
└── fabric-ca
</code></pre>
<h3 id="准备源码">准备源码</h3>
<ol>
<li>
<p>fabric源码<br>
从官方网站:https://github.com/hyperledger/fabric拉取源码,版本是 v2.2.0<br>
拉取后存放在/data/fabric<br>
<img src="https://img2022.cnblogs.com/blog/1444147/202204/1444147-20220428155748074-552172874.png"><br>
可以参考官方网站的dockerfile进行相应的修改<br>
<img src="https://img2022.cnblogs.com/blog/1444147/202204/1444147-20220428155959185-1647410406.png"><br>
参考官方网站的/data/fabric/Makefile 文件进行修改进行本次/data/Makefile的编写</p>
</li>
<li>
<p>fabric-ca源码<br>
下载:https://github.com/hyperledger/fabric-ca/archive/refs/tags/v1.5.2.tar.gz<br>
解压安装包放在/data/fabric-ca<br>
参考官方网站的fabric-ca/Makefile 文件进行本次/data/Makefile的编写。<br>
参考官方网站的fabric-ca/images/fabric-ca/Dockerfile进行修改</p>
</li>
</ol>
<pre><code>mv /data/fabric-ca /data/images/fabric-ca/
</code></pre>
<h3 id="编写makefile">编写Makefile</h3>
<p>vi /data/Makefile</p>
<pre><code>.DEFAULT_GOAL := all
DockerfileArch = Dockerfile
GO_VER ?= 1.14.4
BASE_VERSION = 2.2.0
ALPINE_VER ?= 3.11
# build tag
EXTRA_VERSION ?= $(shell cd src/fabric && git rev-parse --short HEAD) || true
PROJECT_VERSION=$(BASE_VERSION)-snapshot-$(EXTRA_VERSION)
BASE_DOCKER_LABEL=org.hyperledger.fabric
DOCKER_NS = arm64
TWO_DIGIT_VERSION = $(shell echo $(BASE_VERSION) | cut -d '.' -f 1,2)
ARCH=$(shell go env GOARCH)
DOCKER_TAG=$(ARCH)-$(PROJECT_VERSION)
# fabric 1
RELEASE_IMAGES = baseos ccenv orderer peer tools
# fabric 2
RELEASE_EXES = orderer $(TOOLS_EXES)
TOOLS_EXES = configtxgen configtxlator cryptogen discover idemixgen peer
# fabric-ca
RELEASE_FABRIC-CA = fabric-ca
# fabric-ca
RELEASE_FABRIC-CA =fabric-ca-server fabric-ca-client
#build
BUILD_IMAGES_DIR ?= build
BUILD_DIR ?= build/bin/fabric
FABRIC_CA_BUILD_DIR ?= build/bin/fabric-ca
MINIO_BUILD_DIR ?= build/bin/minio
DBUILD = docker build --force-rm $(DOCKER_BUILD_FLAGS)
# defined in common/metadata/metadata.go
PKGFABRIC = github.com/hyperledger/fabric
pkgmapfabric.configtxgen := $(PKGFABRIC)/cmd/configtxgen
pkgmapfabric.configtxlator:= $(PKGFABRIC)/cmd/configtxlator
pkgmapfabric.cryptogen := $(PKGFABRIC)/cmd/cryptogen
pkgmapfabric.discover := $(PKGFABRIC)/cmd/discover
pkgmapfabric.idemixgen := $(PKGFABRIC)/cmd/idemixgen
pkgmapfabric.orderer := $(PKGFABRIC)/cmd/orderer
pkgmapfabric.peer := $(PKGFABRIC)/cmd/peer
METADATA_VAR = Version=$(BASE_VERSION)
METADATA_VAR += CommitSHA=$(EXTRA_VERSION)
METADATA_VAR += BaseDockerLabel=$(BASE_DOCKER_LABEL)
METADATA_VAR += DockerNamespace=$(DOCKER_NS)
# fabric-ca
PKGFABRIC-CA = github.com/hyperledger/fabric-ca
pkgmapfabficca.fabric-ca-client := $(PKGFABRIC-CA)/cmd/fabric-ca-client
pkgmapfabficca.fabric-ca-server:= $(PKGFABRIC-CA)/cmd/fabric-ca-server
.PHONY: fabric
fabric: $(RELEASE_EXES)
.PHONY: $(RELEASE_EXES)
$(RELEASE_EXES): %: $(BUILD_DIR)/%
$(BUILD_DIR)/%: GO_LDFLAGS = $(METADATA_VAR:%=-X $(PKGFABRIC)/common/metadata.%)
$(BUILD_DIR)/%:
@echo "Building $(pkgmapfabric.$(@F)) => $@ "
@mkdir -p $(@D)
@cd src/fabric && GOBIN=$(abspath $(@D)) go install -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmapfabric.$(@F))
@touch $@
.PHONY: fabric-ca
fabric-ca: $(RELEASE_FABRIC-CA)
.PHONY: $(RELEASE_FABRIC-CA)
$(RELEASE_FABRIC-CA): %: $(FABRIC_CA_BUILD_DIR)/%
$(FABRIC_CA_BUILD_DIR)/%: GO_LDFLAGS = $(METADATA_VAR:%=-X $(PKGFABRIC-CA)/common/metadata.%)
$(FABRIC_CA_BUILD_DIR)/%:
@echo "Building $@"
@mkdir -p $(@D)
@cd src/fabric-ca && GOBIN=$(abspath $(@D))go install -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmapfabficca.$(@F))
@touch build/images/fabric-ca || true
.PHONY: fabric-docker
fabric-docker:$(RELEASE_IMAGES:%=%-docker)
.PHONY: $(RELEASE_IMAGES:%=%-docker)
$(RELEASE_IMAGES:%=%-docker): %-docker: $(BUILD_IMAGES_DIR)/images/%/$(DUMMY)
$(BUILD_IMAGES_DIR)/images/ccenv/$(DUMMY): BUILD_CONTEXT=images/fabric/ccenv
$(BUILD_IMAGES_DIR)/images/baseos/$(DUMMY):BUILD_CONTEXT=images/fabric/baseos
$(BUILD_IMAGES_DIR)/images/peer/$(DUMMY): BUILD_ARGS=--build-arg GO_TAGS=${GO_TAGS}
$(BUILD_IMAGES_DIR)/images/orderer/$(DUMMY): BUILD_ARGS=--build-arg GO_TAGS=${GO_TAGS}
$(BUILD_IMAGES_DIR)/images/%/$(DUMMY):
@echo "Building Docker image $(DOCKER_NS)/fabric-$*"
@mkdir -p $(@D)
$(DBUILD) -f images/fabric/$*/$(DockerfileArch) \
--build-arg GO_VER=$(GO_VER) \
--build-arg ALPINE_VER=$(ALPINE_VER) \
$(BUILD_ARGS) \
-t $(DOCKER_NS)/fabric-$* ./$(BUILD_CONTEXT)
docker tag $(DOCKER_NS)/fabric-$* $(DOCKER_NS)/fabric-$*:$(BASE_VERSION)
docker tag $(DOCKER_NS)/fabric-$* $(DOCKER_NS)/fabric-$*:$(TWO_DIGIT_VERSION)
docker tag $(DOCKER_NS)/fabric-$* $(DOCKER_NS)/fabric-$*:$(DOCKER_TAG)
@touch $@
.PHONY: fabric-ca-docker
fabric-ca-docker:
@echo "Building Docker image $@F"
$(DBUILD) -f images/fabric-ca/$(DockerfileArch) \
-t $(DOCKER_NS)/fabric-ca images/fabric-ca
docker tag $(DOCKER_NS)/fabric-ca:latest$(DOCKER_NS)/fabric-ca:1.0
@touch build/images/fabric-ca || true
.PHONY: clean-docker
clean-docker:
@echo "Building Docker image nacos"
-@rm -rf build/images/$* || true
.PHONY: all
all: fabric-docker fabric-ca-docker
PROJECT_VERSION=1.0
DOCKER_HUB_USERNAME=
DOCKER_HUB_PASSWORD=
RELEASE_IMAGES = baseos ccenv orderer peer tools fabric-ca
.PHONY: publish-images
publish-images: $(RELEASE_IMAGES:%=%-publish-images)
%-publish-images:
@docker login $(DOCKER_HUB_USERNAME) $(DOCKER_HUB_PASSWORD)
@docker push $(DOCKER_NS)/fabric-$*:$(PROJECT_VERSION)
</code></pre>
<h3 id="编写dockerfile">编写Dockerfile</h3>
<h4 id="fabric-ca">fabric-ca</h4>
<p>参考官方网站:https://github.com/hyperledger/fabric-ca/blob/v1.5.2/images/fabric-ca/Dockerfile<br>
修改Dockerfile:</p>
<pre><code>FROM docker.io/golang:1.16.10 as builder
COPY ./fabric-ca $GOPATH/src/github.com/hyperledger/fabric-ca
WORKDIR $GOPATH/src/github.com/hyperledger
ARG GO_VER
ARG ALPINE_VER
ARG GO_LDFLAGS
ARG GO_TAGS
RUN apt-get update
RUN apt-get install -y gcc binutils-goldmusl-dev
RUNcd $GOPATH/src/github.com/hyperledger/fabric-ca \
&&go install -tags "${GO_TAGS}"-ldflags "${GO_LDFLAGS}" \
github.com/hyperledger/fabric-ca/cmd/fabric-ca-server \
&& go install -tags "${GO_TAGS}"-ldflags "${GO_LDFLAGS}" \
github.com/hyperledger/fabric-ca/cmd/fabric-ca-client
FROM docker.io/golang:1.16.10
RUN apt-get install -y tzdata
ENV FABRIC_CA_HOME /etc/hyperledger/fabric-ca-server
COPY --from=builder /go/bin /usr/local/bin
EXPOSE 7054
CMD fabric-ca-server start -b admin:adminpw
</code></pre>
<h4 id="fabric-baseos">fabric-baseos</h4>
<p>vi /data/images/fabric/baseos/Dockerfile<br>
注意这里添加了普通用户,指定了gid、uid,我们在宿主机上也要创建一样的用户一样的gid、uid</p>
<pre><code>#官方网站该处用了apline
FROM docker.io/golang:1.16.10 as base
RUN apt-get install -y tzdata \
&& addgroup --gid 500 chaincode && adduser --disabled-password --uid 500 --home /home/chaincode --ingroup chaincode chaincode;
USER chaincode
</code></pre>
<h4 id="fabric-ccenv">fabric-ccenv</h4>
<p>vi /data/images/fabric/ccenv/Dockerfile</p>
<pre><code>FROMdocker.io/golang:1.16.10 as base
ENV GOPATH="/go"
RUN apt-get update
#RUN apt-get install -y g++ gcc git musl-dev go
RUN apt-get install -y g++ gcc musl-dev
RUN mkdir -p /chaincode/output /chaincode/input \
&& addgroup --gid 500 chaincode && adduser --disabled-password --uid 500 --home /home/chaincode --ingroup chaincode chaincode \
&& chown -R chaincode:chaincode /chaincode;
USER chaincode
</code></pre>
<h4 id="fabric-orderer">fabric-orderer</h4>
<p>vi /data/images/fabric/orderer/Dockerfile</p>
<pre><code>FROM docker.io/golang:1.16.10 as base
RUNapt-get install -y tzdata
# set up nsswitch.conf for Go's "netgo" implementation
# - https://github.com/golang/go/blob/go1.9.1/src/net/conf.go#L194-L275
# - docker run --rm debian:stretch grep '^hosts:' /etc/nsswitch.conf
FROM docker.io/golang:1.16.10 as golang
COPY ./fabric$GOPATH/src/github.com/hyperledger/fabric
WORKDIR $GOPATH/src/github.com/hyperledger/fabric
RUN apt-get update
RUN apt-get install -y gcc musl-dev bash make
FROM golang as orderer
ARG GO_TAGS
RUN make orderer GO_TAGS=${GO_TAGS}
FROM base
ENV FABRIC_CFG_PATH /etc/hyperledger/fabric
VOLUME /etc/hyperledger/fabric
VOLUME /var/hyperledger
COPY --from=orderer /go/src/github.com/hyperledger/fabric/build/bin /usr/local/bin
COPY --from=orderer /go/src/github.com/hyperledger/fabric/sampleconfig/msp ${FABRIC_CFG_PATH}/msp
COPY --from=orderer /go/src/github.com/hyperledger/fabric/sampleconfig/orderer.yaml ${FABRIC_CFG_PATH}
COPY --from=orderer /go/src/github.com/hyperledger/fabric/sampleconfig/configtx.yaml ${FABRIC_CFG_PATH}
EXPOSE 7050
CMD ["orderer"]
</code></pre>
<h4 id="fabric-peer">fabric-peer</h4>
<p>vi /data/images/fabric/peer/Dockerfile</p>
<pre><code>FROM docker.io/golang:1.16.10 as peer-base
RUN apt-get install -y tzdata \
&& echo 'hosts: files dns' > /etc/nsswitch.conf;
# set up nsswitch.conf for Go's "netgo" implementation
# - https://github.com/golang/go/blob/go1.9.1/src/net/conf.go#L194-L275
# - docker run --rm debian:stretch grep '^hosts:' /etc/nsswitch.conf
FROM docker.io/golang:1.16.10 as golang
COPY ./fabric $GOPATH/src/github.com/hyperledger/fabric
WORKDIR $GOPATH/src/github.com/hyperledger/fabric
RUN apt-get update
RUN apt-get install -y bash gcc make musl-dev
RUN sed -i 's/rdev: s.Rdev/rdev: uint64(s.Rdev)/g' vendor/github.com/docker/docker/pkg/system/stat_linux.go
FROM golang as peer
ARG GO_TAGS
RUN make peer GO_TAGS=${GO_TAGS}
FROM peer-base
ENV FABRIC_CFG_PATH /etc/hyperledger/fabric
VOLUME /etc/hyperledger/fabric
VOLUME /var/hyperledger
COPY --from=peer /go/src/github.com/hyperledger/fabric/build/bin /usr/local/bin
COPY --from=peer /go/src/github.com/hyperledger/fabric/sampleconfig/msp ${FABRIC_CFG_PATH}/msp
COPY --from=peer /go/src/github.com/hyperledger/fabric/sampleconfig/core.yaml ${FABRIC_CFG_PATH}
EXPOSE 7051
CMD ["peer","node","start"]
</code></pre>
<h4 id="fabric-tools">fabric-tools</h4>
<p>vi /data/images/fabric/tools/Dockerfile</p>
<pre><code>FROM docker.io/golang:1.16.10 as golang
COPY ./fabric $GOPATH/src/github.com/hyperledger/fabric
WORKDIR $GOPATH/src/github.com/hyperledger/fabric
RUN apt-get update
RUN apt-get install -y \
bash \
gcc \
make \
musl-dev \
&& sed -i 's/rdev: s.Rdev/rdev: uint64(s.Rdev)/g' vendor/github.com/docker/docker/pkg/system/stat_linux.go;
FROM golang as tools
RUN make configtxgen configtxlator cryptogen peer discover idemixgen
FROM docker.io/golang:1.16.10
# git is required to support `go list -m`
RUN apt-get update
RUN apt-get install -y \
bash \
git \
jq \
tzdata;
ENV FABRIC_CFG_PATH /etc/hyperledger/fabric
VOLUME /etc/hyperledger/fabric
COPY --from=tools /go/src/github.com/hyperledger/fabric/build/bin /usr/local/bin
COPY --from=tools /go/src/github.com/hyperledger/fabric/sampleconfig ${FABRIC_CFG_PATH}
</code></pre>
<h2 id="验证镜像">验证镜像</h2>
<h3 id="打镜像">打镜像</h3>
<pre><code>cd /data
make all
</code></pre>
<h3 id="验证">验证</h3>
<pre><code>docker run -it --name peer1 arm64/fabric-peer:2.2.0 peer version
</code></pre>
<p>如图:<br>
<img src="https://img2022.cnblogs.com/blog/1444147/202204/1444147-20220428162345331-1392441973.png"></p>
<h2 id="遇到的问题和解决办法">遇到的问题和解决办法</h2>
<p>参考官方网站,orderer、peer、fabric-ca 的Dockerfile中使用了两个基础镜像:apline 和 golang<br>
下载基础镜像</p>
<pre><code>docker pull docker.io/golang:1.16.10
docker pull docker.io/apline:3.11
</code></pre>
<p>参考官方网站的dockerfile,比如peer的:</p>
<pre><code># Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
FROM docker.io/alpine:3.11 as peer-base
#FROM docker.io/golang:1.16.10 as peer-base
RUN apt-get install -y tzdata \
&& echo 'hosts: files dns' > /etc/nsswitch.conf;
# set up nsswitch.conf for Go's "netgo" implementation
# - https://github.com/golang/go/blob/go1.9.1/src/net/conf.go#L194-L275
# - docker run --rm debian:stretch grep '^hosts:' /etc/nsswitch.conf
FROM docker.io/golang:1.16.10 as golang
COPY ./fabric $GOPATH/src/github.com/hyperledger/fabric
WORKDIR $GOPATH/src/github.com/hyperledger/fabric
RUN apt-get update
RUN apt-get install -y bash gcc make musl-dev
RUN sed -i 's/rdev: s.Rdev/rdev: uint64(s.Rdev)/g' vendor/github.com/docker/docker/pkg/system/stat_linux.go
FROM golang as peer
ARG GO_TAGS
RUN make peer GO_TAGS=${GO_TAGS}
FROM peer-base
ENV FABRIC_CFG_PATH /etc/hyperledger/fabric
VOLUME /etc/hyperledger/fabric
VOLUME /var/hyperledger
COPY --from=peer /go/src/github.com/hyperledger/fabric/build/bin /usr/local/bin
COPY --from=peer /go/src/github.com/hyperledger/fabric/sampleconfig/msp ${FABRIC_CFG_PATH}/msp
COPY --from=peer /go/src/github.com/hyperledger/fabric/sampleconfig/core.yaml ${FABRIC_CFG_PATH}
EXPOSE 7051
CMD ["peer","node","start"]
</code></pre>
<p>打包出来的peer、orderer、fabric-ca 镜像会出现下面问题。<br>
问题描述:orderer命令编译后在/usr/local/bin/orderer,但是在容器中不能使用。<br>
报错提示:/bin/sh xxx :not found<br>
docker run -it --name orderer arm64/fabric-orderer/bin/sh<br>
<img src="https://img2022.cnblogs.com/blog/1444147/202204/1444147-20220428162433476-1034100907.png"></p>
<p>原因:两个基础镜像底层shell环境不一致导致<br>
解决方案:全都使用go基础镜像。上述文档中的Dockerfile都是改为使用go作为单一基础镜像制作的fabric镜像。</p>
<p>启动第一个网络:<br>
待补充<br>
<img src="https://img2022.cnblogs.com/blog/1444147/202205/1444147-20220504143731207-1187413148.png"><br>
<img src="https://img2022.cnblogs.com/blog/1444147/202205/1444147-20220504143822063-984181966.png"></p>
<p>go get 报错:<br>
<img src="https://img2022.cnblogs.com/blog/1444147/202205/1444147-20220504143907011-1171453543.png"></p>
<p>创建测试网络:<br>
<img src="https://img2022.cnblogs.com/blog/1444147/202205/1444147-20220504143957359-415877413.png"></p>
<p>服务器资源不够。带不动:<br>
<img src="https://img2022.cnblogs.com/blog/1444147/202205/1444147-20220504144122894-129059781.png"></p><br><br>
来源:https://www.cnblogs.com/zoujiaojiao/p/16195370.html
頁:
[1]