【Docker】Dockerfile 編寫實踐

👻創作者:丶重明
👻創作時間:2025年4月8日
👻擅長領域:運維

目錄

  • 1. Dockerfile編寫原則
    • 1.1.選擇合適的基礎鏡像
    • 1.2.鏡像層優化
    • 1.3.多階段構建
    • 1.4.安全增強
  • 2. 關鍵指令與技巧
    • 2.1.COPY vs ADD
    • 2.2.ENTRYPOINT vs CMD
    • 2.3.健康檢查
    • 2.4.環境變量管理
  • 3. 實戰:構建Prometheus鏡像
  • 4. 附頁:Dockerfile指令

1. Dockerfile編寫原則

1.1.選擇合適的基礎鏡像

基礎鏡像的選擇直接影響鏡像的安全性、體積和可維護性。可以從這三個方面考慮:

  • 最小化原則:優先使用輕量級鏡像
  • 安全掃描:定期檢查基礎鏡像漏洞(使用 docker scan)
  • 固定版本:避免使用latest標簽,明確指定版本號

示例:

# 推薦,這個鏡像很小,僅有8MB左右
alpine:3.21.3# 不推薦,基礎鏡像過大,版本號不明確
ubuntu:latest

1.2.鏡像層優化

Docker 鏡像由只讀層(Layer)堆疊而成,每一層對應 Dockerfile 中的一條指令。優化層的核心邏輯是減少層數和層體積。

  • 合并指令:通過&& \合并多個RUN命令
  • 清理緩存:在同一個RUN層中刪除臨時文件
  • 層順序:將高頻變化的層(如代碼)放在最后

示例:

# 通過&& \這種方式將多個命令合并為一層
RUN apk add --no-cache curl tar && \curl -LO https://example.com/pkg.tar.gz && \tar -xzf pkg.tar.gz && \rm pkg.tar.gz

1.3.多階段構建

多階段構建(Multi-stage Build)是減少生產鏡像體積的殺手锏。其核心思想是:用“胖”鏡像構建,用“瘦”鏡像運行。

  • 分離構建環境與運行時環境
  • 減少最終鏡像體積

1.4.安全增強

容器安全是生產環境的核心要求。以下是三個關鍵實踐:

  • 非root用戶運行
  • 限制文件系統寫入權限
  • 使用 .dockerignore 排除敏感文件

示例:

RUN addgroup -S appgroup && \adduser -S appuser -G appgroup
USER appuser

2. 關鍵指令與技巧

2.1.COPY vs ADD

  • 優先使用COPY:僅用于復制本地文件
  • 謹慎使用ADD:自動解壓壓縮包,可能引入意外行為

2.2.ENTRYPOINT vs CMD

  • ENTRYPOINT:定義容器主進程
  • CMD:提供默認參數

示例:

ENTRYPOINT ["/bin/prometheus"]
CMD ["--config.file=/etc/prometheus/prometheus.yml"]

2.3.健康檢查

HEALTHCHECK --interval=30s --timeout=3s \CMD curl -f http://localhost:9090/-/healthy || exit 1

這一層命令的含義是:

  • HEALTHCHECK:為容器設定健康檢查機制
  • --interval=30s:健康檢查的時間間隔
  • --timeout=3s:健康檢查命令的超時時間
  • CMD ...:具體的健康檢查命令

每隔 30 秒就向http://localhost:9090/-/healthy發送一個 HTTP 請求,并且要求在 3 秒內完成。

若請求成功(狀態碼為 200 - 399),則判定容器健康;若請求失敗或者超時,就判定容器不健康。

2.4.環境變量管理

  • 使用 ENV 定義常量
  • 敏感數據通過 --env-file 或 Secrets 傳遞

3. 實戰:構建Prometheus鏡像

dockerfile目錄結構:直接在外部目錄解壓

# tree /prom_docker/
/prom_docker/
├── dockerfile
└── prometheus├── LICENSE├── NOTICE├── prometheus├── prometheus.yml└── promtool1 directory, 6 files

完整的Dockerfile文件:

