docker鏡像應該遵循的原則:1、鏡像最小化原則;需要選擇最精簡的基礎鏡像、清理鏡像構建的中間產物、減少鏡像的層數。2、構建速度最快化原則;充分利用鏡像構建緩存,再利用構建的緩存來加快鏡像構建速度。3、注意優化網絡請求。
本教程操作環境:linux5.9.8系統、docker-1.13.1版、Dell G3電腦。
1.為什么要做鏡像優化?
隨著我們對docker鏡像的持續使用,在此過程中如果不加以注意并且優化,鏡像的體積會越來越大
很多時候我們在使用docker部署應用時,會發現鏡像的體積至少有1G以上
鏡像體積的增大,不單單會增加磁盤資源與網絡資源的開銷,也會影響應用的部署效率,使得應用的部署時間會越來越長
因此我們需要減少部署鏡像的體積以加快部署效率,降低資源的開銷
而對于鏡像的優化,可以通過對dockerfile的優化來實現
2.構建鏡像的幾個原則
(1)鏡像最小化原則
選擇最精簡的基礎鏡像
選擇體積最小的基礎鏡像可有效降低鏡像體積。如:alpine、busybox等.
清理鏡像構建的中間產物
構建鏡像的過程中,當dockerfile的指令執行完成后,刪除鏡像不需要用的的文件。
如使用yum安裝組件,最后可使用yum clean all鏡像清理不需要的文件或者使用系統rm命令刪除不需要的源文件等。
減少鏡像的層數
鏡像是一個分層存儲的文件,并且鏡像對層數也是有一定數量的限制,當前鏡像的層數最高是127層,
如果不多加注意,將會導致鏡像越來越臃腫。
在使用dockerfile構建鏡像時,dockerfile中的每一條指令都會生成一個層,
因此可以通過合并dockerfile中可合并的指令,減少最終生成鏡像的層數。
例如:在dockerfile中使用RUN執行shell命令是,可以用"&&"將多條命令連接起來
采用最最基礎的鏡像
,
鏡像越小越精簡
(2)構建速度最快化原則
充分利用鏡像構建緩存
我們可以利用構建的緩存來加快鏡像構建速度,Docker構建默認會開啟緩存,緩存生效有三個關鍵點,
鏡像父層沒有發生變化,構建指令不變,添加文件校驗和一致。
只要一個構建指令滿足這三個條件,這一層鏡像構建就不會再執行,它會直接利用之前構建的結果。
某一層的鏡像緩存失效之后,它之后的鏡像層緩存都會失效。
我們應該把變化最少的部分放在Dockerfile的前面,這樣可以充分利用鏡像緩存。
dockerfile中有可能導致緩存失效的命令WORKDIR、CMD、ENV、ADD等,
像這些命令最好放到dockerfile底部,以便在構建鏡像過程中最大限度使用緩存。
刪除構建目錄中(默認:Dockerfile所在目錄)不需要用的的文件
編寫.dockerignore文件過濾構建過程中不必要的文件或者創建單獨的目錄,并且目錄中僅存在鏡像構建過程中需要使用的文件。
Docker 在運行時分為 Docker 引擎(也就是服務端守護進程)和客戶端工具。
Docker 的引擎提供了一組 REST API,被稱為 Docker Remote API,
而如 docker 命令這樣的客戶端工具,則是通過這組 API 與 Docker 引擎交互,從而完成各種功能。
因此,雖然表面上我們好像是在本機執行各種 docker 功能,但實際上,一切都是使用的遠程調用形式在服務端(Docker 引擎)完成。docker build 命令構建鏡像,其實并非在本地構建,而是在服務端,也就是 Docker 引擎中構建的。
構建鏡像時,Docker需要先準備context ,將所有需要的文件收集到進程中。
默認的context包含Dockerfile目錄中的所有文件。
(3)注意優化網絡請求
我們使用一些鏡像源或者在dockerfile中使用互聯網上的url時,
去用一些網絡比較好的開源站點,這樣可以節約時間、減少失敗率。
3.在虛擬機模擬源碼編譯nginx
選擇最精簡的基礎鏡像 減少鏡像的層數 清理鏡像構建的中間產物 注意優化網絡請求 盡量去用構建緩存
啟動docker
:
查看鏡像并刪除無用的鏡像
:
先源碼編譯nginx,熟悉步驟后好在容器中運行nginx
:
關閉debug
:
查看執行命令
:
4.鏡像的優化
階段構建鏡像接下來我們以rhel7鏡像構建容器,并在容器中安裝nginx的源碼包。以此容器構建新的鏡像并做做優
(1)在真機上面給server1傳兩個包
優化思路:將RUN都放在一行,減少鏡像層數
:
編寫Dockerfile如下
優化思路:使用多階段構建
:
Dokcerfile如下:
先模擬命令行關閉debug:
優化思路:從底層優化
:
首先我們需要導入一個distroless和nginx鏡像 distroless”鏡像只包含應用程序及其運行時依賴項,不包含程序包管理器、shell以及在標準Linux發行版中可以找到的任何其他程序 用distroless去除容器中所有不必要的東西
1)從github網站查看例子:
(2)從真機給server1發送東西
(3)導入鏡像
(4)編寫Dockerfile如下
(5)構建鏡像并查看鏡像大小
(6)構建容器并測試
查看IP并能正常訪問到Nginx默認發布頁,證明容器鏡像可以正常使用,但只要內網可以訪問:
按照查看橋接的工具:
查看橋接:
做端口映射
可以通過外網訪問了:
推薦學習:《docker視頻教程》