Dockerfile 鏡像構建

目錄

簡介

一、Docker鏡像概念與結構

1.1 鏡像的分層存儲機制

1.2 鏡像分層的關鍵特性

二、Dockerfile語法

2.1 基礎構建指令

2.2 環境配置指令

2.3 文件操作指令

2.4 運行時指令

2.5 網絡與數據管理

三、實戰案例

3.1 構建Nginx Web服務器

3.2 構建Tomcat應用服務器

3.3 構建MySQL數據庫

四、Dockerfile實踐優化技巧

4.1 指令書寫規范

4.2 鏡像構建優化

4.3 安全最佳實踐

4.4 高級構建技巧

五、總結


簡介

Docker作為容器化技術的核心,其鏡像構建能力是實現應用快速部署的關鍵。本文將圍繞Dockerfile這一鏡像構建腳本,深入解析Docker鏡像的底層原理,并通過實戰案例演示如何構建高效、可靠的Docker鏡像。

一、Docker鏡像概念與結構

Docker鏡像不僅是應用發布的標準格式,更是容器運行的基礎。理解鏡像的結構和工作機制,是掌握Dockerfile的前提。

1.1 鏡像的分層存儲機制

Docker鏡像采用分層結構設計,每個鏡像由多個只讀層疊加而成。這種設計帶來了顯著的優勢:

  • 緩存復用:未修改的層會被緩存,加速后續構建
  • 增量更新:只需更新變化的層,減少鏡像體積
  • 版本控制:每層對應一次構建操作,便于追溯

通過??docker history??命令可以查看鏡像的分層結構:

# 查看鏡像分層及大小
docker history nginx:latest

鏡像默認存儲在??/var/lib/docker/<storage-driver>??目錄,容器運行時會在鏡像頂部添加一個可讀寫層,所有運行時修改都存儲在此層。這解釋了為何容器刪除后數據會丟失——因為可讀寫層隨之刪除。

1.2 鏡像分層的關鍵特性
  • 每層對應一條Dockerfile指令:每條指令生成一個新層
  • 緩存失效機制:當指令內容或依賴文件變化時,對應層及后續層緩存失效
  • 不可變性:層一旦生成不可修改,后續層的刪除操作只是隱藏文件而非真正移除

二、Dockerfile語法

Dockerfile是定義鏡像構建過程的腳本文件,通過一系列指令告訴Docker如何構建鏡像。下面詳解核心指令及使用場景。

2.1 基礎構建指令

FROM:指定基礎鏡像

# 基于Ubuntu 20.04構建新鏡像
FROM ubuntu:20.04
  • 所有Dockerfile必須以FROM開頭
  • 基礎鏡像可以是官方鏡像或自定義鏡像
  • 推薦使用??alpine??等輕量級鏡像以減小體積

LABEL:添加鏡像元數據

# 添加作者、版本、描述等信息
LABEL maintainer="John Doe <johndoe@example.com>" \version="1.0" \description="This is a sample image"
  • 替代已棄用的MAINTAINER指令
  • 元數據便于鏡像管理和識別
2.2 環境配置指令

ENV:設置環境變量

# 設置MySQL root密碼環境變量
ENV MYSQL_ROOT_PASSWORD=password
  • 環境變量在容器運行時持續存在
  • 可被容器內應用程序直接使用

ARG:定義構建參數

# 定義版本參數,默認值1.0
ARG VERSION=1.0
  • 僅在鏡像構建過程中有效
  • 可通過??docker build --build-arg VERSION=2.0??傳遞參數
2.3 文件操作指令

COPY:復制本地文件

# 將本地app.py復制到鏡像/app目錄
COPY app.py /app/
  • 簡單高效的文件復制方式
  • 推薦優先使用COPY而非ADD

ADD:增強型復制

# 下載并解壓遠程壓縮包
ADD http://example.com/file.tar.gz /app/
  • 支持遠程URL下載和自動解壓
  • 功能復雜可能帶來安全風險,謹慎使用

