Hyperledger Fabric 從v2.0
開始,全面將docker基礎鏡像替換成了體積更小、潛在安全風險更少、更加輕量的Alpine Linux
,從而使得make docker
出來的各種鏡像的體積幾乎都縮小為原來的一半,確實能夠節省更多的硬盤空間。但是,由於眾所周知的原因,對於生在紅旗下,長在新中國的程序員們,第一次在Fabric項目下構建docker鏡像時,依然是奇慢無比,屢次超時。
那么這個問題怎么解決呢?
分析速度的瓶頸
首先通過分析速度慢的原因,找出可以優化的點。通過分析make docker
命令,大概過程是這樣的:首先是docker會從docker registry pull Alpine作為基礎鏡像,然后使用apk add --no-cache xxx
安裝一些軟件,最后通過make命令build出Peer、Order以及其他的tools的二進制包。到這里相信國內的各種奇人義士已經磨刀霍霍,迫不及待的開始替換各種國內的mirror了。
下面的各種資源都來源於網上各位好心人的分享。
加速docker pull過程
首先從網上搜索國內的docker registry源,然后修改docker的配置並重啟docker。在這里我比較推薦使用自己專有的免費的阿里雲鏡像加速器,目前使用一直比較平穩。
- 獲取鏡像加速url
注冊一個阿里雲賬號並登錄,在產品與服務
中搜索容器鏡像服務
,跟隨引導完成必要的一些步驟,然后來到這個頁面:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,就可以看到自己專有的加速器地址了。
- 給docker客戶端配置鏡像加速器
如果沒有/etc/docker/daemon.json
文件,則可以直接通過下面的命令完成配置;如果該文件已經存在了,則選擇自己熟悉的文本編輯器編輯該文件,添加加速器地址的配置。如果你使用的帶界面的客戶端,也可以在Preferences... -> Docker Engine
顯示的編輯器中添加相應的配置。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
注意:將https://xxx.mirror.aliyuncs.com
替換成你自己的鏡像加速器地址。再次提醒,配置完成后,重啟docker之后才會生效。
至此我們完成了docker pull鏡像階段的加速,接下來我們加速在Alpine中安裝軟件的過程。
加速Alpine安裝軟件的過程
在docker pull下來的Alpine鏡像中,使用apk安裝軟件時默認使用的是國外的源,速度比較慢。這里我們把源替換為國內的源,可以大大節省時間。下面以Hyperledger fabric peer的Dockerfile為例,替換為阿里的源:
...
FROM alpine:${ALPINE_VER} as peer-base
# 使用下面這行命令完成源的替換
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add --no-cache tzdata
FROM golang:${GO_VER}-alpine${ALPINE_VER} as golang
# 使用下面這行命令完成源的替換
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add --no-cache \
bash \
gcc \
git \
make \
musl-dev
ADD . $GOPATH/src/github.com/hyperledger/fabric
...
另外也可以替換為中科大的源:dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn,或者清華的源:dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn,或者其他的源。
注意:這里對於使用multi-stage的Dockerfile,如果不同的stage使用的是不同的基礎鏡像,則都需要替換源。
到這里,當docker使用Alpine作為基礎鏡像時,安裝依賴軟件的過程就會快很多。