天天看點

輕量級基礎鏡像alpine

作者:天行1st

一般打docker時,基礎鏡像使用centos(200M+)或者ubuntu(80M)。對于微服務盛行的今天,一台機器上面會運作很多個服務。這麼大的基礎會額外占用大量硬體資源,顯然是不優雅的。這裡為減少不必要消耗,推薦使用alpine(5M+)鏡像,麻雀雖小五髒俱全。

簡述

這裡以golang為例,建構鏡像通常有兩種方式。

  • 在本地通過跨平台編譯一個二進制檔案,将二進制檔案放入基礎鏡像運作。多數docker初學者使用此方式建構鏡像。
  • 多階段建構。把這一切都放到一個 Dockerfile 裡。在Dockerfile中将源碼放入第一階段基礎鏡像,打包出該平台的二進制檔案。第二階段拷貝第一階段打包出的二進制檔案。

Dockerfile

這裡直接展示第二種方式:

無cgo版

# 多階段建構
#建構一個 builder 鏡像,目的是在其中編譯出可執行檔案hss
#建構時需要将此檔案放到代碼根目錄下
FROM golang:alpine  as builder
#将上層整個檔案夾拷貝到/build
ADD . /build/src
WORKDIR /build/src
#去掉了調試資訊 -ldflags="-s -w" 以減小鏡像尺寸
RUN go env -w GO111MODULE=on \
    && go env -w GOPROXY=https://goproxy.cn,direct \
    && go env -w CGO_ENABLED=0 \
    && go mod tidy \
    && go build -ldflags="-s -w"  -o hss /build/src/cmd/hss/main.go

FROM alpine
#更新軟體源  使用挂載卷挂載 /etc/localtime:/etc/localtime做主控端時間映射
#RUN apk update --no-cache && apk add --no-cache tzdata \
# && apk add --no-cache docker-cli
##設定本地時區,這樣我們在日志裡看到的是中原標準時間了
#ENV TZ Asia/Shanghai

WORKDIR /home

COPY --from=builder  /build/src/config/config.yml /home/config/config.yml
COPY --from=builder /build/src/hss /home/hss

CMD ["./hss"]
EXPOSE 9680           

打包後的導出的鏡像,可以看到隻有19M多

輕量級基礎鏡像alpine

cgo版

如果go程式使用了cgo,編譯起來有點麻煩,需要先配置gcc環境

上代碼:

# 多階段建構
#建構一個 builder 鏡像,目的是在其中編譯出可執行檔案mck
#建構時需要将此檔案放到代碼根目錄下
FROM golang:alpine  as builder
#ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOPROXY=https://goproxy.cn
#安裝編譯需要的環境gcc等
RUN apk add build-base

WORKDIR /build
#将上層整個檔案夾拷貝到/build
ADD . /build/src
WORKDIR /build/src
#交叉編譯,需要制定CGO_ENABLED=1,預設是關閉的
#去掉了調試資訊 -ldflags="-s -w" 以減小鏡像尺寸
RUN  GOOS=linux CGO_ENABLED=1 GOARCH=amd64 go build -ldflags="-s -w" -installsuffix cgo -o mck ./cmd/mck/main.go

#編譯
FROM alpine
RUN apk update --no-cache && apk add --no-cache tzdata
#設定本地時區,這樣我們在日志裡看到的是中原標準時間了
ENV TZ Asia/Shanghai
WORKDIR /app
#從第一個鏡像裡 copy 出來可執行檔案
COPY --from=builder  /build/src/mck /app/mck
#COPY --from=builder  /build/src/config/config.yml /app/config/config.yml
#COPY --from=builder  /build/src/config/alpine/libcoop_alpine.so /app/config/alpine/libcoop_alpine.so
COPY ./config/alpine/libgcc_s.so.1 /usr/lib/
#COPY ./config/alpine/libstdc++.so.6 /usr/lib/
COPY ./config/alpine/libstdc++.so.6.0.28 /usr/lib/libstdc++.so.6.0.28
RUN ln -s /usr/lib/libstdc++.so.6.0.28 /usr/lib/libstdc++.so.6
#VOLUME ["/home/tianxing/project/mck/mck-service-core/config/config.yml","/app/config/config.yml"]

#CMD ["./mck"]
EXPOSE 9008
EXPOSE 9080           

說明:以上服務調用了so,so需要在alpine下編譯,并将libstdc服務進alpine鏡像。

起初擔心 該基礎鏡像過小,會影響性能。實際壓測結果如下:

輕量級基礎鏡像alpine

該服務提供http接口和tcp接口。在40核64G伺服器上壓測tcp接口,除第二個需要寫資料庫tps和響應時間較慢,平均tps 8000+ 完全不影響性能。

繼續閱讀