Docker build創(chuàng)建鏡像命令示例實踐
一、核心概念
- Dockerfile
- 定義鏡像構建步驟的文本文件,包含一系列指令和配置,用于自動化創(chuàng)建鏡像。
- 鏡像層(Layer)
- Docker 鏡像由多層只讀層疊加而成,每個指令(如
RUN
、COPY
)會生成一個新的層。層可緩存,加速重復構建。
- Docker 鏡像由多層只讀層疊加而成,每個指令(如
- 構建上下文(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ù)指令(如
RUN
、COPY
)將在此目錄執(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
定義)。
示例:
- 構建并標記鏡像:
docker build -t my_app:v1 . # 當前目錄為構建上下文
- 指定 Dockerfile 路徑:
docker build -t my_app:v1 -f Dockerfile.prod .
- 傳遞構建參數:
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
七、常見問題
- 構建失敗:文件未找到
- 原因:
COPY
或ADD
指令路徑錯誤。 - 解決:檢查文件是否在構建上下文中,使用絕對路徑或正確相對路徑。
- 原因:
- 權限拒絕(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創(chuàng)建的mysql容器中如何執(zhí)行mysql腳本
在Docker容器中執(zhí)行MySQL腳本的步驟包括進入容器、連接MySQL服務并執(zhí)行腳本,如果腳本在主機上,可以直接通過命令執(zhí)行,無需進入容器2024-11-11Docker鏡像發(fā)布到Docker?Hub的實現方法
本文主要介紹了Docker鏡像發(fā)布到Docker?Hub的實現方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01