Linux之Docker(四)映象優化

2021-09-26 05:10:09 字數 3220 閱讀 6923

隨著我們對docker映象的持續使用,在此過程中如果不加以注意並且優化,映象的體積會越來越大

很多時候我們在使用docker部署應用時,會發現映象的體積至少有1g以上

映象體積的增大,不單單會增加磁碟資源與網路資源的開銷,也會影響應用的部署效率,使得應用的部署時間會越來越長

因此我們需要減少部署映象的體積以加快部署效率,降低資源的開銷

而對於映象的優化,可以通過對dockerfile的優化來實現

映象最小化原則

構建速度最快化原則

docker 在執行時分為 docker 引擎(也就是服務端守護程序)和客戶端工具。 docker 的引擎提供了一組 rest api,被稱為 docker remote api, 而如 docker 命令這樣的客戶端工具,則是通過這組 api 與 docker引擎互動,從而完成各種功能。 因此,雖然表面上我們好像是在本機執行各種 docker 功能,但實際上,一切都是使用的遠端呼叫形式在服務端(docker 引擎)完成。

docker build 命令構建映象,其實並非在本地構建,而是在服務端,也就是 docker 引擎中構建的。 構建映象時,docker需要先準備context,將所有需要的檔案收集到程序中。 預設的context包含dockerfile目錄中的所有檔案。

如果目錄中的存在大量不相關的檔案,不僅會導致構建緩慢,而且還會導致映象體積增大。

/dock/下面有nginx的tar包

2.建議盡可能的使用 copy,因為 copy 的語義很明確,就是複製檔案而已,

而add 則包含了更複雜的功能,其行為也不一定很清晰。

3.可以遵循這樣的原則:所有的檔案複製均使用 copy 指令,僅在需要自動解壓縮的場合使用 add。

vim dockerfile

from rhel7 as build

copy ***.repo /etc/yum.repos.d/

add nginx-1.15.8.tar.gz /mnt

workdir /mnt/nginx-1.15.8

run rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel

run sed -i 『s/cflags="$cflags -g"/#cflags="/g』 auto/cc/gcc

run ./configure --prefix=/usr/local/nginx

run make

run make install

from rhel7

copy --from=build /usr/local/nginx /usr/local/nginx

expose 80 #相當於開啟容器的80埠,也可以是其他的埠。開啟後才能做對映。

獲取基礎映象:distroless映象。它只包含應用程式及其執行時依賴項,不包含程式包管理器、shell以及在標準linux發行版中可以找到的任何其他程式

複製文件下面

vim dockerfile

from nginx:1.16 as base

arg asia/shanghai

run mkdir -p /opt/var/cache/nginx && \

cp -a --parents /usr/lib/nginx /opt && \

cp -a --parents /usr/share/nginx /opt && \

cp -a --parents /var/log/nginx /opt && \

cp -al --parents /var/run /opt && \

cp -a --parents /etc/nginx /opt && \

cp -a --parents /etc/passwd /opt && \

cp -a --parents /etc/group /opt && \

cp -a --parents /usr/sbin/nginx /opt && \

cp -a --parents /usr/sbin/nginx-debug /opt && \

cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \

cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \

cp -a --parents /lib/x86_64-linux-gnu/libc.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/libcrypt.so.* /opt && \

cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \

cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \

cp /usr/share/zoneinfo/$ /opt/etc/localtime

from gcr.io/distroless/base

copy --from=base /opt /

expose 80 443

entrypoint ["nginx", "-g", "daemon off;"]

## 建立映象

Docker 四 Docker 映象操作

docker 映象是由檔案系統疊加而成 是一種檔案的儲存形式 最底端是乙個檔案引導系統,即 bootfs,這很像典型的 linux unix 的引導檔案系統。docker 使用者幾乎永遠不會和引導系統有什麼互動。實際上,當乙個容器啟動後,它將會被移動到記憶體中,而引導檔案系統則會被解除安裝,以留出更...

四 (之四)基於已有映象構建自己的Docker映象

4構建自己的docker映象 4.1常用命令 等同於docker commit 將乙個被改變的容器建立成乙個新的image 等同於docker build 通過dockerfile建立乙個image 輸入vim進入程式 q退出。標識最好是 dockerid 別名 實際上這兩個centos image...

四 Docker 構建自己的Docker映象

一台虛擬機器 乙個centos映象 centos映象中裝了docker 需求 構建乙個安裝了vim的centos映象 docker pull centosdocker run it centosyum install y vimdocker commit nice shockley tinner c...