加速Hyperledger Fabric的docker镜像构建过程

Hyperledger Fabric 从v2.0开始,全面将docker基础镜像替换成了体积更小、潜在安全风险更少、更加轻量的Alpine Linux,从而使得make docker出来K T h a的各种镜像的体积几乎都缩小为原来的一半,确实能够节省更多的硬盘空间。但是,由于众所周知的原因,对于生在红旗下,长在新中国的程序员们,第一次在Fabric项目下构建docker镜像时,依然是奇慢无比,屡次超时。

那么这个问题怎么解决呢?

分析速度的瓶颈. l N v } ) W

首先通过分析速度慢的原因,找出可以优化的点。通过分析make docker命令,大概过程是这样的:首K ; Z - 先是docker会从docker registry pull Alpine作为$ c ) Y z @基础镜像,然后使用apk add --no-ca[ K 7 _ j ` # 8 /che xxx安装一些软件,最后通过make命令build出Peer、Order以及其; } J 1 $他的tools的二进制包。到这里相信国内的各种奇人义士已经磨刀霍霍,8 R d $ G M迫不及待的开始替换各种国内的mirror了。

下面的各种资源都来源于网上各位好心人d T ] G D 0 W d的分享。

加速docker pull过程

首先从网上搜索国内的docker registry源,然后修改docker的配置并重启n p edocker。在这里我比较推荐使用自己专有的免费的阿里云镜像加速器,目前使用一直比较平稳。

  • 获取镜像加速url

注册一个` a ~ _ : ( *阿里云账号并登录,在产品与服务中搜索容器镜像服务,跟随引导完成必要的一些步骤,然后来到这个页面:https://cr.console.aliyun.com/cn-hangzhou/instan- w : ^ces/miW U # # O zrrors,就可以看到自己专有的加速器地址 B 1 7 w .了。

  • 给docker客户端配置镜 a | ( J像加速器S U O u 5 _ . 7 w

如果没有/etc/docker/daemon.jsonL 3 y B件,则可以直接通k X * s ` 3 - 5 [过下面的命令完成配置;如果该文件已经存在了,则选择自己熟悉的文本编辑器编辑该文件,添加加速器地址的配置。如果你使用的带界面的客户端,也可以在Preferences... -> Docker Engine显示的编辑器中添加相应的配置。f 2 e T 4 - }


sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-O 0 0 q H } d 4 Q'EOF'
{
"registry-mirrors": ["https://xxx.mirr6 G d d z 3 A y por.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

注意:将https://xxx.mirror.aliyuncs.com替换成你自己的镜像加速器地址。再次提醒,配置完成后,重启docker之后才会生效。

至此我们完成了docker pull镜像阶段的加速,接下来我们加速在Alpine中安装软件的过程。

加速Alpine安装软件的过程

在docker pu, L U A ~ U q g Bll下来的Alpine镜像中,使用apk安装软件时默认使用的是国外的源,x y N | e @ ( u速度比较慢。这里我们把源替换为国内的源,可以大大节省时间。下面以Hyperledger fabric peer的DockW q { 2 Oerfile为例,替换为阿里的源:


...
FROM alpine:${ALPINE_VER} as peer-bV v G a Lase
# 使用下面这行命令完成源的替换
RUg ^ : % 0 =N sed -i 's/dl6 % Z-cdn.an V 1 5 S ` 7 k {lpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add --no-c. ; eache tzdata
FROM golang:${GO_VER}-alpine${p i ( M 8 D R $ IALPINE_VER}= 0 : I as golang
# 使用(  ( A t f Z 2下面这行命令完成源的替换
RUN sed -i 's/dl-cdn.alpinelinuP 8 ; 1 , Gx.org/mirrors.aliyun.com/g' /etc/apk/reposiL ] j A t E :tories
RUN apkm P . T z E 8 { add --no-ca8 = _ @ S `che \
bash \
gcc \
git \
make \
musl-dev
ADD .t ! M c v { $ $GOPATH/src/g@ E ; a G g Eithub.com/hyperledger/V G | J @ | ) Lfabric
...

另外也可以替换为中科大的源:dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn,或者清华的源:dl-cdn.al/ x Npinelinux.org/mirrors.tuna.tsinghua.edu.cn,或者其他的源。

注意:这里对于使用multi-stage的Dockerfile,如果不同的stage使用的是不同的基础镜像,则都需要替换源。

到这里,当docker使! # & F a Y m T Z用AlpV O l 8 [ b b wine作为基础镜像时,安装依赖软件: M u E A的过程就会快很多。