Docker高級管理--Dockerfile 鏡像制作

目錄

一: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
存儲驅動管理鏡像層和容器層的讀寫機制(如?overlay2aufsdevicemapper

(2)鏡像層特性

特性說明示例/影響
指令對應分層Dockerfile 中每條指令(如?RUNCOPY)生成一個獨立鏡像層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 命令(如?RUNCOPY
構建過程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,但支持自動解壓壓縮包和遠程 URLADD 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添加元數據(替代已棄用的?MAINTAINERLABEL 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后續指令(如?RUNCOPY)均基于此目錄執行

(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?ADDCMD?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?&?ENTRYPOINTENTRYPOINT ["python3"]?+?CMD ["app.py"]:運行時可通過?docker run myapp --debug?覆蓋?CMD
環境變量ENV?vs?ARGENV?持久化(如?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 .

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

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

相關文章

Leetcode力扣解題記錄--第42題 接雨水(動規和分治法)

題目鏈接&#xff1a;42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 這里我們可以用兩種方法去解決巧妙地解決這個題。首先來看一下題目 題目描述 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。…

寶塔配置pgsql可以遠程訪問

本地navicat premium 17.0 可以遠程訪問pgsql v16.1寶塔的軟件商店里&#xff0c;找到pgsql管理器&#xff1b;在pgsql管理器里找到客戶端認證&#xff1a;第二步&#xff1a;配置修改&#xff0c;CtrlF 查找listen_addresses關鍵字&#xff1b;第三步&#xff1a;在navicat里配…

小架構step系列12:單元測試

1 概述 測試的種類很多&#xff1a;單元測試、集成測試、系統測試等&#xff0c;程序員寫代碼進行測試的可以稱為白盒測試&#xff0c;單元測試和集成測試都可以進行白盒測試&#xff0c;可以理解為單元測試是對某個類的某個方法進行測試&#xff0c;集成測試則是測試一連串的…

SpringBoot3-Flowable7初體驗

目錄簡介準備JDKMySQLflowable-ui創建流程圖要注意的地方編碼依賴和配置控制器實體Flowable任務處理類驗證啟動程序調用接口本文源碼參考簡介 Flowable是一個輕量的Java業務流程引擎&#xff0c;用于實現業務流程的管理和自動化。相較于老牌的Activiti做了一些改進和擴展&…

phpMyAdmin:一款經典的MySQL在線管理工具又回來了

phpMyAdmin 是一個免費開源、基于 Web 的 MySQL/MariaDB 數據庫管理和開發工具。它提供了一個直觀的圖形用戶界面&#xff0c;使得我們無需精通復雜的 SQL 命令也能執行大多數數據庫管理任務。 phpMyAdmin 項目曾經暫停將近兩年&#xff0c;不過 2025 年又開始發布新版本了。 …

存儲服務一NFS文件存儲概述

前言&#xff1a; 網絡文件系統&#xff08;Network File System&#xff0c;NFS&#xff09;誕生于1984年&#xff0c;由Sun Microsystems首創&#xff0c;旨在解決異構系統間的文件共享需求。作為一種基于客戶端-服務器架構的分布式文件協議&#xff0c;NFS允許遠程主機通過T…

libimagequant 在 mac 平臺編譯雙架構

在 macOS 上編譯 libimagequant 的雙架構&#xff08;aarch64 x86_64&#xff09;通用二進制庫&#xff0c;以下是完整步驟&#xff1a;??1. 準備 Rust 工具鏈?? # 安裝兩個目標平臺 rustup target add aarch64-apple-darwin x86_64-apple-darwin# 確認安裝成功 rustup ta…

暑期自學嵌入式——Day01(C語言階段)

點關注不迷路喲。你的點贊、收藏&#xff0c;一鍵三連&#xff0c;是我持續更新的動力喲&#xff01;&#xff01;&#xff01; 主頁&#xff1a; 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1011.2682.3001.5343感悟&#xff1a; 今天我認為最重…

Flutter基礎(前端教程⑧-數據模型)

這個示例展示了如何創建數據模型、解析 JSON 數據&#xff0c;以及在 UI 中使用這些數據&#xff1a;import package:flutter/material.dart; import dart:convert;void main() {// 示例&#xff1a;手動創建User對象final user User(id: 1,name: 張三,age: 25,email: zhangsa…

SSRF10 各種限制繞過之30x跳轉繞過協議限制

ssrf漏洞在廠商的處理下可能進行一些特殊處理導致我們無法直接利用漏洞 有以下四種&#xff1a; 1.ip地址限制繞過 2.域名限制繞過 3.30x跳轉繞過域名限制 4.DNS rebinding繞過內網ip限制 本章我們講30x跳轉繞過域名限制 30x跳轉繞過域名限制 之前我們使用ssrf漏洞時可以…

DNS解析過程和nmap端口掃描

目錄 DNS解析流程&#xff1a; nmap端口掃描 指定掃描方式 TCP全連接掃描 -sT SYN半連接掃描 -sS -sT和 -sS的區別 Linux提權 利用好谷歌語法查找敏感信息 如果自己搭建了網站文件要放在phpstudy_pro\WWW下。 如果想要使用域名訪問網站&#xff0c;需要在phpstudy_pro…

【基于開源大模型(如deepseek)開發應用及其發展趨勢的一點思考】

1. 開源大模型技術發展現狀1.1 DeepSeek等主流開源大模型的技術特性分析 DeepSeek作為當前最具代表性的開源大模型之一&#xff0c;其技術架構具有多項創新特性。該模型采用混合專家架構(MoE)&#xff0c;通過將視覺編碼分離為"理解"和"生成"兩條路徑&…

java8 ConcurrentHashMap 桶級別鎖實現機制

Java 8 ConcurrentHashMap 桶級別鎖實現機制 Java 8 中的 ConcurrentHashMap 拋棄了分段鎖設計&#xff0c;采用了更細粒度的桶級別鎖&#xff08;bucket-level locking&#xff09;實現&#xff0c;這是其并發性能提升的關鍵。下面詳細解析其實現原理&#xff1a; 1. 基本實現…

Python正則表達式實戰指南

一 正則表達式庫正則表達式是文本處理中不可或缺的強大工具&#xff0c;Python通過re模塊提供了完整的正則表達式支持。本文將詳細介紹re模塊中最常用的match()、search()和findall()函數&#xff0c;以及貪婪模式與非貪婪模式的區別&#xff0c;幫助讀者掌握Python中正則表達式…

使用球體模型模擬相機成像:地面與天空的可見性判斷與紋理映射

在傳統相機模擬中&#xff0c;地面通常被建模為一個平面&#xff08;Plane&#xff09;&#xff0c;這在低空場景下是合理的。但在更大視場范圍或遠距觀察時&#xff0c;地球的曲率不可忽視。因此&#xff0c;我們需要將地面模型從平面升級為球體&#xff0c;并基于球面與光線的…

Agent自動化與代碼智能

核心問題&#xff1a; 現在很多團隊做AI系統有個大毛病&#xff1a;只顧追求“高大上”的新技術&#xff08;尤其是AI Agent&#xff09;&#xff0c;不管實際業務需不需要。 結果系統搞得又貴、又復雜、還容易出錯。大家被“Agent”這個概念搞暈了&#xff1a;到底啥時候用簡單…

SQL141 試卷完成數同比2020年的增長率及排名變化

SQL141 試卷完成數同比2020年的增長率及排名變化 withtemp as (selectexam_id,tag,date(submit_time) as submit_timefromexamination_infoleft join exam_record using (exam_id)wheresubmit_time is not null),2021_temp as (selecttag,count(*) as exam_cnt_21,rank() over…

C語言<數據結構-單鏈表>

鏈表是一種常見且重要的數據結構&#xff0c;在 C 語言中&#xff0c;它通過指針將一系列的節點連接起來&#xff0c;每個節點可以存儲不同類型的數據。相比數組&#xff0c;鏈表在插入和刪除元素時不需要移動大量數據&#xff0c;具有更好的靈活性&#xff0c;尤其適合處理動態…

archive/tar: unknown file mode ?rwxr-xr-x

這個是我在docker build報錯的&#xff0c;這是一個node.js項目。我猜你也是一個node.js下的項目&#xff0c;或者前端項目。 解決方法&#xff1a; .dockerignore里面寫一下node_modules就行了。 未能解決&#xff1a;archive/tar&#xff1a;未知文件模式&#xff1f;rwxr-…

【前端】ikun-markdown: 純js實現markdown到富文本html的轉換庫

文章目錄背景界面當前支持的 Markdown 語法不支持的Markdown 語法代碼節選背景 出于興趣,我使用js實現了一個 markdown語法 -> ast語法樹 -> html富文本的庫, 其速度應當慢于正則實現的同類js庫, 但是語法擴展性更好, 嵌套列表處理起來更方便. 界面 基于此js實現vue組…