WORKDIR:設置工作目錄

# 設置后續指令的工作目錄為/app
WORKDIR /app
  • 避免使用絕對路徑硬編碼
  • 支持多次切換工作目錄
2.4 運行時指令

RUN:構建時執行命令

# 更新軟件源并安裝Python3
RUN apt-get update && apt-get install -y python3
  • 用于安裝軟件、配置環境等操作
  • 建議合并多條命令減少層數:??RUN command1 && command2??

CMD:容器默認命令

# 容器啟動時默認執行python3 app.py
CMD ["python3", "app.py"]
  • 一個Dockerfile只能有一個CMD
  • 可被??docker run??命令后的參數覆蓋

ENTRYPOINT:容器入口點

# 配置容器入口點為python3,默認參數app.py
ENTRYPOINT ["python3"]
CMD ["app.py"]
  • 入口點命令不會被覆蓋
  • ??docker run <image> test.py???會執行??python3 test.py??
2.5 網絡與數據管理

EXPOSE:聲明監聽端口

# 聲明容器監聽8080端口
EXPOSE 8080
  • 僅作聲明,需配合??docker run -p??實現端口映射
  • 明確告知使用者容器需要的網絡資源

VOLUME:創建數據卷

# 創建/app/data數據卷掛載點
VOLUME ["/app/data"]
  • 實現數據持久化和容器間數據共享
  • 推薦用于日志、配置文件等需要持久化的目錄

三、實戰案例

3.1 構建Nginx Web服務器

準備工作

# 拉取CentOS 7基礎鏡像
docker pull centos:7# 創建工作目錄
mkdir -p /opt/nginx
cd /opt/nginx

Dockerfile內容

