go服務docker實踐 縮小映象占用

2021-10-04 13:02:35 字數 3592 閱讀 6919

go服務docker實踐-縮小映象占用

1 說在前面

本文環境建立在已安裝docker服務基礎上,請先準備好docker環境

2 docker映象要求

我們首先思考一下雲原生對應用執行時的不同需求:

啟動速度更快:對於傳統單體應用,啟動速度與執行效率相比不是乙個關鍵的指標。原因是,這些應用重啟和發布頻率相對較低。然而對於需要快速迭代、水平擴充套件的微服務應用而言,更快的的啟動速度就意味著更高的交付效率,和更加快速的回滾。尤其當你需要發布乙個有數百個副本的應用時,緩慢的啟動速度就是時間殺手。對於serverless 應用而言,端到端的冷啟動速度則更為關鍵,即使底層容器技術可以實現百毫秒資源就緒,如果應用無法在 500ms 內完成啟動,使用者就會感知到訪問延遲。

占用資源更少:執行時更低的資源占用,意味著更高的部署密度和更低的計算成本。

(本次我們討論如何把體積縮小)

3 建立第一版dockerfile

在這個dockerfile中,我主要做了下面這幾件事

1 打包

為了擺脫開發環境對打包的影響,我選擇了把打包過程放在了dockerfile中

2 啟動

在第一階段打包完成後,我們可以直接執行打包後的可執行檔案

下面我們來看第一版dockerfile

from golang

maintainer 天南

下面我們一步一步解析此dockerfile:

# 我們以官方golang映象為基礎映象,官方golang的gopath預設在 /go/src中,所以可以直接把我們的專案放在此# # gopath中

from golang

# 指定維護者名稱

maintainer 天南

# 指定容器內的工作目錄,不存在目錄會自動建立

# 把dockerfile當前目錄下的所有目錄和檔案都複製到上步指定的工作目錄下

copy . .

# 開始打包

run go build main.go

# 暴露服務埠

expose 20020 20021 20022

# 使用cmd執行命令,這個命令對映到容器內部的命令為 ./main ./config_local.ini :20020 :20021 :20022

cmd ["./main","./config_local.ini",":20020",":20021",":20022"]

構建映象,並啟動

docker build -t cm_ad_free_img_v1 .
構建個映象,指定tag名稱為 cm_ad_free_img_v1

下圖可以看到,映象構建過程

映象構建成功後,我們進行啟動乙個容器服務

docker run --name cm_ad_free_container_v1  -it  -p 9988:20022 cm_ad_free_img_v1
下面說下引數資訊

--name 指定容器名稱

-t 讓docker分配乙個偽終端並繫結到容器的標準輸入上

-i 則讓容器的標準輸入保持開啟

-d 會採用後台進行

-p 為埠對映,宿主機埠:容器埠

檢查下生成的docker映象

我哩個去! 這映象占用也太大了,足足占用了890mb,原因是什麼呢? 原來我們在構建映象的時候,引入的golang基礎映象以及做了不少操作,在操作的過程中,產生了不少臨時檔案,這些臨時檔案在執行時是不需要的

4 映象**

docker 提供了 multi-stage build(多階段構建),可以實現映象**。

我們把dockerfile構建過程可以簡單分為兩個階段,

第乙個階段是生成可執行檔案階段,使用了golang的基礎映象,並做了go build操作

第二個階段是執行可執行檔案階段,其實第二個階段用到了第一階段的執行檔案和基礎配置,執行過程中並不再依賴golang基礎映象

所以我們在最終發布的映象中,只包含執行程式必要的檔案和配置,不包含任何編譯時的依賴,這樣就減少了映象的體積

我們來看第二版的dockerfile,只對增加命令進行注釋

# 引入golang作為基礎命令並起別名為 build

from golang as build

maintainer 天南

copy . .

run go build main.go

# 引入alphine最小linux映象

from alpine

# 設定工作目錄

# 複製生成的可執行命令和一些配置檔案

# !!! 注意,經測試發現alpine中缺少動態庫,經查詢後的解決方式為建立乙個軟鏈

run mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

expose 20020 20021 20022

cmd ["./main","./config_local.ini",":20020",":20021",":20022"]

構建映象後,檢視下占用磁碟,直接減少到26mb,看來胖子變為瘦子了,哈哈

建立容器,成功啟動服務,可以開心玩耍了 ~

Docker建立支援ssh服務的容器和映象

sudo docker pull centos sudo docker run name centos ssh i t centos centos6 bin bash 3.安裝openssh server服務軟體包 yum install openssh server 4.編輯sshd的配置檔案 e...

Docker建立支援ssh服務的容器和映象

sudo docker pull centos sudo docker run name centos ssh i t centos centos6 bin bash 3.安裝openssh server服務軟體包 yum install openssh server 4.編輯sshd的配置檔案 e...

go實踐十一 熱重啟服務

熱重啟 zero downtime 指新老程序無縫切換,在替換過程中可保持對 client 的服務。測試熱重啟 設定監聽的物件 新建或已存在的socket描述符 if graceful else if err nil go func 監聽訊號 handlesignal log.println sig...