FROM alpine:3.21.3# 創建非特權用戶
RUN addgroup -S prometheus && \adduser -S -D -H -s /bin/false -G prometheus prometheus && \mkdir -p /etc/prometheus /prometheus && \chown -R prometheus:prometheus /etc/prometheus /prometheus# 復制必要文件
COPY prometheus/LICENSE prometheus/NOTICE .
COPY prometheus/prometheus \prometheus/promtool \/usr/local/bin/
COPY prometheus/prometheus.yml \/etc/prometheus/# 設置運行時參數
USER prometheus
WORKDIR /prometheus
EXPOSE 9090
VOLUME ["/prometheus"]# 健康檢查(使用 promtool 無依賴)
HEALTHCHECK --interval=30s --timeout=10s \CMD ["/usr/local/bin/promtool", "check", "healthy", "--prometheus-url=http://localhost:9090"]# 入口指令
ENTRYPOINT ["/usr/local/bin/prometheus"]
CMD [ \"--config.file=/etc/prometheus/prometheus.yml", \"--storage.tsdb.path=/prometheus", \"--web.enable-lifecycle", \"--web.external-url=/" \
]

構建鏡像:

[root@localhost prom_docker]# docker build -t prometheus:v3.2.1 .

運行測試:

# docker run -d -p 9090:9090 --name prometheus-1 2c7c81224aa2
b91210a45af9f60c93c7e6652480da8d98a9077818cd2e75c769e3670ec1429d

在這里插入圖片描述

4. 附頁:Dockerfile指令

以下是 Dockerfile 中常見指令及其功能、語法和示例的表格:

指令功能語法示例
FROM指定基礎鏡像,是 Dockerfile 的起始指令FROM <image>[:<tag>][@<digest>]FROM python:3.9
RUN在新的鏡像層中執行命令,常用于安裝軟件包等操作RUN <command>(shell 形式)
RUN ["executable", "param1", "param2"](exec 形式)
RUN apt-get update && apt-get install -y python3
RUN ["pip", "install", "flask"]
CMD為容器提供默認的執行命令,一個 Dockerfile 中只能有一個 CMD,若有多個則只有最后一個生效CMD ["executable","param1","param2"](exec 形式)
CMD command param1 param2(shell 形式)
CMD ["param1","param2"](為 ENTRYPOINT 提供默認參數)
CMD ["python", "app.py"]
CMD python app.py
LABEL為鏡像添加元數據,如作者、版本等信息LABEL <key>=<value> <key>=<value> ...LABEL maintainer="example@example.com" version="1.0"
EXPOSE聲明容器運行時監聽的網絡端口,但不進行端口映射EXPOSE <port> [<port>/<protocol> ...]EXPOSE 8080
EXPOSE 80/tcp 443/tcp
ENV設置環境變量,在容器運行時可使用ENV <key>=<value> ...ENV APP_NAME=myapp
ENV DB_HOST=localhost DB_PORT=5432
ADD將文件、目錄或遠程文件復制到鏡像中,若復制的是壓縮文件會自動解壓ADD <src>... <dest>ADD app.tar.gz /app
ADD http://example.com/file.txt /tmp/
COPY將文件或目錄從構建上下文復制到鏡像中,不具備自動解壓和遠程文件處理功能COPY <src>... <dest>COPY requirements.txt /app/
ENTRYPOINT配置容器啟動時執行的命令,可與 CMD 結合使用ENTRYPOINT ["executable", "param1", "param2"](exec 形式)
ENTRYPOINT command param1 param2(shell 形式)
ENTRYPOINT ["python", "app.py"]
VOLUME創建掛載點,用于將主機目錄或數據卷掛載到容器中VOLUME ["/data"]VOLUME ["/var/lib/mysql"]
USER指定后續 RUNCMDENTRYPOINT 指令執行時的用戶和用戶組USER <user>[:<group>]USER myuser
WORKDIR設置工作目錄,后續的 RUNCMDENTRYPOINTCOPYADD 指令都會在該目錄下執行WORKDIR /path/to/workdirWORKDIR /app
ARG定義構建時的變量,在構建鏡像時可通過 --build-arg 傳遞值ARG <name>[=<default value>]ARG VERSION=1.0
docker build --build-arg VERSION=2.0 .
ONBUILD定義一個觸發器,當該鏡像被用作其他鏡像的基礎鏡像時,這些指令會在后續的 FROM 指令之后執行ONBUILD <INSTRUCTION>ONBUILD COPY . /app
STOPSIGNAL設置停止容器時發送的系統調用信號STOPSIGNAL signalSTOPSIGNAL SIGTERM
HEALTHCHECK配置容器的健康檢查命令HEALTHCHECK [OPTIONS] CMD <command>
HEALTHCHECK NONE
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1
SHELL覆蓋默認的 shell 命令,用于 RUNCMDENTRYPOINT 指令的 shell 形式SHELL ["executable", "parameters"]SHELL ["/bin/bash", "-c"]

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

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

