亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Docker+UPX 構(gòu)建更小的鏡像

oliverhuang / 2361人閱讀

摘要:更小的鏡像構(gòu)建此處省略非常漂亮,到現(xiàn)在我們已經(jīng)看到的已經(jīng)縮小到這已經(jīng)非常的小了,換算過(guò)來(lái)我們的程序只有。是一個(gè)免費(fèi)且開(kāi)源的可執(zhí)行程序文件加殼器,支持許多不同操作系統(tǒng)下的可執(zhí)行文件格式。

無(wú)論是在我們的生產(chǎn)環(huán)境或測(cè)試環(huán)境中,一旦涉及到docker pull和push的時(shí)候,我們都迫切希望Docker鏡像是一個(gè)非常小的file,一方面在網(wǎng)絡(luò)帶寬有限的情況下,image的size越小下載所付出的時(shí)間代價(jià)就越小,另一方面image始終是一個(gè)文件,size對(duì)存儲(chǔ)空間是有一定影響的,看來(lái)這是個(gè)提高生產(chǎn)力的問(wèn)題,那么我們?nèi)绾稳?gòu)建一個(gè)size很小的image呢?

本文內(nèi)容

單階段構(gòu)建鏡像

多階段構(gòu)建鏡像

更小的鏡像構(gòu)建

注:多階段構(gòu)建是 Docker 17.05 及更高版本提供的功能

查看一下image列表:

$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
golang                                     1.10.3              d0e7a411e3da        6 weeks ago         794MB
alpine                                     3.8                 11cd0b38bc3c        8 weeks ago         4.41MB

通常在我們什么都不考慮的情況下,構(gòu)建一個(gè)golang的應(yīng)用鏡像是非常簡(jiǎn)單的,只需要pull官方的golang環(huán)境,把我們的程序copy進(jìn)去就可以了,下面我們先創(chuàng)建一個(gè)工程的目錄如下:

$ tree -L 2   -C
.
├── Dockerfile
└── src
    └── main.go
    
1 directory, 2 files
單階段構(gòu)建鏡像

Dockerfile:

FROM golang:1.10.3
WORKDIR /go/src/test
RUN go get github.com/gin-gonic/gin
COPY src src
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main src/main.go
CMD ["./main"]

Build

$ docker build -t zev/test:1.0.0 .

Sending build context to Docker daemon  17.41kB
Step 1/6 : FROM golang:1.10.3
 ---> d0e7a411e3da
Step 2/6 : WORKDIR /go/src/test
 ---> Running in 94d1ede51e17
Removing intermediate container 94d1ede51e17
 ---> 2b643ce8b3cf
Step 3/6 : RUN go get github.com/gin-gonic/gin
 ---> Running in de5e9adb7c10
Removing intermediate container de5e9adb7c10
 ---> ff970f45de1e
Step 4/6 : COPY src src
 ---> 6b79fef06e45
Step 5/6 : RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main src/main.go
 ---> Running in 6d4ef8c0b580
Removing intermediate container 6d4ef8c0b580
 ---> 59678a3ab4d8
Step 6/6 : CMD ["./main"]
 ---> Running in a5cea54f2ccb
Removing intermediate container a5cea54f2ccb
 ---> a253cfcffffd6a
Successfully built a253cfcffffd6a
Successfully tagged zev/test:1.0.0

RUN

$ docker run -it -p 8080:8080 zev/test:1.0.0  
        
[GIN-debug] [WARNING] Now Gin requires Go 1.6 or later and Go 1.7 will be required soon.
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080

Images

$ docker images

REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
zev/test                                   1.0.0               a253cfcffffd6a        4 minutes ago       857MB

image的size為857MB,內(nèi)部包含了整個(gè)golang環(huán)境,這么大的文件在傳輸中絕對(duì)是個(gè)災(zāi)難,接下來(lái)我們用多階段構(gòu)建一個(gè)相對(duì)比較小的image。

多階段構(gòu)建鏡像

Dockerfile:

FROM golang:1.10.3 as builder
WORKDIR /go/src/test
RUN go get github.com/gin-gonic/gin
COPY src src
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main src/main.go

FROM alpine:3.8
WORKDIR /root
COPY --from=builder /go/src/test/main .
CMD ["./main"]

Build

$ docker build -t zev/test:1.0.1 .                                                                                                            

Sending build context to Docker daemon  17.41kB
Step 1/9 : FROM golang:1.10.3 as builder
 ---> d0e7a411e3da
Step 2/9 : WORKDIR /go/src/test
 ---> Using cache
 ---> 2b643ce8b3cf
Step 3/9 : RUN go get github.com/gin-gonic/gin
 ---> Using cache
 ---> ff970f45de1e
