【Docker基礎】Docker鏡像管理:docker build詳解

目錄

1 Docker鏡像基礎概念

1.1 什么是Docker鏡像

1.2 鏡像的分層結構

2 docker build命令詳解

2.1 docker build基本語法

2.2 構建上下文概念

3 Dockerfile編寫實踐示例

3.1 Dockerfile指令詳解

3.1.1 FROM

3.1.2 RUN

3.1.3 COPY vs ADD

3.1.4 CMD vs ENTRYPOINT

3.1.5 EXPOSE

3.1.6 ENV

3.2 多階段構建

4 構建過程優化技巧

4.1 利用構建緩存

4.2 .dockerignore文件

4.3 構建參數(--build-arg)

4.4 鏡像大小優化

5 常見問題與解決方案

5.1 構建速度慢

5.2 鏡像體積過大

5.3 構建緩存失效

6 總結


1 Docker鏡像基礎概念

1.1 什么是Docker鏡像

  • Docker鏡像是一個輕量級、可執行的獨立軟件包,包含運行某個軟件所需的所有內容:代碼、運行時環境、系統工具、系統庫和設置
  • 鏡像采用分層存儲結構,每一層都是只讀的,這種設計使得鏡像可以高效地共享和復用
  • 鏡像與容器的關系可以理解為:鏡像是靜態的定義,容器是鏡像運行時的實體
  • 容器可以被創建、啟動、停止、刪除、暫停等,而鏡像是這些容器運行的基礎

1.2 鏡像的分層結構

Docker鏡像采用分層(Layer)的架構,這種設計帶來了諸多優勢:
  • 共享資源:多個鏡像可以共享相同的底層鏡像層
  • 空間效率:當鏡像更新時,只需傳輸變更的部分
  • 快速構建:構建時可以復用已存在的層
  • 不可變性:每一層都是只讀的,確保一致性
典型的Docker鏡像分層結構:
  • 最底層是基礎操作系統層
  • 中間層包含運行環境和依賴
  • 上層包含應用特定文件
  • 最上層是容器運行時添加的可寫層

2 docker build命令詳解

2.1 docker build基本語法

  • docker build命令用于根據Dockerfile構建鏡像,其基本語法如下:
docker build [OPTIONS] PATH | URL | -
常用選項說明:
  • -t, --tag:指定鏡像名稱和標簽,格式為name:tag
  • -f, --file:指定Dockerfile路徑(默認是上下文路徑下的Dockerfile)
  • --build-arg:設置構建時的變量
  • --no-cache:構建時不使用緩存
  • --pull:總是嘗試拉取新版本的基礎鏡像
  • --target:多階段構建時指定目標階段

2.2 構建上下文概念

構建上下文(Build Context)是指docker build命令中PATH參數指定的目錄及其子目錄,Docker客戶端會將整個上下文目錄打包發送給Docker守護進程,因此:
  • 上下文過大時會導致構建過程變慢
  • 應該通過.dockerignore文件排除不必要的文件
  • Dockerfile中的COPY/ADD指令只能操作上下文中的文件
  • 客戶端將構建上下文打包發送給守護進程
  • 守護進程解析Dockerfile
  • 按順序執行構建指令
  • 生成最終鏡像并存儲在本地

3 Dockerfile編寫實踐示例

3.1 Dockerfile指令詳解

3.1.1 FROM

  • 指定基礎鏡像,必須是Dockerfile的第一條有效指令:
FROM ubuntu:20.04

3.1.2 RUN

  • 執行命令并創建新的鏡像層,常用于安裝軟件包:
