Docker部署Golang項目及鏡像優化實戰
今天在部署公司的項目時, 了解到目標服務器有Docker環境,於是就想着基於Docker來部署項目
這篇文章記錄了一次完整的構建鏡像到優化的完整過程.
基礎環境
Docker
編輯Dockerfile文件
基於簡單,快速構建部署的原則,我選擇在構建docker鏡像時編譯程序.即 上傳項目源代碼,通過Dockerfile命令聲明完成編譯,再運行二進制文件.先展示我的文件目錄
main文件,跟需要的comfigs文件夾 都在項目跟目錄. (我的程序啟動時需要 load configs/目錄下的配置文件)
那么,我們的Dockerfile文件就直接放在項目 根目錄了
Dockerfile文件內容
1 #基礎鏡像,這也是我本地的golang版本 2 FROM golang:1.15.10 3 4 #環境變量 5 ENV GO111MODULE=on 6 ENV GOPROXY=https://goproxy.cn,direct 7 8 #指定操作目錄 9 WORKDIR /go/src/labs.api 10 #復制根目錄內所有源碼文件到操作目錄下 11 COPY . . 12 13 #編譯 14 RUN GOOS=linux CGO_ENABLED=1 GOARCH=amd64 go build -installsuffix cgo . 15 16 #暴露的端口 17 EXPOSE 18888 18 19 #運行 labs.api是我的項目名稱 20 CMD ["./labs.api"]
編譯並運行
編譯
1 #編譯 2 docker build -t labs.api:v1.0 . 3 4 #運行 5 docker run -p 18888:18888 --name labs.api labs.api:v1.0
程序正常運行,那么我們文章標題里的 優化從何說起呢?
接下來我們看下鏡像文件
1.34GB記住這個數值
這是我們剛剛構建的鏡像文件,一個可執行二進制只需要幾十M,為什么鏡像文件會這么大.
是因為我們構建項目所需要的基礎鏡像過於大.
那么我們只需要把可執行二進制文件放到一個小的基礎運行環境的鏡像中即可
優化
優化Dockerfile
1 #基礎鏡像,這也是我本地的golang版本 2 FROM golang:1.15.10 as builder 3 4 #環境變量 5 ENV GO111MODULE=on 6 ENV GOPROXY=https://goproxy.cn,direct 7 8 #指定工作目錄 9 WORKDIR /go/src/labs.api 10 #復制根目錄內所有源碼文件到工作目錄下 11 COPY . . 12 13 #編譯 14 RUN GOOS=linux CGO_ENABLED=1 GOARCH=amd64 go build -installsuffix cgo . 15 16 #基礎鏡像,運行環境 17 FROM ubuntu:18.04 as runner 18 19 #指定工作目錄 20 WORKDIR /go/app 21 #復制二進制執行文件和必要的Configs目錄到工作目錄 22 COPY --from=builder /go/src/labs.api/labs.api . 23 COPY --from=builder /go/src/labs.api/configs ./configs 24 25 #暴露的端口 26 EXPOSE 18888 27 28 #運行 labs.api是我的項目名稱 29 CMD ["./labs.api"]
再次編譯運行,正常啟動!
然后查看鏡像文件大小
相差1.1個G
總結
我們在使用Docker部署項目時,只需要把 編譯及運行環境分開,就能夠減小鏡像的大小.並且效果非常令人滿意.
具體原理可以看一下Docker的多級構建介紹,關於多級構建鏡像的原理.
簡單來說就是 單級構建只有一個“From”語句,而在多級構建中,有多個“From”,每個“From”構成一級。就像我的項目里的Dockerfile文件有兩個“From”,是一個二級構建。每一級都可以根據需要選擇適合自己的基礎(base)鏡像來構造本級鏡像。每級鏡像完成之后,下一級鏡像可選擇只保留上一級構建中對自己有用的最終文件(構建的二進制文件),而刪除所有的中間產物,這樣就大大節省了空間。
到此結束。
有問題,或者建議請留言,謝謝。
個人小站:Lyon`s Home Page