FROM centos:7
# 刪除默認源文件
RUN rm -rf /etc/yum.repos.d/*
# 配置阿里云鏡像源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 清理緩存
RUN yum clean all
# 安裝編譯依賴
RUN yum -y install pcre-devel zlib-devel zlib gcc* make openssl-devel
# 復制Nginx源碼
ADD nginx-1.19.5.tar.gz /opt
# 切換工作目錄
WORKDIR /opt/nginx-1.19.5
# 編譯安裝Nginx
RUN ./configure --prefix=/usr/local/nginx && make && make install
# 復制配置文件
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
# 聲明服務端口
EXPOSE 80
EXPOSE 443
# 復制啟動腳本并賦予權限
ADD run.sh /run.sh
RUN chmod 775 /run.sh
# 設置容器啟動命令
CMD ["/run.sh"]

啟動腳本run.sh

#!/bin/bash
# 啟動Nginx服務
/usr/local/nginx/sbin/nginx

構建與運行

# 構建鏡像,-t指定鏡像名稱
docker build -t mynginx .# 啟動容器,-p映射端口,-d后臺運行
docker run -d -p 8080:80 --name nginx01 mynginx# 帶數據卷掛載的啟動方式
docker run -d -p 8081:80 --name nginx02 \
-v /www/html:/web \
mynginx /bin/bash -c "/run.sh"
3.2 構建Tomcat應用服務器

Dockerfile核心部分

FROM centos:7
# 安裝JDK
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
# 配置Java環境變量
ENV JAVA_HOME /usr/local/jdk1.8.0_91
ENV PATH $PATH:/usr/local/jdk1.8.0_91/bin
# 安裝Tomcat
ADD apache-tomcat-8.5.16.tar.gz /
RUN mv /apache-tomcat-8.5.16 /usr/local/tomcat
# 聲明端口
EXPOSE 8080
# 啟動腳本
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]

啟動腳本關鍵邏輯

#!/bin/bash
# 啟動Tomcat
/usr/local/tomcat/bin/startup.sh
# 保持容器運行
tail -f /dev/null
3.3 構建MySQL數據庫

初始化腳本安全設置

#!/bin/bash
# 初始化MySQL
mysql_install_db --user=mysql
# 啟動服務
mysqld_safe &
sleep 3
# 設置root密碼
mysqladmin -u"root" password "123456"
# 授權遠程訪問
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';"
# 刷新權限
mysql -uroot -p123456 -e "FLUSH PRIVILEGES;"

安全建議

  • 避免在Dockerfile中硬編碼密碼
  • 使用??docker run -e MYSQL_ROOT_PASSWORD=xxx??傳遞密碼
  • 生產環境建議限制root用戶遠程訪問

四、Dockerfile實踐優化技巧

4.1 指令書寫規范
  • 大小寫約定:指令使用大寫(FROM/RUN/CMD),增強可讀性
  • 順序優化:將不變的指令(如FROM、LABEL)放在前面,充分利用緩存
  • 注釋原則:使用??#??添加注釋,解釋關鍵步驟的目的
4.2 鏡像構建優化
  • 減少層數:合并相關命令,例如:
RUN apt-get update && apt-get install -y \package1 \package2 \&& rm -rf /var/lib/apt/lists/*
  • 清理臨時文件:安裝完成后刪除緩存和臨時文件,減小鏡像體積
  • 利用緩存:將不常變更的操作(如安裝依賴)放在前面,頻繁變更的放在后面
4.3 安全最佳實踐
  • 使用非root用戶:通過??RUN useradd appuser && chown appuser /app??設置非root用戶
  • 最小化權限:僅開放必要的端口,避免暴露敏感服務
  • 避免敏感信息:不在Dockerfile中存儲密碼、密鑰等敏感信息
4.4 高級構建技巧
  • 多階段構建:使用多個FROM指令,先構建編譯環境,再復制最終產物:
FROM builder AS build
# 編譯過程...FROM runtime
# 復制編譯結果...
  • 環境變量隔離:區分構建時參數(ARG)和運行時變量(ENV)
  • 緩存管理:使用??docker build --no-cache??強制重新構建

五、總結

通過掌握Dockerfile的核心語法和實踐技巧,我們能夠:

  1. 理解Docker鏡像的分層存儲與緩存機制
  2. 熟練使用各類指令構建自定義鏡像
  3. 通過實戰案例掌握常見服務的容器化部署
  4. 應用最佳實踐優化鏡像構建流程

進階學習方向建議:

  • 深入研究Docker存儲驅動(Overlay2、AUFS等)
  • 探索Docker Compose實現多容器協同部署
  • 學習Kubernetes容器編排,實現容器服務的規模化管理

Dockerfile作為容器化的核心技術,其靈活性和強大功能為應用部署帶來了前所未有的便利。不斷實踐和優化Dockerfile編寫,將有效提升應用交付效率和系統穩定性。

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

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

相關文章

Docker Desktop 4.42集成的MCP工具包

一、介紹 Docker Desktop 4.42 集成了 MCP&#xff08;Model?Client?Plugin&#xff09;Toolkit&#xff0c;無需額外安裝擴展即可直接使用。 MCP Toolkit 集成細節 內置于 Docker Desktop&#xff1a;你可以直接打開應用&#xff0c;在設置中啟用 MCP 服務器&#xff0c;比…

CUDA NCU Occupancy學習筆記

占用率是每個多處理器的活躍 Warp 數量與最大可能活躍 Warp 數量的比率。另一種查看占用率的方式是&#xff0c;硬件處理 Warp 的能力中&#xff0c;實際使用 Warp 的百分比。較高的占用率并不一定能帶來更高的性能&#xff0c;然而&#xff0c;較低的占用率總是會降低隱藏延遲…

配置自己的NTP 服務器做時間同步

? 推薦方案&#xff1a;使用 chrony 搭建 NTP 服務器&#xff08;適用于 CentOS 7/8/9&#xff09; chrony 是 CentOS 推薦的 NTP 實現&#xff0c;精度高、資源占用低、同步快&#xff0c;默認在 CentOS 8 中取代了 ntpd。 &#x1f527; 一、安裝 chrony sudo yum install…

【運維系列】Plane 開源項目安裝和配置指南

Plane是一個用現代前端技術棧&#xff08;Next.js TailwindCSS&#xff09;開發的開源項目管理平臺&#xff0c;核心理念是 Bring Structure to Chaos" —— 給混亂的項目管理帶來結構感。 1.項目地址 gitHub 2.項目使用的關鍵技術和框架 Plane 項目使用了多種關鍵技術…

3.讀取圖片和圖片采集

目錄 一、Halcon 1. 圖片的基本概念 2. 獲取圖片方式1-讀取本地圖片 3. 獲取圖片方式2-在線采集 4. C#獲取圖片數據架構 二、VS聯合編程 1. 讀取本地圖片 2.在線采集 一、Halcon 1. 圖片的基本概念 1. 圖片2. 像素 3. 分辨率4. 位深度5. 不同后綴1. png jpg 2. bmp 6…

前端流式接口/Socket.IO/WebSocket的區別和選用

WebSocket&#xff1a; 定義&#xff1a;WebSocket是一種在單個TCP連接上進行全雙工通信的協議&#xff0c;實現了客戶端與服務器之間的實時雙向通信。特點&#xff1a;基于HTTP協議&#xff0c;但通過握手升級為WebSocket協議&#xff0c;支持持久連接&#xff0c;減少延遲和帶…

QT 學習筆記摘要(二)

第一節 常用控件 1. QWidget 核心屬性 1.1 objectName 1.2 enabled API說明 isEnabled() 獲取到控件的可?狀態 setEnabled() 設置控件是否可使?. true 表?可?, false 表?禁? 1.3 geometry && window frame geometry: x y width height API 說明 geom…

FastAPI + Redis 高性能任務隊列實現:AI內容生成系統實踐

FastAPI Redis 高性能任務隊列實現&#xff1a;AI內容生成系統實踐 引言 在現代應用中&#xff0c;任務隊列是處理資源密集型操作的重要組件。本文將詳細介紹一個基于FastAPI和Redis實現的高性能任務隊列系統&#xff0c;該系統用于處理AI圖片和視頻的生成請求。我們將從架構…

光學跟蹤系統在汽車遠程設計驗證中的應用優勢

在汽車制造行業&#xff0c;傳統設計驗證流程依賴實體模型評審&#xff0c;存在周期長、成本高、跨地域協作困難等痛點。隨著光學跟蹤技術的突破&#xff0c;以ART、OptiTrack為代表的高精度光學追蹤系統正重塑汽車遠程設計驗證的范式。本文從技術原理、應用場景及產業價值三個…

windows 訪問ubuntu samba配置

1. 啟用文件共享和SMB 1.0/CIFS支持 首先&#xff0c;確保Windows啟用了文件共享和SMB 1.0/CIFS支持1。 步驟: 打開控制面板 -> 程序 -> 程序和功能 -> 啟用或關閉Windows功能。 勾選“SMB 1.0/CIFS 文件共享支持”。 2. 啟用不安全的來賓登錄 有時需要啟用不安…

Apache Doris 3.0.6 版本正式發布

親愛的社區小伙伴們&#xff0c;Apache Doris 3.0.6 版本已于 2025 年 06 月 16 日正式發布。 該版本進一步提升了系統的性能及穩定性&#xff0c;歡迎大家下載體驗。 GitHub 下載 官網下載 行為變更 禁止 Unique 表使用時序 Compaction存算分離場景下 Auto Bucket 單分桶容…

安全帽檢測數據集簡介(約2萬張圖片)

安全帽檢測數據集簡介&#xff08;約2萬張圖片&#xff09; &#x1f4e6; 已發布目標檢測數據集合集&#xff08;持續更新&#xff09;安全帽檢測數據集簡介&#xff08;約2萬張圖片&#xff09;&#x1f4c1; 數據集概況&#x1f5bc;? 數據樣本展示 YOLOv8 訓練實戰&#x…

RJ45 網口實現千兆傳輸速率(1Gbps)的原理,涉及物理層傳輸技術、線纜標準、信號調制及網絡協議等多方面的協同設計。以下從技術維度展開詳細解析:

一、千兆以太網的標準與物理層基礎 1. 標準規范 千兆以太網遵循 IEEE 802.3ab&#xff08;針對雙絞線&#xff09;和 IEEE 802.3z&#xff08;針對光纖&#xff09;標準&#xff0c;其中 RJ45 接口對應雙絞線場景&#xff0c;核心是通過四對雙絞線&#xff08;CAT5e/CAT6 線纜…

Node.js爬蟲 CheerioJS ?輕量級解析、操作和渲染HTML及XML文檔

簡介 ? CheerioJS ? 是一個專為 Node.js 設計的輕量級庫&#xff0c;用于解析、操作和渲染 HTML 及 XML 文檔&#xff0c;語法類似 Jquery。 安裝 npm install cheerio 示例 const cheerio require("cheerio");const html <html><head><tit…

華為運維工程師面試題(英語試題,內部資料)

華為運維工程師面試題(英語試題,內部資料) 一、英文自我介紹,重點突出自己運維經驗(10分) 二、短語翻譯(英譯中)(15*3分=45分) 1. Data is a collection of un-organized facts, which can include words, numb ers, images, and sounds. 1. 數據是未經組織的事…

【趙渝強老師】使用mydumper備份MySQL

MySQL在備份方面包含了自身的mysqldump工具&#xff0c;但其只支持單線程工作&#xff0c;這就使得它無法迅速的備份數據。而mydumper作為一個實用工具&#xff0c;能夠良好支持多線程工作&#xff0c;這使得它在處理速度方面十倍于傳統的mysqldump。其特征之一是在處理過程中需…

華為云 Flexus+DeepSeek 征文|華為云單機部署 Dify-LLM 開發平臺全流程指南【服務部署、模型配置、知識庫構建全流程】

華為云 FlexusDeepSeek 征文&#xff5c;華為云單機部署 Dify-LLM 開發平臺全流程指南【服務部署、模型配置、知識庫構建全流程】 文章目錄 華為云 FlexusDeepSeek 征文&#xff5c;華為云單機部署 Dify-LLM 開發平臺全流程指南【服務部署、模型配置、知識庫構建全流程】前言1、…

?通義萬相 2.1(Wan2.1)環境搭建指南:基于 CUDA 12.4 + Python 3.11 + PyTorch 2.5.1 GPU加速實戰

&#x1f680;【超詳細】基于 CUDA 12.4 Python 3.11 構建 Wan2.1 項目的集成推理環境&#xff08;含 PyTorch 2.5.1 GPU 安裝教程&#xff09; 本文將一步一步帶你搭建一個可用于構建和運行 Wan2.1 的深度學習環境&#xff0c;完全兼容 CUDA 12.4&#xff0c;并基于官方鏡像 …

PROFIBUS DP轉ETHERNET/IP在熱電項目中的創新應用

在熱電項目中&#xff0c;多種設備的高效協同是保障能源穩定供應的關鍵。PROFIBUS DP與ETHERNET/IP兩種工業通信協議因特性不同而應用場景各異。通過協議轉換技術實現JH-PB-EIP疆鴻智能PROFIBUS DP轉ETHERNET/IP&#xff0c;可整合西門子PLC與電力儀表、變頻器等設備&#xff0…

精準把脈 MySQL 性能!xk6-sql 并發測試深度指南

在數據庫性能測試領域&#xff0c;xk6-sql憑借其強大的功能和靈活性&#xff0c;成為眾多開發者和測試人員的得力工具。它能夠模擬高并發場景&#xff0c;精準測試數據庫在不同負載下的性能表現。然而&#xff0c;在一些網絡受限的環境中&#xff0c;實現xk6-sql的離線安裝以及…