RUN apt-get update && apt-get install -y \package1 \package2 \&& rm -rf /var/lib/apt/lists/*

3.1.3 COPY vs ADD

兩者都用于復制文件,但ADD有額外功能:
  • COPY:簡單復制文件/目錄
COPY ./app /usr/src/app
  • ADD:除復制外還能解壓壓縮文件、支持URL
ADD http://example.com/file.tar.gz /tmp/

3.1.4 CMD vs ENTRYPOINT

  • CMD:提供容器默認的執行命令,可被覆蓋
CMD ["python", "app.py"]
  • ENTRYPOINT:配置容器啟動時運行的命令,不易被覆蓋
ENTRYPOINT ["python"] CMD ["app.py"]

3.1.5 EXPOSE

  • 聲明容器運行時監聽的端口:
EXPOSE 8080

3.1.6 ENV

  • 設置環境變量,可被后續指令使用:
ENV NODE_ENV=production

3.2 多階段構建

  • 多階段構建可以顯著減小最終鏡像大小:
  • 最終鏡像只包含運行所需內容,不包含構建工具
  • 減小鏡像體積
  • 提高安全性(減少攻擊面)

4 構建過程優化技巧

4.1 利用構建緩存

Docker會緩存已構建的層,合理組織Dockerfile可以最大化利用緩存:
  • 將變化頻率低的指令放在前面
  • 將變化頻率高的指令(如COPY源代碼)放在后面
  • 合并相關RUN命令減少層數

4.2 .dockerignore文件

  • 類似于.gitignore,用于排除不需要加入構建上下文的文件:
# 忽略git目錄
.git/# 忽略日志文件
*.log# 忽略臨時文件
tmp/# 忽略本地配置文件
config/local.ini

4.3 構建參數(--build-arg)

  • 允許構建時傳入變量,增加Dockerfile靈活性:
ARG VERSION=latest FROM ubuntu:$VERSION
  • 構建時指定:
docker build --build-arg VERSION=20.04 -t myapp .

4.4 鏡像大小優化

  • 使用輕量級基礎鏡像(如alpine)
  • 多階段構建
  • 清理不必要的文件(如apt緩存)
  • 合并RUN指令減少層數
  • 使用docker-slim等工具進一步優化

5 常見問題與解決方案

5.1 構建速度慢

可能原因及解決方案:
  • 大構建上下文:優化.dockerignore,減少上下文大小
  • 網絡延遲:使用本地鏡像倉庫或國內鏡像源
  • 未充分利用緩存:合理組織Dockerfile指令順序
  • 復雜構建步驟:考慮使用多階段構建分離構建和運行環境

5.2 鏡像體積過大

  • 使用docker history 分析各層大小
  • 刪除不必要的中間文件和緩存
  • 使用alpine等小型基礎鏡像
  • 采用多階段構建

5.3 構建緩存失效

  • 指令順序改變
  • 上游基礎鏡像更新
  • 構建參數變化
  • 上下文文件變化

6 總結

Docker鏡像構建是容器化應用的關鍵環節,掌握docker build和Dockerfile的細節能夠顯著提高開發效率和部署質量。
通過合理利用多階段構建、構建緩存、.dockerignore文件等技術,可以創建出高效、安全且體積小的Docker鏡像,為容器化應用奠定堅實基礎。

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

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

相關文章

在 macOS 上部署 Akash Network 的完整 Shell 腳本解決方案

以下是在 macOS 上部署 Akash Network 的完整 Shell 腳本解決方案,包含詳細注釋和錯誤處理: #!/bin/bash # Akash Network macOS 部署腳本 v2.5 # 功能:在 macOS 系統上完整部署 Akash Network 節點和客戶端工具 # 作者:DeepSeek 區塊鏈團隊 # 日期:2025-06-20 # 文檔:h…

【分布式理論】讀確認數與寫確認數:分布式一致性的核心概念

文章目錄 零、概述一、基本概念解釋1、 什么是寫確認數(w)?2、 什么是讀確認數(r)?3、一致性級別的對應關系 二、工作流程詳解1、 寫操作的完整流程2、 讀操作的完整流程 三、強一致性的數學原理1、 為什么…

滾珠導軌在醫療設備中有多重要?

在醫療設備領域,穩定性是保障手術安全、提升診斷精度的核心要素。無論是手術機器人精準的器械操作,還是CT掃描儀高速穩定的掃描運動,都離不開背后精密傳動系統的支持。作為線性運動的核心部件,滾珠導軌憑借其獨特的滾動摩擦原理與…

港科ISM選課攻略整理

畢業要求 課程和課程目錄(ISM專業) "D:\HKUST-ISM\prepare\中英Program & Course Catalog.pdf" 課程和課程目錄(全部ISOM課程) "D:\HKUST-ISM\prepare\全部ISOM Course Catalog.pdf" 兩個可選專業方向 Financial Technolo…

rent8_wechat-最常用出租屋管理系統-微信小程序

rent8_wechat-最常用出租屋管理系統是rent8的微信小程序,需要和rent8配合使用。rent8_wechat基于Tdesign開發。 核心功能 房產管理:新增房產信息、修改房產信息、刪除房產信息。房間管理:新增房間信息、修改房間信息、刪除房間信息、入住管…

OpenCV CUDA模塊設備層---- 絕對值函數abs()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 這是 OpenCV 的 cv::cudev 模塊中用于 CUDA 設備端(device)的絕對值函數,專門處理 uchar1 類型(即…

IEC61850 通信協議測試驗證方法詳解

一、MMS 協議測試方法 MMS(制造報文規范)是 IEC61850 中用于設備監控和控制的核心協議,測試需覆蓋以下維度: (一)協議棧實現驗證 連接管理測試 測試用例:建立和釋放 MMS 連接 100 次&#xf…

關于 Kyber:抗量子密碼算法 Kyber 詳解

一、基本概念 后量子密碼學(PQC) │ ├──> 是一個領域(研究如何在“量子時代”保護數據安全) │ └──> Kyber 是這個領域中設計出來的一個“抗量子密碼算法”└──> Kyber 是用于加密密鑰交換的算法(叫…

如何保障具身智能系統級安全?鴻道OS給出中國方案

由東土科技自主研發完成的鴻道(Intewell)工業操作系統正式發布。東土科技董事長李平與該公司全資子公司光亞鴻道總經理鄒露君在接受第一財經等采訪時,解釋了如何通過操作系統為具身智能產業提供底層支撐,解決產業規模化落地的安全…

深入淺出:JavaScript ES6中類(Class)的革新與實踐

深入淺出:JavaScript ES6中類(Class)的革新與實踐 在JavaScript的發展歷程中,ES6(ECMAScript 2015)無疑是一個里程碑式的版本。它不僅引入了let、const、箭頭函數等特性,更通過**類&#xff08…

華大北斗TAU804M-N2B0雙頻單北斗高精度定位模塊 100%國產雙頻北斗 打破u-blox技術壟斷

華大北斗TAU804M-N2B0雙頻單北斗模塊深度解析 1. 產品定位 TAU804M-N2B0 是華大北斗(HDSC)推出的 雙頻單北斗高精度定位模塊,支持 B1IB2a雙頻信號接收,專為 高精度定位、抗多徑干擾 場景設計,是北斗三號系統應用的標桿…

IP證書申請攻略細則,有何作用?

IP證書申請攻略細則及作用解析 一、IP證書的作用 數據加密傳輸 IP證書通過SSL/TLS協議對客戶端與服務器之間的數據進行加密,防止數據在傳輸過程中被竊取或篡改,適用于物聯網設備、API接口、測試服務器等直接通過IP訪問的場景。 身份驗證與防偽造 瀏覽器…

回文鏈表C++

給你一個單鏈表的頭節點 head ,請你判斷該鏈表是否為回文鏈表。如果是,返回 true ;否則,返回 false 。 時間復雜度較大的解法: /*** Definition for singly-linked list.* struct ListNode {* int val;* Lis…

限流系列之三:TDMQ for Apache Pulsar 限流技術深度解析

導語 在高速、高吞吐量的消息處理場景中,TDMQ Pulsar 版以其卓越的性能和可擴展性成為眾多企業的首選。然而,隨著生產者和消費者以極高的速度生產/消費大量消息,服務器資源如 CPU、內存、網絡及磁盤 IO 等可能會面臨飽和風險。為此&#xff…

非研發部門參與產品開發過程的價值體現

漢捷咨詢 胡紅衛 企業已經越來越意識到新產品開發項目需要市場、銷售、制造、采購、服務、財務等非研發部門的參與,嘗試建立跨部門的項目組,安排相關人員參與項目,但是效果如何呢?在漢捷咨詢對很多企業調研診斷過程中,…

Kafka的存儲與索引:數據處理的底層奧秘

一、引言 Kafka 之所以能在海量數據的傳輸和處理過程中保持高效的性能和低延遲,背后隱藏著眾多精妙的設計,而其存儲與索引機制便是其中的核心奧秘。接下來,讓我們深入探尋 Kafka 存儲機制的基石與架構。 二、分區與日志組織? Kafka 中的消…

大模型與搜索引擎的技術博弈及未來智能范式演進

基于認知革命與技術替代的全景綜述 一、大模型對搜索引擎的替代性分析:技術范式與市場重構 (1)技術原理的代際分野 傳統搜索引擎遵循 "爬蟲抓取 - 索引構建 - 關鍵詞排序" 的三段式架構,其核心是基于 PageRank 算法的…

XC7K325T數據采集卡設計原理圖:786-基于X86 CPU+XC7K325T的16路16bit 1M sps同步數據采集卡

基于X86 CPUXC7K325T的16路16bit 1M sps同步數據采集卡 一、板卡概述 板卡為緊湊型的X86FPGA的工業監測處理平臺,高度集成的硬件和完整的labview開發軟件,大大方便客戶現場使用。 二、板卡功能 板卡功能 參數內容 X86 SOM核心板 主頻 2.0GHz …

單片機3種按鍵程序消抖方法

1,查詢法延時模式 u8 key01;u8 x0;KEY1;while(1){if(KEY0) //"按鍵按下"{delay(10); //延時10msif(KEY0 && kdy01) //按下有10ms 且上狀態是1。即下降沿時{key00; //將上狀態置0.防止按住不放時&#xff0…

【java面試】線程篇

【java面試】線程篇 一、基礎知識1 線程與進程的區別2 并行與并發的區別3 創建線程的方式4 線程包含了哪些狀態,狀態之間是如何變化的?5 新建三個線程,如何保證他們按照順序執行?6、java中的wait和sleep方法的不同7 如何停止一個正…