欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

優(yōu)化 Docker 鏡像大小常見的方式

 更新時間:2020年09月02日 10:22:23   作者:51CTO  
這篇文章主要介紹了如何優(yōu)化 Docker 鏡像大小,幫助大家更好的理解和使用docker容器,感興趣的朋友可以了解下。

平時我們構(gòu)建的 Docker 鏡像通常比較大,占用大量的磁盤空間,隨著容器的大規(guī)模部署,同樣也會浪費寶貴的帶寬資源。本文將介紹幾種常用的方法來優(yōu)化 Docker 鏡像大小,這里我們使用 Docker Hub 官方上的 Redis 鏡像進行說明。

手動管理

我們能夠直接想到的方法就是直接修改官方的 Redis 鏡像 Dockerfile 文件,手動刪除容器運行后不需要的組件,然后重新構(gòu)建一個新鏡像。這種方法理論上是可行的,但是容易出錯,而且效果也不是特別明顯。主要是不能和官方的鏡像實時同步。

多階段構(gòu)建

Docker 在17.05 版本起提供了多階段構(gòu)建的功能來解決這個問題,這種方法是通過丟棄中間層來實現(xiàn)的,并通過中間層來提供有關(guān)如何創(chuàng)建最終鏡像及其內(nèi)容信息來完成的,只需要保留容器化應(yīng)用所需的組件即可。在更上層的實現(xiàn)如下所示:

  • 以一些鏡像作為構(gòu)建的基礎(chǔ)
  • 和平常一樣運行命令來構(gòu)造你的應(yīng)用
  • 將所需的制品復制到另外一個單獨的鏡像

Distroless

在嚴重依賴容器化技術(shù),尤其是 Docker 之后,谷歌早就意識到了使用臃腫鏡像的弊端。所以他們提供了自己的方法來解決這個問題,即 distroless 鏡像。與典型的Linux 基礎(chǔ)鏡像(綁定了很多軟件)不同,在 distroless 上對你的應(yīng)用進行 docker化,最終的鏡像只包含應(yīng)用及其運行時的依賴項,大多數(shù) Linux 發(fā)行版中包含的標準軟件,如包管理器,甚至 shell 都被會被排除在外。同樣的,要使用 Google 的 distroless 鏡像,需要使用上面我們提到的多階段構(gòu)建,如下所示:

FROM redis:latest AS build 
ARG TIME_ZONE 
RUN mkdir -p /opt/etc && \ 
 cp -a --parents /lib/x86_64-linux-gnu/libm.so.* /opt && \ 
 cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \ 
 cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \ 
 cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt && \ 
 cp -a --parents /usr/local/bin/redis-server /opt && \ 
 cp -a --parents /usr/local/bin/redis-sentinel /opt && \ 
 cp /usr/share/zoneinfo/${TIME_ZONE:-UTC} /opt/etc/localtime 
 
FROM gcr.io/distroless/base 
COPY --from=build /opt / 
VOLUME /data 
WORKDIR /data 
ENTRYPOINT ["redis-server"] 

使用redis:latest為基礎(chǔ)鏡像,然后保留需要的一些二進制文件(redis-server二進制文件以及所有的相關(guān)依賴),然后使用 distroless 鏡像作為構(gòu)建的最終鏡像的基礎(chǔ),將opt目錄內(nèi)容復制到該鏡像目錄中來。

然后我們只需要重新構(gòu)建鏡像即可:

$ docker build -t redis:distroless .$ docker imagesREPOSITORY  TAG     IMAGE ID     CREATED    SIZEredis      distroless  7d50bd873bea  15 seconds ago  28.2MBredis      latest    1319b1eaa0b7  3 days ago   104MB

我們可以看到鏡像由以前的 104MB 變成了 28.2MB,大大降低了鏡像的大小。

注意:在 Linux 下面我們可以使用 ldd 工具來查找指定的二進制文件所需要的依賴,比如 $ ldd $(which redis-server) 。

使用 distroless 鏡像來降低 Docker 鏡像的大小是一個非常有效的方法,但是這樣做也有一個明顯的缺點就是最終的鏡像中沒有 shell 程序了,使得調(diào)試 Docker 容器就非常非常困難,當然這樣也降低了應(yīng)用被攻擊的危險,使其更加安全,如果我們將應(yīng)用部署到 Kubernetes 集群的話,我們可以利用 kubectl-debug這樣的工具來輔助調(diào)試應(yīng)用。

Alpine Linux

另外一種比較常見的方式是選擇在 Alpine Linux 基礎(chǔ)上構(gòu)建應(yīng)用鏡像,Alpine Linux 是一個特別適合創(chuàng)建最小化 Docker 鏡像的發(fā)行版。Apline Linux 使用較小的 musl C 庫代替 glibc,并將其靜態(tài)鏈接,這意味著針對 musl 編譯的程序?qū)⒆兂煽芍囟ㄎ坏?(relocatable)的二進制文件,從而無需包含共享對象,從而可以顯著降低鏡像的大小。

redis:alpine 鏡像大概為 30MB 左右,這樣做的缺點是,通常 musl 的性能不如 glibc。當然也有另外一個好處,那就是和上面的 distroless 相比,Alpine 是成熟的 Linux 發(fā)行版,提供基本的 shell 訪問,使得調(diào)試 Docker 容器應(yīng)用更為方便。在 Docker Hub 上面也可以找到幾乎所有流行軟件的 Alpine 版本,比如 Redis、Nginx、MySQL 等等。

GNU Guix

