Docker build創建鏡像命令入門教程

一、核心概念
  1. Dockerfile
    定義鏡像構建步驟的文本文件,包含一系列指令和配置,用于自動化創建鏡像。

  2. 鏡像層(Layer)
    Docker 鏡像由多層只讀層疊加而成,每個指令(如 RUNCOPY)會生成一個新的層。層可緩存,加速重復構建。

  3. 構建上下文(Build Context)
    發送給 Docker 守護進程的文件集合,用于構建鏡像。默認是 Dockerfile 所在目錄。

二、Dockerfile 基礎指令

1. FROM

  • 用途:指定基礎鏡像,所有 Dockerfile 必須以 FROM 開頭。
  • 示例
    FROM nginx:latest  # 基于官方 Nginx 鏡像
    

2. RUN

  • 用途:執行 shell 命令,生成新的鏡像層。
  • 示例
    RUN apt-get update && apt-get install -y curl  # 安裝依賴
    

3. COPY

  • 用途:將本地文件或目錄復制到鏡像中。
  • 示例
    COPY ./src /app/src  # 復制宿主機的 src 目錄到鏡像的 /app/src
    

4. ADD

  • 用途:類似 COPY,但支持自動解壓壓縮文件(如 .tar.gz)和遠程 URL。
  • 示例
    ADD https://example.com/file.tar.gz /app/  # 下載并解壓文件
    

5. WORKDIR

  • 用途:設置工作目錄,后續指令(如 RUNCOPY)將在此目錄執行。
  • 示例
    WORKDIR /app  # 切換到 /app 目錄
    

6. CMD

  • 用途:定義容器啟動時默認執行的命令(可被覆蓋)。
  • 示例
    CMD ["node", "server.js"]  # 啟動 Node.js 服務
    

7. ENTRYPOINT

  • 用途:定義容器啟動時執行的命令(不可被覆蓋,但可通過 --entrypoint 修改)。
  • 示例
    ENTRYPOINT ["python", "app.py"]  # 固定執行 Python 腳本
    

8. EXPOSE

  • 用途:聲明容器監聽的端口(僅文檔作用,實際需通過 -p 映射)。
  • 示例
    EXPOSE 8080  # 聲明應用使用 8080 端口
    

9. ENV

  • 用途:設置環境變量。
  • 示例
    ENV API_URL=https://api.example.com  # 定義 API 地址
    
三、docker build 命令詳解

基本語法

docker build [OPTIONS] PATH | URL | -

常用選項

  • -t, --tag:指定鏡像名稱和標簽(格式:name:tag)。
  • -f, --file:指定 Dockerfile 路徑(默認為 PATH/Dockerfile)。
  • --no-cache:禁用緩存,強制重新執行所有步驟。
  • --build-arg:傳遞構建參數(需在 Dockerfile 中用 ARG 定義)。

示例

  1. 構建并標記鏡像:
    docker build -t my_app:v1 .  # 當前目錄為構建上下文
    
  2. 指定 Dockerfile 路徑:
    docker build -t my_app:v1 -f Dockerfile.prod .
    
  3. 傳遞構建參數:
    docker build --build-arg ENV=prod -t my_app:prod .
    
四、構建流程示例

目標:構建一個 Node.js 應用鏡像。

步驟 1:創建項目結構

mkdir -p node-app/{src,public}
touch node-app/server.js node-app/package.json

步驟 2:編寫 Dockerfile

# 使用官方 Node.js 18 鏡像作為基礎
FROM node:18-alpine# 設置工作目錄
WORKDIR /app# 復制 package.json 和 package-lock.json
COPY package*.json ./# 安裝依賴
RUN npm install# 復制應用源碼
COPY . .# 暴露端口 3000
EXPOSE 3000# 啟動應用
CMD ["node", "server.js"]

步驟 3:構建鏡像

docker build -t node-app:latest .

步驟 4:運行容器

docker run -p 3000:3000 node-app:latest
五、最佳實踐
  1. 減少鏡像層數
    合并相關指令(如 RUN apt-get update && apt-get install -y ...),避免生成過多無用層。

  2. 使用 .dockerignore
    排除構建上下文中的無關文件(如 node_modules.git),減少傳輸大小。

    .git
    node_modules
    *.log
    
  3. 多階段構建(Multi-Stage Builds)
    分離構建環境和運行環境,減小最終鏡像體積。

    # 階段 1:構建應用
    FROM node:18 AS builder
    WORKDIR /app
    COPY . .
    RUN npm install && npm run build# 階段 2:運行應用
    FROM node:18-alpine
    WORKDIR /app
    COPY --from=builder /app/dist ./dist
    CMD ["node", "dist/server.js"]
    
  4. 使用輕量級基礎鏡像
    優先選擇 Alpine Linux 或 distroless 鏡像,減少鏡像體積和安全風險。

    FROM node:18-alpine  # 體積約 100MB,遠小于默認的 Ubuntu 鏡像
    
  5. 避免以 root 用戶運行
    創建非 root 用戶,提升容器安全性。

    RUN adduser -D app_user
    USER app_user
    
