目錄
一:Docker 鏡像管理
1:Docker 鏡像結構
(1) 鏡像分層核心概念
(2)鏡像層特性
(3)關鍵操作命令
(4)優化建議
2:Dockerfile介紹
(1)Dockerfile 基礎特性
(2)Dockerfile 核心指令
(3)Dockerfile 構建與優化
(4)Dockerfile 最佳實踐
二:Dockerfile語法基礎
(1)基礎指令
(2)環境設置指令
(3)文件操作指令
(4)執行命令指令
(5)網絡與存儲指令
三:Dockerfile 系例實施
1:案例 1--構建 nginx 容器
(1)創建dockerfile 工作目錄
(2)創建dockerfile
(3)編寫Nginx啟動腳本
(4)用Dockerfile創建鏡像
(5)啟動容器
(6)訪問nginx網站
2:案例 2--構建 Tomcat 容器
(1)創建工作目錄
3:案例 3--構建 mysq1 容器
(1)創建工作目錄
(2)創建dockerfile 文件
?編輯
?編輯
(3)編寫mysql初始化腳本
?編輯
(4)生成鏡像
?編輯
(5)創建容器
4:案例 4--構建 php
(1)創建工作目錄
(2)創建dockerfile(yum 安裝安裝)
?編輯
(3)生成鏡像
?編輯
(4)啟動容器
四:Dockerfile 語法注意事項
一:Docker 鏡像管理
? ? ? ?Docker 鏡像除了是 Docker 的核心技術之外,也是應用發布的標準格式。一個完整的 Docker 鏡像可以支撐一個 Docker 容器的運行,在 Docker 的整個使用過程中,進入一個已經定型的容器之后,就可以在容器中進行操作,最常見的操作就是在容器中安裝應用服務。 如果要把已經安裝的服務進行遷移,就需要把環境以及搭建的服務生成新的鏡像。本案例將介紹如何創建 Docker 鏡像。
1:Docker 鏡像結構
(1) 鏡像分層核心概念
特性 | 說明 |
---|---|
分層結構 | 鏡像由多個只讀層(Layer)疊加組成,每層對應 Dockerfile 中的一條指令 |
容器讀寫層 | 容器運行時在鏡像頂部添加一個可讀寫層(容器層),所有修改均寫入此層 |
存儲位置 | 默認存儲在?/var/lib/docker/<storage-driver> (如?overlay2 ) |
存儲驅動 | 管理鏡像層和容器層的讀寫機制(如?overlay2 、aufs 、devicemapper ) |
(2)鏡像層特性
特性 | 說明 | 示例/影響 |
---|---|---|
指令對應分層 | Dockerfile 中每條指令(如?RUN 、COPY )生成一個獨立鏡像層 | RUN apt-get update ?會生成一個包含更新后文件系統的層 |
緩存復用 | 未更改的指令層可直接復用緩存,加速構建 | 修改?COPY ?的文件后,后續所有層緩存失效 |
不可變性 | 已構建的鏡像層不可修改,刪除文件僅在新層標記刪除,原層仍保留文件數據 | 即使后續層刪除文件,鏡像體積不會減小(需合并層優化) |
依賴鏈失效 | 某一層緩存失效后,其后續所有層緩存均需重新構建 | 調整 Dockerfile 指令順序可優化緩存利用率(如先復制靜態文件) |
(3)關鍵操作命令
命令 | 作用 | 示例 |
---|---|---|
docker history | 查看鏡像各層構成及大小 | docker history nginx:latest |
docker inspect | 查看鏡像詳細信息(包括分層哈希) | docker inspect nginx:latest |
docker diff | 查看容器層文件改動(對比鏡像層) | docker diff <容器ID> |
docker system df | 查看 Docker 磁盤使用情況(含鏡像、容器層體積) | docker system df -v |
(4)優化建議
策略 | 說明 | 示例 |
---|---|---|
合并指令 | 使用?&& ?合并多個?RUN ?指令減少層數 | RUN apt-get update && apt-get install -y curl |
合理排序指令 | 將高頻變動的指令(如?COPY )放在 Dockerfile 尾部 | 先安裝依賴,最后復制代碼 |
使用多階段構建 | 通過多階段構建(FROM ... AS builder )剔除中間層,減小最終鏡像體積 | 編譯階段與運行階段分離 |
清理無用文件 | 在同一層中刪除臨時文件避免殘留 | RUN apt-get install -y curl && rm -rf /var/lib/apt/lists/* |
2:Dockerfile介紹
(1)Dockerfile 基礎特性
特性 | 說明 |
---|---|
本質 | 由多條指令組成的腳本文件,用于自動化構建 Docker 鏡像 |
文件命名 | 默認文件名?Dockerfile (首字母大寫),或通過?-f ?指定自定義文件名 |
指令與命令 | 每條指令對應一個 Linux 命令(如?RUN 、COPY ) |
構建過程 | Docker 按順序解析指令并生成鏡像層,解決依賴關系 |
透明性 | 相比直接使用鏡像,Dockerfile 明確展示鏡像構建邏輯 |
(2)Dockerfile 核心指令
指令 | 作用 | 示例 |
---|---|---|
FROM | 指定基礎鏡像(必須為第一條指令) | FROM ubuntu:20.04 |
RUN | 執行命令并創建新鏡像層(常用于安裝軟件) | RUN apt-get update && apt-get install -y curl |
COPY | 復制宿主機文件到鏡像(需使用絕對路徑) | COPY ./app /usr/src/app |
ADD | 類似?COPY ,但支持自動解壓壓縮包和遠程 URL | ADD https://example.com/file.tar.gz /data |
WORKDIR | 設置工作目錄(后續指令的相對路徑基于此目錄) | WORKDIR /app |
EXPOSE | 聲明容器運行時監聽的端口(實際映射需通過?-p ?參數) | EXPOSE 8080 |
ENV | 設置環境變量(可被后續指令和容器進程使用) | ENV NODE_ENV=production |
CMD | 指定容器啟動時的默認命令(可被?docker run ?覆蓋) | CMD ["python", "app.py"] |
ENTRYPOINT | 類似?CMD ,但命令不可被?docker run ?覆蓋(通常與?CMD ?搭配使用) | ENTRYPOINT ["nginx"] ?+?CMD ["-g", "daemon off;"] |
VOLUME | 創建匿名數據卷掛載點(實際掛載需通過?-v ?參數) | VOLUME /data |
(3)Dockerfile 構建與優化
操作 | 命令 | 說明 |
---|---|---|
構建鏡像 | docker build -t myimage:tag . | 使用當前目錄下的?Dockerfile ?構建鏡像 |
指定構建文件 | docker build -f Dockerfile.dev -t myimage:dev . | 使用自定義文件名構建 |
多階段構建 | Dockerfile FROM builder AS build ... FROM alpine COPY --from=build ... | 減少最終鏡像體積(丟棄中間層) |
忽略文件 | 創建?.dockerignore ?文件排除無關文件 | 避免?COPY ?時復制?node_modules ?等大目錄 |
(4)Dockerfile 最佳實踐
實踐建議 | 說明 | 示例 |
---|---|---|
指令合并 | 合并多個?RUN ?指令減少鏡像層數 | RUN apt-get update && apt-get install -y curl |
最小化基礎鏡像 | 使用?alpine ?等輕量鏡像作為基礎 | FROM python:3.9-alpine |
清理緩存文件 | 同一層中刪除臨時文件以減小體積 | RUN apt-get install -y curl && rm -rf /var/lib/apt/lists/* |
明確版本標簽 | 避免使用?latest ?標簽,確保構建可復現 | FROM nginx:1.21.6 |
非 root 用戶運行 | 使用?USER ?指令降低權限 | USER 1000 |
總結:
-
Dockerfile 是聲明式的鏡像構建藍圖,通過指令逐層生成鏡像。
-
合理設計指令順序和內容可優化構建速度、鏡像安全性和可維護性。
-
結合多階段構建和?
.dockerignore
?可顯著減小鏡像體積。
二:Dockerfile語法基礎
? ? ? ??Dockerfile 是一個文本文件,其中包含了一系列用于構建 Docker 鏡像的指令。通過編寫
Dockerfile,可以自動化地創建自定義的 Docker 鏡像。以下為你詳細介紹 Dockerfile 的常用語法:
(1)基礎指令
指令 | 作用 | 語法示例 | 說明 |
---|---|---|---|
FROM | 指定基礎鏡像 | FROM ubuntu:20.04 | 必須為第一條指令,支持多階段構建(如?FROM ... AS builder ) |
LABEL | 添加元數據(替代已棄用的?MAINTAINER ) | LABEL maintainer="John" version="1.0" | 可定義多個鍵值對,用于鏡像分類和管理 |
(2)環境設置指令
指令 | 作用 | 語法示例 | 說明 |
---|---|---|---|
ENV | 設置持久化環境變量 | ENV MYSQL_ROOT_PASSWORD=123456 | 容器運行時仍有效,可被應用程序讀取 |
ARG | 定義構建時參數(僅在構建階段有效) | ARG VERSION=1.0 | 可通過?--build-arg ?覆蓋:docker build --build-arg VERSION=2.0 . |
(3)文件操作指令
指令 | 作用 | 語法示例 | 說明 |
---|---|---|---|
COPY | 復制本地文件到鏡像 | COPY ./src /app/src | 需使用絕對路徑,不支持自動解壓或遠程 URL |
ADD | 增強版?COPY ,支持遠程 URL 和自動解壓 | ADD http://example.com/file.tar.gz /data | 遠程文件需顯式指定權限(如?RUN chmod ) |
WORKDIR | 設置工作目錄 | WORKDIR /app | 后續指令(如?RUN 、COPY )均基于此目錄執行 |
(4)執行命令指令
指令 | 作用 | 語法示例 | 說明 |
---|---|---|---|
RUN | 在構建時執行命令 | RUN apt-get update && apt-get install -y curl | 推薦合并多條命令減少層數 |
CMD | 指定容器啟動時的默認命令 | CMD ["python", "app.py"] | 可被?docker run ?覆蓋,一個 Dockerfile 僅最后一個?CMD ?生效 |
ENTRYPOINT | 定義容器啟動時的主命令(不可被覆蓋) | ENTRYPOINT ["nginx"] | 常與?CMD ?搭配使用:ENTRYPOINT ["python"] ?+?CMD ["app.py"] |
(5)網絡與存儲指令
指令 | 作用 | 語法示例 | 說明 |
---|---|---|---|
EXPOSE | 聲明容器運行時監聽的端口 | EXPOSE 8080 | 實際映射需通過?docker run -p 8080:8080 ?實現 |
VOLUME | 創建匿名數據卷掛載點 | VOLUME ["/data"] | 實際掛載需通過?docker run -v /host/path:/data ?指定 |
關鍵對比
對比項 | COPY ?vs?ADD | CMD ?vs?ENTRYPOINT |
---|---|---|
核心差異 | ADD ?支持遠程 URL 和解壓,COPY ?更透明 | ENTRYPOINT ?不可覆蓋,CMD ?可覆蓋 |
使用建議 | 優先使用?COPY ,除非需要?ADD ?的特性 | 固定命令用?ENTRYPOINT ,參數用?CMD |
三:Dockerfile 系例實施
1:案例 1--構建 nginx 容器
(1)創建dockerfile 工作目錄
(2)創建dockerfile
(3)編寫Nginx啟動腳本
(4)用Dockerfile創建鏡像
(5)啟動容器
或者:
(6)訪問nginx網站
2:案例 2--構建 Tomcat 容器
(1)創建工作目錄
(2)創建dockerfile
(3)創建啟動腳本
(4)用Dockerfile創建鏡像
(5)啟動容器
(6)訪問tomcat網站
http://192.168.10.101:8081
3:案例 3--構建 mysq1 容器
(1)創建工作目錄
(2)創建dockerfile 文件
(3)編寫mysql初始化腳本
(4)生成鏡像
(5)創建容器
4:案例 4--構建 php
(1)創建工作目錄
(2)創建dockerfile(yum 安裝安裝)
(3)生成鏡像
(4)啟動容器
四:Dockerfile 語法注意事項
? ? ?在編寫 Dockerfile 時,掌握基礎語法的注意事項能夠幫助你構建出高效、可靠且易于維護的Docker 鏡像。以下是一些關鍵的注意事項:
類別 | 要點 | 詳細說明/示例 |
---|---|---|
指令規范 | 大小寫 | 建議使用大寫(如?FROM ,?RUN )增強可讀性 |
順序 | 將不常變動的指令(如基礎包安裝)放在前面,利用緩存;頻繁變動的指令(如源碼復制)放在后面 | |
注釋 | 使用?# ?解釋復雜步驟,如?# Install core dependencies | |
基礎鏡像 | 穩定性與安全性 | 優先選擇官方鏡像(如?ubuntu:22.04 ,?alpine:3.18 ) |
鏡像大小 | 輕量級場景用 Alpine(體積小),完整功能用 Debian/Ubuntu | |
文件操作 | COPY ?vs?ADD | 優先用?COPY (如?COPY app.py /app/ );僅需解壓或遠程下載時用?ADD (如?ADD https://example.com/file.tar.gz /tmp/ ) |
文件路徑 | 確保路徑在構建上下文中,如?docker build -t myapp . ?中的?. ?是上下文根目錄 | |
命令執行 | RUN ?優化 | 合并命令減少層數:RUN apt-get update && apt-get install -y python3 && rm -rf /var/lib/apt/lists/* |
清理緩存 | 刪除臨時文件:RUN yum clean all && rm -rf /tmp/* | |
CMD ?&?ENTRYPOINT | ENTRYPOINT ["python3"] ?+?CMD ["app.py"] :運行時可通過?docker run myapp --debug ?覆蓋?CMD | |
環境變量 | ENV ?vs?ARG | ENV ?持久化(如?ENV APP_PORT=8080 );ARG ?僅構建時有效(如?ARG VERSION=1.0 ,需?--build-arg ?傳遞) |
安全性 | 敏感信息通過運行時傳入:docker run -e DB_PASSWORD=123 myapp | |
網絡與端口 | EXPOSE | 聲明容器端口(如?EXPOSE 80 ),實際映射需?docker run -p 8080:80 |
緩存管理 | 利用緩存 | 不變的內容(如?WORKDIR /app )放前面,變動的(如?COPY . /app )放后面 |
清理緩存 | 強制重新構建:docker build --no-cache -t myapp . |