欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Docker build創(chuàng)建鏡像命令示例實踐

 更新時間:2025年08月18日 11:18:23   作者:掘鐵  
本文講解Dockerfile的核心概念、基礎指令、構建流程及優(yōu)化技巧,涵蓋鏡像層結構、構建上下文、常用命令參數,強調多階段構建、輕量鏡像等最佳實踐,感興趣的朋友跟隨小編一起看看吧

一、核心概念

  • Dockerfile
    • 定義鏡像構建步驟的文本文件,包含一系列指令和配置,用于自動化創(chuàng)建鏡像。
  • 鏡像層(Layer)
    • Docker 鏡像由多層只讀層疊加而成,每個指令(如 RUN、COPY)會生成一個新的層。層可緩存,加速重復構建。
  • 構建上下文(Build Context)
    • 發(fā)送給 Docker 守護進程的文件集合,用于構建鏡像。默認是 Dockerfile 所在目錄。

二、Dockerfile 基礎指令

1. FROM

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

2. RUN

  • 用途:執(zhí)行 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

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

6. CMD

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

7. ENTRYPOINT

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

8. EXPOSE

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

9. ENV

  • 用途:設置環(huán)境變量。
  • 示例
    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:禁用緩存,強制重新執(zhí)行所有步驟。
  • --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:創(chuàng)建項目結構

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

五、最佳實踐

減少鏡像層數
合并相關指令(如 RUN apt-get update && apt-get install -y ...),避免生成過多無用層。

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

.git
node_modules
*.log

多階段構建(Multi-Stage Builds)
分離構建環(huán)境和運行環(huán)境,減小最終鏡像體積。

# 階段 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"]

使用輕量級基礎鏡像
優(yōu)先選擇 Alpine Linux 或 distroless 鏡像,減少鏡像體積和安全風險。

FROM node:18-alpine  # 體積約 100MB,遠小于默認的 Ubuntu 鏡像

避免以 root 用戶運行
創(chuàng)建非 root 用戶,提升容器安全性。

RUN adduser -D app_user
USER app_user

六、調試與優(yōu)化

查看構建日志

docker build --progress=plain -t my_app:debug .  # 顯示詳細日志

跳過緩存

docker build --no-cache -t my_app:nocache .

分析鏡像層

docker history my_app:latest  # 查看各層大小和命令

掃描鏡像漏洞
使用 docker scan 或第三方工具(如 Trivy)檢查安全風險。

docker scan my_app:latest

七、常見問題

  • 構建失敗:文件未找到
    • 原因:COPYADD 指令路徑錯誤。
    • 解決:檢查文件是否在構建上下文中,使用絕對路徑或正確相對路徑。
  • 權限拒絕(Permission Denied)
    • 原因:容器內進程以非 root 用戶運行,但文件權限不足。
    • 解決:在 Dockerfile 中使用 RUN chown 修改文件所有者。
  • 緩存未生效
    • 原因:構建上下文文件變更導致緩存失效。
    • 解決:盡量保持靜態(tài)文件(如依賴包)不變,或合理拆分指令。
  • 端口無法訪問
    • 原因:未通過 -p 映射端口。
    • 解決:運行容器時添加 -p 主機端口:容器端口,如 docker run -p 8080:80 nginx。

八、總結

  • Dockerfile 是鏡像構建的核心,需合理設計指令順序和層結構。
  • docker build 命令通過參數控制鏡像名稱、上下文和緩存策略。
  • 遵循最佳實踐(如多階段構建、輕量級鏡像)可顯著優(yōu)化構建效率和安全性。

到此這篇關于Docker build創(chuàng)建鏡像命令示例實踐的文章就介紹到這了,更多相關Docker build創(chuàng)建鏡像內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • docker實現MySQL的主從復制

    docker實現MySQL的主從復制

    在學習項目的時候實現讀寫分離用到了主從復制,但是一般要實現的話需要虛擬機或服務器非常麻煩,但是docker可以完美解決這一問題,本文主要介紹了docker實現MySQL的主從復制,感興趣的可以了解一下
    2024-01-01
  • 如何優(yōu)化Docker鏡像的大小詳解

    如何優(yōu)化Docker鏡像的大小詳解

    本文詳細介紹了Docker的定義和優(yōu)點,以及如何通過優(yōu)化Docker鏡像來提高其輕量化和便攜性,通過使用輕量化基礎鏡像和多階段構建,可以顯著減小Docker鏡像的大小,從而提高部署和運行效率
    2025-03-03
  • Docker更換存儲位置的實現

    Docker更換存儲位置的實現

    本文主要介紹了Docker更換存儲位置的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-05-05
  • 在docker創(chuàng)建的mysql容器中如何執(zhí)行mysql腳本

    在docker創(chuàng)建的mysql容器中如何執(zhí)行mysql腳本

    在Docker容器中執(zhí)行MySQL腳本的步驟包括進入容器、連接MySQL服務并執(zhí)行腳本,如果腳本在主機上,可以直接通過命令執(zhí)行,無需進入容器
    2024-11-11
  • Docker數據卷掛載方式

    Docker數據卷掛載方式

    文章介紹了Docker數據卷的作用和使用方法,包括數據卷的創(chuàng)建、查看、刪除以及掛載,數據卷的主要優(yōu)點是將數據與容器分離,解耦合,便于操作容器內的數據,保證數據安全,通過掛載數據卷,可以在宿主機上修改容器中的數據,并且可以方便地進行數據的復用和升級維護
    2024-12-12
  • Docker-compose的安裝和設定詳細步驟

    Docker-compose的安裝和設定詳細步驟

    這篇文章主要介紹了Docker-compose的安裝和設定的相關資料,需要的朋友可以參考下
    2017-03-03
  • Docker Desktop使用教程(圖文教程)

    Docker Desktop使用教程(圖文教程)

    本文主要介紹了Docker Desktop使用教程,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • Docker鏡像發(fā)布到Docker?Hub的實現方法

    Docker鏡像發(fā)布到Docker?Hub的實現方法

    本文主要介紹了Docker鏡像發(fā)布到Docker?Hub的實現方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 如何使用docker極簡打包java.jar鏡像并啟動

    如何使用docker極簡打包java.jar鏡像并啟動

    這篇文章主要介紹了如何使用docker極簡打包java.jar鏡像并啟動,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 使用Docker打包和運行Java鏡像的完整指南

    使用Docker打包和運行Java鏡像的完整指南

    在這篇文章中,我們將詳細講解如何使用Docker打包和運行一個Java應用鏡像,通過此教程,即使你是一個小白,也能輕松學會如何構建Docker鏡像并運行Java應用,感興趣的小伙伴跟著小編一起來看看吧
    2025-01-01

最新評論