docker大鏡像優化實戰

在 Docker 鏡像優化方面,有許多實戰技巧可以顯著減小鏡像體積、提高構建效率和運行時性能。以下是一些實用的優化策略和具體操作方法:

1. 選擇合適的基礎鏡像

策略
  • 使用 Alpine 版本:Alpine 鏡像通常只有 5-10MB,比 Ubuntu/Debian 小一個數量級。
  • 使用官方 slim 鏡像:如python:slimnode:lts-slim,專為生產環境優化。
  • 避免使用完整操作系統:除非確實需要,否則不要使用ubuntu:latest等通用鏡像。
示例
# 糟糕的選擇
FROM python:3.9# 推薦的選擇
FROM python:3.9-alpine

2. 多階段構建 (Multi-Stage Build)

策略
  • 將構建過程分為編譯階段和運行階段。
  • 只將最終需要的文件復制到運行時鏡像中。
示例
# 構建階段
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp# 運行階段
FROM alpine:3.17
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]

3. 減少鏡像層數

策略
  • 將多個RUN命令合并為一個,減少中間層。
  • 使用&&連接命令,并清理不必要的文件。
示例
# 糟糕的寫法
RUN apt-get update
RUN apt-get install -y python3
RUN rm -rf /var/lib/apt/lists/*# 推薦的寫法
RUN apt-get update && apt-get install -y python3 \&& rm -rf /var/lib/apt/lists/*

4. 優化包管理器使用

策略
  • 避免安裝不必要的依賴。
  • 使用--no-install-recommends選項。
  • 及時清理包緩存。
示例
# APT (Debian/Ubuntu)
RUN apt-get update && apt-get install -y --no-install-recommends \python3 \python3-pip \&& rm -rf /var/lib/apt/lists/*# APK (Alpine)
RUN apk add --no-cache python3 py3-pip

5. 使用.dockerignore 文件

策略
  • 排除不需要的文件(如.git、測試數據、構建緩存等)。
  • 減小上下文大小,加快構建速度。
示例.dockerignore
.git
node_modules
__pycache__
build

6. 合理安排層順序

策略
  • 將變更頻率低的層放在前面,利用緩存。
  • 例如,先復制依賴文件,再安裝依賴。
示例

dockerfile

# 先復制package.json并安裝依賴
COPY package.json package-lock.json ./
RUN npm install# 再復制源代碼
COPY . .

7. 使用更小的文件系統

策略
  • 避免在鏡像中存儲大型文件(如數據庫轉儲、日志)。
  • 使用外部存儲(如卷、對象存儲)保存動態數據。

8. 清理構建產物

策略
  • 在同一RUN命令中刪除構建工具和臨時文件。
示例
RUN apk add --no-cache gcc musl-dev python3-dev \&& pip install --no-cache-dir pandas \&& apk del gcc musl-dev python3-dev

9. 避免在容器中運行包管理器

策略
  • 不要在容器運行時使用apt-get updatenpm install
  • 所有依賴應在構建階段安裝。

10. 使用工具分析和優化

工具推薦

1)docker-slim:自動分析并生成精簡鏡像。

docker-slim build --target myimage:latest

2)dive:深入分析鏡像層,找出大文件。

dive myimage:latest

3)docker history:查看鏡像各層大小。

docker history myimage:latest

11.案例

1)優化 Node.js 鏡像
#優化前
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .# 優化后
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/main.js"]
2)優化 Python 鏡像
FROM python:3.9-alpine
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
3)優化 Java 鏡像
FROM maven:3.8.6-openjdk-18 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTestsFROM openjdk:18-jdk-alpine
WORKDIR /app
COPY --from=builder /app/target/myapp.jar .
CMD ["java", "-jar", "myapp.jar"]

優化前后對比示例

假設初始鏡像大小為 800MB,通過上述優化策略:

  1. 切換到 Alpine 基礎鏡像:-300MB
  2. 使用多階段構建:-200MB
  3. 清理不必要文件:-100MB
  4. 優化層結構:-50MB

最終鏡像大小可能降至 150MB,體積減少 80% 以上!

總結

優化 Docker 鏡像需要從多個維度入手,結合鏡像分析工具持續改進。關鍵原則是:只包含運行時必要的文件,保持鏡像層精簡,利用緩存提高效率。通過這些策略,可以顯著降低鏡像體積,提高部署速度和安全性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82834.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82834.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java面試終極篇:Sentinel+Seata+Kafka Streams高并發架構實戰

面試官:張總(嚴肅臉) 程序員:小王(緊張冒冷汗) 第一輪:分布式基礎 張總:說說Spring Cloud Alibaba的Sentinel和Nacos的區別? 小王:(結巴&#…

hab機制

HAB(Host-to-Guest Communication)?是一種用于高通平臺上的主機與虛擬機之間的通信機制,主要用于實現宿主操作系統(host OS)與虛擬機操作系統(guest OS)之間的數據共享和通信。HAB機制允許虛擬…

Mac M系列 安裝 jadx-gui

安裝 Homebrew在終端中執行以下命令(需管理員密碼): 安裝 Homebrew(官方源) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"國內用戶可用鏡像源加速&…

Angular | 利用 `ChangeDetectorRef` 解決 Angular 動態顯示輸入框的聚焦問題

在 Angular 應用開發中,實現用戶點擊按鈕后,原地切換顯示一個輸入框并自動獲取焦點的功能,是一個常見的交互模式。例如,搜索圖標點擊后變為搜索框,用戶可以直接輸入。然而,由于 Angular 的變更檢測和 DOM 更…

CSP認證準備第三天-差分及第36次CCF認證(BFS)

基礎知識參考: csp突擊前兩題常用算法代碼_ccf csp常用優化算法-CSDN博客 差分 什么是差分數組? 差分數組是原數組相鄰元素之間的差值構成的數組。對于原數組 a,其差分數組 b 定義為: b[1] a[1] (假設 a[0] 0) b[i] a[i] …

[案例四] 智能填寫屬性工具(支持裝配組件還有建模實體屬性的批量創建、編輯)

論文盲審結果要出來了,渣渣超沒有心情繼續寫了,過一段時間再說吧,今天宣布五一結束,哈哈哈。寫完這篇博客開始搞科研了,有時間再進NX開發學習。本次案例主要是對上次導出自動導出BOM的一個前處理,要想導出屬性,首先的有屬性。于是本著學習的態度進行制作,可能有些功能有…

四核RK3566多媒體控制板技術分享(RK3566如何實現7個串口同時進行)

四核RK3566多媒體控制板技術分享: 今天分享一款近期接觸到的四核RK3566多媒體控制板(產品型號:ZK-R36A),這款產品在工業控制和智能設備領域有不錯的表現,特此整理了一些技術參數供大家參考。 產品概述: 這款控制板采用…

多線程代碼案例-1 單例模式

單例模式 單例模式是開發中常見的設計模式。 設計模式,是我們在編寫代碼時候的一種軟性的規定,也就是說,我們遵守了設計模式,代碼的下限就有了一定的保證。設計模式有很多種,在不同的語言中,也有不同的設計…

【計算機組成原理】第二部分 存儲器--分類、層次結構

文章目錄 分類&層次結構0x01 分類按存儲介質分類按存取方式分類按在計算機中的作用分類 0x02 層次結構 分類&層次結構 0x01 分類 按存儲介質分類 半導體存儲器磁表面存儲器磁芯存儲器光盤存儲器 按存取方式分類 存取時間與物理地址無關(隨機訪問&#…

迅為RK3588開發板安卓GPIO調用APP運行測試

將網盤上的安卓工程文件復制到 Windows 電腦上。確保工程路徑中使用英文字符,不包含中文。接著,啟動 Android Studio,點擊“Open”按鈕選擇應用工程文件夾,然后點擊“OK”。由于下載 Gradle 和各種 Jar 包可能需要一段時間&#x…

BFS算法篇——打開智慧之門,BFS算法在拓撲排序中的詩意探索(下)

文章目錄 引言一、課程表1.1 題目鏈接:https://leetcode.cn/problems/course-schedule/description/1.2 題目分析:1.3 思路講解:1.4 代碼實現: 二、課程表||2.1 題目鏈接:https://leetcode.cn/problems/course-schedul…

計數循環java

import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int count 10;while(count > 0) {count count -1;System.out.println(count);}System.out.println(count);System.out.println("發射&am…

11. CSS從基礎樣式到盒模型與形狀繪制

在前端開發中,CSS(層疊樣式表)是控制網頁樣式和布局的核心技術。整理了關于 CSS 基礎樣式、文本樣式、盒模型以及形狀繪制的一些心得。以下是詳細的學習筆記。 一、基礎樣式設置 1. 字體樣式 字體樣式是網頁視覺呈現的重要組成部分&#xf…

雙種群進化算法:動態約束處理與資源分配解決約束多目標優化問題

雙種群進化算法:動態約束處理與資源分配解決約束多目標優化問題 一、引言 約束多目標優化問題(CMOPs)在工程設計、資源分配等領域廣泛存在,其核心是在滿足多個約束條件的同時優化多個目標函數。傳統方法往往難以平衡約束滿足與目…

【Qt】pro工程文件轉CMakeLists文件

1、簡述 Qt6以后默認使用cmake來管理工程,之前已經一直習慣使用pro,pro的語法確實很簡單、方便。 很多項目都是cmake來管理,將它們加入到Qt項目中,cmake確實是大勢所趨。比如,最近將要開發的ROS項目,也是使用的cmake語法。 以前總結的一些Qt代碼,已經編寫成pro、pri等…

手機換地方ip地址會變化嗎?深入解析

在移動互聯網時代,我們經常帶著手機穿梭于不同地點,無論是出差旅行還是日常通勤。許多用戶都好奇:當手機更換使用地點時,IP地址會隨之改變嗎?本文將深入解析手機IP地址的變化機制,幫助您全面了解這一常見但…

【Canda】常用命令+虛擬環境創建到選擇

目錄 一、conda常用命令 二、conda 環境 2.1 創建虛擬環境 2.2 conda環境切換 2.3 查看conda環境 2.4 刪除某個conda環境 2.5 克隆環境 三、依賴包管理 3.1 安裝命令 3.2 更新包 3.3 卸載包 3.4 查看環境中所有包 3.5 查看某個包的版本信息 3.6 搜索包 四、環境…

目標檢測任務常用腳本1——將YOLO格式的數據集轉換成VOC格式的數據集

在目標檢測任務中,不同框架使用的標注格式各不相同。常見的框架中,YOLO 使用 .txt 文件進行標注,而 PASCAL VOC 則使用 .xml 文件。如果你需要將一個 YOLO 格式的數據集轉換為 VOC 格式以便適配其他模型,本文提供了一個結構清晰、…

Python作業練習2

任務簡述 if_name__main_的含義,why? 問題解答 在Python中,if __name__ __main__:是一種常見的慣用法,用于檢查當前模塊是否是主程序入口點。要理解其含義和用途,首先需要了解兩個概念: 1. __name__: 這是一個特…

ppy/osu構建

下載 .NET (Linux、macOS 和 Windows) | .NET dotnet還行 構建:f5 運行:dotnet run --project osu.Desktop -c Debug