相關文章

【數學建模】(智能優化算法)螢火蟲算法(Firefly Algorithm)詳解與實現

螢火蟲算法(Firefly Algorithm)詳解與實現 文章目錄 螢火蟲算法(Firefly Algorithm)詳解與實現前言1. 算法原理2. 算法流程3. Python實現4. 算法特點4.1 優點4.2 缺點 5. 應用領域6. 算法變種7. 總結與展望參考文獻 前言 大家好&#xff0c;今天給大家介紹一種有趣且高效的群體…

VSCode會擊敗Cursor和Windsurf嗎?

VSCode 會擊敗 Cursor 和 Windsurf 嗎&#xff1f;微軟能不能靠自己的地盤優勢和規則限制打壓對手&#xff1f;答案是"能"&#xff0c;但他們真的會這么干嗎&#xff1f; Cursor & Windsurf vs VSCode Copilot 大PKAI編程工具大戰越來越激烈現在最火最賺錢的AI…

2025-4-11 情緒周期視角復盤(mini)

簡單說兩句好了&#xff0c;做一個階段記錄&#xff0c;目前階段就是上一輪 中毅達 第二輪補漲的退潮結束&#xff0c;回盛生物 金河生物 它們的題材導致 農業和醫藥這2個題材退潮&#xff0c;注意的是不靠譜導致的反制題材是在這個二輪補漲周期里一起走的&#xff0c;所以 海…

【SLAM】將realsense-viewer錄制的rosbag視頻導出成圖片序列(RealSense D435)

本文介紹了如何將realsense-viewer錄制的rosbag格式的視頻導出成圖片序列&#xff0c;方便合并成mp4視頻或插入到論文中。 本文首發于?慕雪的寒舍 說明 Intel提供的realsense-viewer軟件錄制的視頻都是rosbag格式的&#xff0c;為了編寫論文&#xff0c;需要從錄制的視頻中截…

Ubuntu ROS 對應版本

Ubuntu 18.04 (Bionic Beaver) - 2018年4月發布 對應的ROS版本&#xff1a;ROS Melodic (2018年5月發布) Ubuntu 20.04 (Focal Fossa) - 2020年4月發布 對應的ROS版本&#xff1a;ROS Noetic (2020年5月發布) Ubuntu 22.04 (Jammy Jellyfish) - 預計2022年4月發布 對應的ROS版…

Ubuntu 軟件卸載與清理終極指南

Ubuntu 軟件卸載與清理指南 適用范圍&#xff1a;Ubuntu 及其衍生發行版&#xff08;如 Linux Mint、Pop!_OS 等&#xff09;&#xff0c;Debian 系統大部分方法也適用。 目標&#xff1a;幫助你快速、徹底卸載軟件并清理殘余文件&#xff0c;保持系統整潔。 前提&#xff1a;建…

基于javaweb的SpringBoot新聞視頻發布推薦評論系統(源碼+部署文檔)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

Linux-內核驅動

open uboot.bin target-connect U-Boot&#xff08;Universal Boot Loader&#xff09;是一種廣泛使用的開源引導加載程序&#xff0c;它允許用戶從各種設備&#xff08;如硬盤、USB設備、網絡等&#xff09;加載操作系統。U-Boot提供了豐富的命令行接口&#xff08;CLI&#…

DAPP實戰篇:使用ethers.js連接以太坊智能合約

專欄:區塊鏈入門到放棄查看目錄-CSDN博客文章瀏覽閱讀344次。為了方便查看將本專欄的所有內容列出目錄,按照順序查看即可。后續也會在此規劃一下后續內容,因此如果遇到不能點擊的,代表還沒有更新。聲明:文中所出觀點大多數源于筆者多年開發經驗所總結,如果你想要知道區塊…