Step 4/9 : COPY src src
 ---> Using cache
 ---> 6b79fef06e45
Step 5/9 : RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main src/main.go
 ---> Using cache
 ---> 59678a3ab4d8
Step 6/9 : FROM alpine:3.8
 ---> 11cd0b38bc3c
Step 7/9 : WORKDIR /root
 ---> Running in 1640c71479d6
Removing intermediate container 1640c71479d6
 ---> ec68dc839562
Step 8/9 : COPY --from=builder /go/src/test/main .
 ---> 5bb444c91aff
Step 9/9 : CMD ["./main"]
 ---> Running in a80305feba6e
Removing intermediate container a80305feba6e
 ---> 5923597f59c2
Successfully built 5923597f59c2
Successfully tagged zev/test:1.0.1

RUN

$ docker run -it -p 8080:8080 zev/test:1.0.1  

[GIN-debug] [WARNING] Now Gin requires Go 1.6 or later and Go 1.7 will be required soon.
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080

Images

$ docker images

REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
zev/test                                   1.0.1               5923597f59c2        2 minutes ago       19.8MB

多階段構(gòu)建讓images縮小了40倍,19.8M的size無(wú)論在測(cè)試環(huán)境還是生產(chǎn)環(huán)境都能很好的工作了,但是這樣就結(jié)束了嗎?
當(dāng)然不是了,我們的目的是讓image變得更小,下面看我們的操作。

更小的鏡像構(gòu)建

Dockerfile:

FROM golang:1.10.3 as builder
RUN apt-get update && apt-get install -y xz-utils 
    && rm -rf /var/lib/apt/lists/*
ADD https://github.com/upx/upx/releases/download/v3.95/upx-3.95-amd64_linux.tar.xz /usr/local
RUN xz -d -c /usr/local/upx-3.95-amd64_linux.tar.xz | tar -xOf - upx-3.95-amd64_linux/upx > /bin/upx && 
    chmod a+x /bin/upx
WORKDIR /go/src/test
RUN go get github.com/gin-gonic/gin
COPY src src
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main src/main.go
RUN strip --strip-unneeded main
RUN upx main

FROM alpine:3.8
WORKDIR /root
COPY --from=builder /go/src/test/main .
CMD ["./main"]

Build

$ docker build -t zev/test:1.0.2 .         
                                                                                                   
Sending build context to Docker daemon  17.92kB
Step 1/14 : FROM golang:1.10.3 as builder
 ---> d0e7a411e3da
Step 2/14 : RUN apt-get update && apt-get install -y xz-utils     && rm -rf /var/lib/apt/lists/*
 ---> Running in 65772cb8fdab
Ign:1 http://deb.debian.org/debian stretch InRelease
Get:2 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Get:3 http://deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:4 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [392 kB]
.....此處省略
Step 10/14 : RUN upx main
 ---> Running in d802406ee44a
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2018
UPX 3.95        Markus Oberhumer, Laszlo Molnar & John Reiser   Aug 26th 2018

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   9848136 ->   2945384   29.91%   linux/amd64   main

Packed 1 file.
Removing intermediate container d802406ee44a
 ---> 0c29f4b2272d
Step 11/14 : FROM alpine:3.8
 ---> 11cd0b38bc3c
Step 12/14 : WORKDIR /root
 ---> Using cache
 ---> ec68dc839562
Step 13/14 : COPY --from=builder /go/src/test/main .
 ---> a2c265cc9aff
Step 14/14 : CMD ["./main"]
 ---> Running in 7e350a4620ee
Removing intermediate container 7e350a4620ee
 ---> a4d7753c8112
Successfully built a4d7753c8112
Successfully tagged zev/test:1.0.2

RUN

$ docker run -it -p 8080:8080 zev/test:1.0.2 

[GIN-debug] [WARNING] Now Gin requires Go 1.6 or later and Go 1.7 will be required soon.
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080

Images

$ docker images

REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
zev/test                                   1.0.2               a4d7753c8112        4 minutes ago       7.36MB

OK 非常漂亮,到現(xiàn)在我們已經(jīng)看到image的size已經(jīng)縮小到7.36MB,這已經(jīng)非常的小了,換算過(guò)來(lái)我們的程序只有2.95M。
我們來(lái)一張全景對(duì)比看下:

$ docker images

REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
zev/test                                   1.0.2               a4d7753c8112        6 minutes ago       7.36MB
zev/test                                   1.0.1               5923597f59c2        About an hour ago   19.8MB
zev/test                                   1.0.0               a253cfcffffd6a        About an hour ago   857MB
golang                                     1.10.3              d0e7a411e3da        6 weeks ago         794MB
alpine                                     3.8                 11cd0b38bc3c        8 weeks ago         4.41MB

那么怎么做到的呢,原理很簡(jiǎn)單,因?yàn)閍lpine的size已經(jīng)固定了,能讓image變得更小的入手點(diǎn)只能是可執(zhí)行文件,利用UPX的加殼技術(shù)可以壓縮main可執(zhí)行程序,可以把main體積縮小50%-70%。

Tip:UPX(the Ultimate Packer for eXecutables)是一個(gè)免費(fèi)且開(kāi)源的可執(zhí)行程序文件加殼器,支持許多不同操作系統(tǒng)下的可執(zhí)行文件格式。想了解更多關(guān)于UPX的信息可以點(diǎn)擊這里 ,也可點(diǎn)擊這里.

總結(jié):


好的,到此為止本文首先展示了單階段構(gòu)建鏡像,并得到了一個(gè)~857MB的鏡像,然后利用多階段構(gòu)建了一個(gè)只包含可執(zhí)行文件的鏡像~19.8MB,最后我們利用多階段+UPX壓縮把我們的鏡像縮小到了~7.36MB,這樣的鏡像無(wú)論在測(cè)試環(huán)境還是生產(chǎn)環(huán)境,都一定能大大的提高我們的生產(chǎn)力。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/27436.html

相關(guān)文章

  • Node.js docker 鏡像體積優(yōu)化實(shí)踐

    摘要:接下來(lái)我們將逐步的減少這個(gè)鏡像的體積。優(yōu)化生產(chǎn)環(huán)境鏡像使用鏡像大幅減小鏡像體積的最簡(jiǎn)單和最快的方法是選擇一個(gè)小得多的基本鏡像。使用多階段構(gòu)建可以充分利用鏡像的緩存,大大減少最終部署到生產(chǎn)環(huán)境的時(shí)間。 關(guān)注作者github每日一道面試題詳解 你討厭部署你的應(yīng)用程序花費(fèi)很長(zhǎng)時(shí)間嗎? 對(duì)于單個(gè)容器來(lái)說(shuō),超過(guò)gb并不是最佳實(shí)踐。每次部署新版本時(shí)都要處理數(shù)十億字節(jié),這對(duì)我們來(lái)說(shuō)并不太合適。 本文...

    wenhai.he 評(píng)論0 收藏0
  • 創(chuàng)建盡可能小的 Docker 容器

    摘要:我一直在尋找盡可能小的容器入手,并且發(fā)現(xiàn)了一個(gè)鏡像是完美的,真正的完美它簡(jiǎn)潔,小巧以及快速。所以這可能就是最小的鏡像。盡管如此,這樣看起來(lái)會(huì)很復(fù)雜并且導(dǎo)致容器很大。 注:本文由 Adriaan de Jonge 編寫(xiě),本文的原文地址為 Create The Smallest Possible Docker Container 當(dāng)我們?cè)谑褂?Docker 的時(shí)候,你會(huì)很快注意到...

    yankeys 評(píng)論0 收藏0
  • 高質(zhì)量 Node.js 微服務(wù)的編寫(xiě)和部署

    摘要:編寫(xiě)代碼的開(kāi)發(fā)人員必須負(fù)責(zé)代碼的生產(chǎn)部署。構(gòu)建和部署鏈需要重大更改,以便為微服務(wù)環(huán)境提供正確的關(guān)注點(diǎn)分離。該對(duì)象會(huì)在之后的時(shí)被這時(shí)的回調(diào)函數(shù)會(huì)被調(diào)用,并輸出。微服務(wù)部署及集成部署微服務(wù)時(shí)有一個(gè)原則一個(gè)容器中只放一個(gè)服務(wù),可以使用編 前幾天在微信群做的一次分享,整理出來(lái)分享給大家,相關(guān)代碼請(qǐng)戳 https://github.com/Carrotzpc/docker_web_app sho...

    szysky 評(píng)論0 收藏0
  • 高質(zhì)量 Node.js 微服務(wù)的編寫(xiě)和部署

    摘要:編寫(xiě)代碼的開(kāi)發(fā)人員必須負(fù)責(zé)代碼的生產(chǎn)部署。構(gòu)建和部署鏈需要重大更改,以便為微服務(wù)環(huán)境提供正確的關(guān)注點(diǎn)分離。該對(duì)象會(huì)在之后的時(shí)被這時(shí)的回調(diào)函數(shù)會(huì)被調(diào)用,并輸出。微服務(wù)部署及集成部署微服務(wù)時(shí)有一個(gè)原則一個(gè)容器中只放一個(gè)服務(wù),可以使用編 前幾天在微信群做的一次分享,整理出來(lái)分享給大家,相關(guān)代碼請(qǐng)戳 https://github.com/Carrotzpc/docker_web_app sho...

    Michael_Ding 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<