六、調試與優化
  1. 查看構建日志

    docker build --progress=plain -t my_app:debug .  # 顯示詳細日志
    
  2. 跳過緩存

    docker build --no-cache -t my_app:nocache .
    
  3. 分析鏡像層

    docker history my_app:latest  # 查看各層大小和命令
    
  4. 掃描鏡像漏洞
    使用 docker scan 或第三方工具(如 Trivy)檢查安全風險。

    docker scan my_app:latest
    
七、常見問題
  1. 構建失敗:文件未找到

    • 原因:COPYADD 指令路徑錯誤。
    • 解決:檢查文件是否在構建上下文中,使用絕對路徑或正確相對路徑。
  2. 權限拒絕(Permission Denied)

    • 原因:容器內進程以非 root 用戶運行,但文件權限不足。
    • 解決:在 Dockerfile 中使用 RUN chown 修改文件所有者。
  3. 緩存未生效

    • 原因:構建上下文文件變更導致緩存失效。
    • 解決:盡量保持靜態文件(如依賴包)不變,或合理拆分指令。
  4. 端口無法訪問

    • 原因:未通過 -p 映射端口。
    • 解決:運行容器時添加 -p 主機端口:容器端口,如 docker run -p 8080:80 nginx
八、總結
  • Dockerfile 是鏡像構建的核心,需合理設計指令順序和層結構。
  • docker build 命令通過參數控制鏡像名稱、上下文和緩存策略。
  • 遵循最佳實踐(如多階段構建、輕量級鏡像)可顯著優化構建效率和安全性。

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

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

相關文章

Redis 是單線程模型嗎?

最近在面試中經常被問到這個問題:"Redis是單線程的嗎?"很多同學都會脫口而出:"是的!"但其實這個答案并不完全正確。今天我們就來聊聊Redis的線程模型,把這個問題徹底搞清楚。 先說結論 Redis的線程…

Hologres實戰:路徑分析函數

前言 Hologres提供了一套高效的路徑分析函數,包括路徑明細計算和結果解析功能,能夠幫助用戶深入理解用戶行為路徑,并通過桑基圖實現數據可視化。 一、核心功能 路徑明細計算:精確記錄用戶在產品或功能中的完整訪問路徑結果解析…

產品開發實踐(常見的軟硬結合方式)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】前面說過,傳統的純軟件開發,在國內的大背景下面是很難存活的。但是如果是把軟件,構建在硬件基礎之上&#xff0c…

Linux | i.MX6ULL網絡通信-套字節 UDP(第十八章)

01 Linux | i.MX6ULL網絡通信-套字節 TCP(第十七章) 02 iTOP-IMX6ULL 實現基于 UDP 的 socket 編程。

學習嵌入式第三十天

文章目錄進程和線程&#xff08;續&#xff09;線程1.線程傳參2.線程屬性3.線程間通信1.概念2.方式3.互斥鎖4.死鎖5.信號量習題 進程和線程&#xff08;續&#xff09; 線程 1.線程傳參使用第四個參數實現對線程內部的傳參 代碼實現&#xff1a; #include <stdio.h> #inc…

GaussDB 數據庫架構師修煉(十三)安全管理(3)-行級訪問控制

1 背景行級訪問控制特性將數據庫的訪問控制精確到數據表行級別 &#xff0c;只允許用戶查看 、更新或刪除特定的行數據。2 實例場景實例以醫生只能看到治療的病人&#xff0c;不能看其它醫生的病人為例&#xff1a;1)醫院病人的信息表pat_info&#xff1a;csdn> set search_…

Wi-Fi 與蜂窩網絡(手機網絡)的核心區別,以及 Wi-Fi 技術未來的發展方向

在日常生活中&#xff0c;我們既離不開家里的 Wi-Fi&#xff0c;也離不開手機的 4G/5G 網絡。它們都能把我們連接到互聯網&#xff0c;但底層的工作方式卻大不相同。一、設計初衷的不同Wi-Fi誕生于 1997 年的 IEEE 802.11 標準&#xff0c;定位是局域網無線替代。它的目標是讓電…

C++編程實戰:高效解決算法與數據結構問題

個人主頁 &#xff1a; zxctscl 專欄 【C】、 【C語言】、 【Linux】、 【數據結構】、 【算法】 如有轉載請先通知 題目1. 數字統計2. 兩個數組的交集3. 牛牛的快遞4. 點擊消除5. 最小花費爬樓梯6. 簡寫單詞1. 數字統計 BC153 數字統計 #include <iostream> using na…