[原創](現代Delphi 12指南): 設置、運行和調試你的第一個macOS應用程序.

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、C …

Adobe Photoshop 2025 Mac中文 Ps圖像編輯

Adobe Photoshop 2025 Mac中文 Ps圖像編輯 一、介紹 Adobe Photoshop 2025 Mac版集成了多種強大的圖像編輯、處理和創作功能。①強化了Adobe Sensei AI的應用&#xff0c;通過智能摳圖、自動修復、圖像生成等功能&#xff0c;用戶能夠快速而精確地編輯圖像。②3D編輯和動畫功…

藍橋杯備賽知識點總結

一、數論 如果想要計算整除向上取整&#xff08;xy-1&#xff09;/y 或者&#xff08;x-1&#xff09;/y 1 最大公約數&#xff1a; int gcd(int a,int b){return b0?a:gcd(b,a%b); }最小公倍數&#xff1a; int lcm(int a,int b){return a/gcd(a,b)*b; } 埃氏篩法&#…

設計模式 --- 狀態模式

狀態模式??是一種??行為型設計模式??&#xff0c;允許對象在內部狀態改變時動態改變其行為??&#xff0c;使對象的行為看起來像是改變了。該模式通過將狀態邏輯拆分為獨立類??&#xff0c;消除復雜的條件分支語句&#xff0c;提升代碼的可維護性和擴展性。 狀態模式的…

【讀者求助】如何跨行業進入招聘崗位?

文章目錄 讀者留言回信崗位細分1. 中介公司的招聘崗位2. 獵頭專員3. 公司的招聘專員選擇建議 面試建議1. 請簡單介紹你過去 3 年的招聘工作經歷&#xff0c;重點說下你負責的崗位類型和規模2. 你在招聘流程中最常用的渠道有哪些&#xff1f;如何評估渠道效果&#xff1f;3. 當你…

AI Agent入門指南

圖片來源網絡 ?一、開箱暴擊&#xff1a;你以為的"智障音箱"&#xff0c;其實是賽博世界的007? ?1.1 從人工智障到智能叛逃&#xff1a;Agent進化史堪比《甄嬛傳》? ?青銅時代&#xff08;2006-2015&#xff09;? “小娜同學&#xff0c;關燈” “抱歉&…

pnpm 中 Next.js 模塊無法找到問題解決

問題概述 項目在使用 pnpm 管理依賴時,出現了 “Cannot find module ‘next/link’ or its corresponding type declarations” 的錯誤。這是因為 pnpm 的軟鏈接機制在某些情況下可能導致模塊路徑解析問題。 問題診斷 通過命令 pnpm list next 確認項目已安裝 Next.js 15.2.…

vulnhub:sunset decoy

靶機下載地址https://www.vulnhub.com/entry/sunset-decoy,505/ 滲透過程 簡單信息收集 nmap 192.168.56.0/24 -Pn # 確定靶機ip&#xff1a;192.168.56.121 nmap 192.168.56.121 -A -T4 # 得到開放端口22,80 在80端口得到save.zip&#xff0c;需要密碼解壓。 john破解壓縮…

代碼學習總結(一)

代碼學習總結&#xff08;一&#xff09; 這個系列的博客是記錄下自己學習代碼的歷程&#xff0c;有來自平臺上的&#xff0c;有來自筆試題回憶的&#xff0c;主要基于 C 語言&#xff0c;包括題目內容&#xff0c;代碼實現&#xff0c;思路&#xff0c;并會注明題目難度&…

OSPF的接口網絡類型【復習篇】

OSPF在不同網絡環境下默認的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的網絡類型網絡類型OSPF接口的網絡類型&#xff08;工作方式&#xff09;計時器BMA&#xff08;以太網&#xff09;broadcast &#xff0c;需要DR/BDR的選舉hello&#xff1a;10s…

PHM學習軟件|PHM預測性維護系統

使用步驟教程如下 1、登錄 用戶名&#xff1a;52phm 密碼&#xff1a;xxx &#xff08;區別在于不同用戶密鑰不一樣&#xff09; 2、上傳需要分析的數據集 支持數據集格式&#xff1a;csv、xlsx、xls、mat、json 3、主題1&#xff1a;機械參數計算 計算軸承、齒輪、皮帶的…