最后,我們可以使用 GNU Guix,一個多功能的軟件包管理工具,其中就有一項可以創(chuàng)建 Docker 鏡像的功能。Guix 區(qū)分了包的運行時依賴與構(gòu)建依賴,所以 Guix 構(gòu)建的 Docker 鏡像將只包含明確指定的程序,加上他們的運行時依賴,就像 distroless 的方法一樣。但和 distroless 不同的時候,distroless 需要你自己去查程序的運行時依賴關(guān)系(當然也要寫 Dockerfile),而 Guix 只需要運行一條命令即可:$ guix pack -f docker redis 。

通過上面的命令創(chuàng)建的 Redis 鏡像大小約為 70MB,和原本的鏡像相比有明顯的減少,雖然比 distroless 和 Alpine 方法創(chuàng)建的鏡像稍大,但使用 Guinx 確實提供了一些其他的優(yōu)點。比如,如果你想讓你的最終鏡像也包含一個 shell,以便像 Alpine 那樣去調(diào)試,那么只需要在 Guxi 打包的時候指定上就可以了:$ guix pack -f docker redis bash ,如果你想包含其他軟件,也可以繼續(xù)在后面添加即可。

Guix 的功能特性意味著包的構(gòu)建可以100%復用,所以我們可以在 CI/CD 流水線管道中加入 Guix 支持,這樣構(gòu)建過程就非常順暢了。

有的人可能會覺得 Guix 聽起來很酷,但是并不想為了構(gòu)建更小的 Docker 鏡像而去下載安裝另外一個工具,更何況 Guix 只在 Linux 下面工作,很多開發(fā)者還是 MacOS 用戶,去配置 Guix 也挺麻煩。其實這點并不用擔心,Guix 本身也有 Docker 鏡像在 Docker Hub 上,所以使用起來也并不會太復雜,只需要簡單的使用 $ docker run guix 命令即可。

除了 Guix 之外,值得一提的還有一個名為 Nix 的軟件包管理工具,對 Guix 所述的每一點都同樣有效并且適用于 Nix。

以上就是優(yōu)化 Docker 鏡像大小常見的方式的詳細內(nèi)容,更多關(guān)于優(yōu)化 Docker 鏡像大小的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在docker中部署并啟動redis的方法

    在docker中部署并啟動redis的方法

    這篇文章主要介紹了在docker中部署并啟動redis的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Docker之自定義網(wǎng)絡(luò)實現(xiàn)

    Docker之自定義網(wǎng)絡(luò)實現(xiàn)

    大家好,本篇文章主要講的是Docker之自定義網(wǎng)絡(luò)實現(xiàn),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 快速使用docker-compose部署clickhouse的教程

    快速使用docker-compose部署clickhouse的教程

    ClickHouse 的工作速度比傳統(tǒng)方法快 100-1000 倍。它適用于大數(shù)據(jù)、業(yè)務(wù)分析和時間序列數(shù)據(jù)。在這個小教程中,我將向您展示如何以最少的設(shè)置安裝 ClickHouse,感興趣的朋友一起看看吧
    2021-11-11
  • Docker通過容器生成鏡像提交DockerCommit詳解

    Docker通過容器生成鏡像提交DockerCommit詳解

    這篇文章主要介紹了Docker通過容器生成鏡像提交DockerCommit的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-09-09
  • docker安裝ElasticSearch:7.8.0集群的詳細教程

    docker安裝ElasticSearch:7.8.0集群的詳細教程

    這篇文章主要介紹了docker安裝ElasticSearch:7.8.0集群的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • docker該如何刪除已停止的容器

    docker該如何刪除已停止的容器

    Docker是一個非常有趣的項目,容器是獨立運行的一個或一組應(yīng)用,及他們的運行環(huán)境,容器是Docker中的一個重要的概念,這篇文章主要給大家介紹了關(guān)于docker該如何刪除已停止的容器的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Docker上實現(xiàn)Redis集群搭建

    Docker上實現(xiàn)Redis集群搭建

    redis集群對于很多人來說非常熟悉,雖然集群搭建的文章在網(wǎng)上很多,但是今天給大家介紹的是在docker上實現(xiàn)Redis集群搭建,感興趣的可以了解下
    2021-05-05
  • docker?搭建?vulhub?靶場環(huán)境的詳細過程

    docker?搭建?vulhub?靶場環(huán)境的詳細過程

    Vulhub是一個基于docker和docker-compose的漏洞環(huán)境集合,進入對應(yīng)目錄并執(zhí)行一條語句即可啟動一個全新的漏洞環(huán)境,讓漏洞復現(xiàn)變得更加簡單,讓安全研究者更加專注于漏洞原理本身,這篇文章給大家介紹docker?搭建?vulhub?靶場環(huán)境的過程,感興趣的朋友一起看看吧
    2022-08-08
  • 如何使用docker部署Dashdot工具箱

    如何使用docker部署Dashdot工具箱

    dashdot是一個簡潔清晰的服務(wù)器數(shù)據(jù)儀表板,基于React實現(xiàn) ,主要是顯示操作系統(tǒng)、進程、存儲、內(nèi)存、網(wǎng)絡(luò)這五個的數(shù)據(jù),這篇文章主要介紹了如何使用docker部署Dashdot工具箱,需要的朋友可以參考下
    2024-02-02
  • Linux下定時自動備份Docker中所有SqlServer數(shù)據(jù)庫的腳本

    Linux下定時自動備份Docker中所有SqlServer數(shù)據(jù)庫的腳本

    這篇文章主要介紹了Linux下定時自動備份Docker中所有SqlServer數(shù)據(jù)庫?,編寫shell文件給出一個備份的范例,在Linux添加定時任務(wù),通過下列命令來檢測并安裝這個服務(wù),需要的朋友可以參考下
    2022-09-09

最新評論