《零基礎入門AI:深度學習中的視覺處理(卷積神經網絡(CNN)進階)》

一、卷積知識擴展 1. 二維卷積 單通道版本 對于單通道輸入圖像 III (尺寸 HWH \times WHW) 和卷積核 KKK (尺寸 FFF \times FFF)&#xff0c;輸出特征圖 OOO 的計算公式為&#xff1a; O(i,j)∑m0F?1∑n0F?1I(im,jn)?K(m,n)O(i,j) \sum_{m0}^{F-1} \sum_{n0}^{F-1} I(im, j…

pyecharts可視化圖表-pie:從入門到精通(進階篇)

歡迎來到pyecharts餅圖系列教程的進階篇&#xff01;在上一篇基礎教程中&#xff0c;我們學習了餅圖的基本概念和簡單實現。在本文中&#xff0c;我們將深入探索pyecharts中餅圖的六種高級用法和自定義選項&#xff0c;包括環形餅圖、富文本標簽餅圖、滾動圖例餅圖、環形圖、嵌…

【JAVA 核心編程】面向對象高級:類變量與方法 抽象類與接口

一、類變量與類方法&#xff08;靜態變量&#xff09; 1&#xff09;類變量 class Child{private String name;//定義一個變量count&#xff0c;是一個類變量&#xff08;靜態變量&#xff09;static靜態//該變量最大的特點就是會被Child 類的所有對象訪問public static int co…

【Java基礎面試題】數據類型

Java面試高頻總結&#xff1a;基本數據類型深度解析 &#x1f4ca; 八種基本數據類型詳解數據類型關鍵字字節數位數默認值取值范圍核心特性字節型byte180-128 ~ 127最小整數類型短整型short2160-32,768 ~ 32,767較少使用整型int4320-2 ~ 2-1 (約21億)最常用整數類型長整型long8…

攻防世界—unseping(反序列化)

一.審題<?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("ping"))) {call_u…

AI熱點周報(8.10~8.16):AI界“冰火兩重天“,GPT-5陷入熱議,DeepSeek R2模型訓練受阻?

名人說&#xff1a;博觀而約取&#xff0c;厚積而薄發。——蘇軾《稼說送張琥》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄3分鐘速覽版&#xff1a;一張表看懂本周AI大事一、GPT-5&#xff1a;期待越高&#x…

Python_vue3_django旅拍在線婚紗攝影網站的設計與實現016023190_源碼LW_講解安裝

目錄前言-本系統介紹已開發項目效果實現截圖開發技術詳細介紹論文設計框架系統測試核心代碼參考示例總結源碼獲取詳細視頻演示或者查看其他版本&#xff1a;文章底部獲取博主聯系方式&#xff01;前言-本系統介紹 利用Python語言、MySQL數據庫&#xff0c;Django框架&#xff0…

Python爬蟲-爬取政務網站的文檔正文內容和附件數據

前言 本文是該專欄的第67篇,后面會持續分享python爬蟲干貨知識,記得關注。 本文,筆者以某政務網站為例子。基于Python爬蟲采集某政務網站的文檔正文內容和其關聯的附件數據。 具體的實現思路以及完整實現代碼邏輯,筆者將在正文進行詳細介紹。廢話不多說,跟著筆者直接往下…

Python:如何在Pycharm中顯示geemap地圖?

01 說明 或許在舊版本的python和jupyter中并不能成功. 作為參考&#xff0c;這里給出實驗成功的版本&#xff1a;名稱版本通道geemap0.36.1conda-forgejupyter1.1.1conda-forgepycharm2024.1.4 (Professional Edition)nullpython3.11.13conda-forge此外&#xff0c;由于顯示底圖…

力扣3:無重復字符的最長子串

力扣3:無重復字符的最長子串題目思路代碼題目 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長 子串 的長度。 思路 這道題的思路其實是很簡單的&#xff0c;最后我們需要得到子串的長度所以我們可以定義兩個變量即子串的左邊界和右邊界這樣有了左右邊界就…

Git登錄配置的詳細方法

Git登錄綁定主要涉及配置用戶信息和設置身份驗證。以下是詳細的配置方法&#xff1a; 1. 配置基本用戶信息 # 全局配置用戶名和郵箱 git config --global user.name "你的用戶名" git config --global user.email "你的郵箱example.com"# 或者為單個倉庫配…

測試工程師的AI轉型指南:從工具使用到測試策略重構

測試工程師的AI轉型指南&#xff1a;從工具使用到測試策略重構 測試工程師正站在職業轉型的十字路口。當GitHub Copilot能自動生成測試用例&#xff0c;AI性能工具能預測系統瓶頸&#xff0c;傳統“手動執行用例、人工分析結果”的工作模式正被顛覆。某互聯網公司測試團隊的調研…