K8S - 從零構建 Docker 鏡像與容器

一、基礎概念

1.1 鏡像(Image)

“軟件的標準化安裝包” ,包含代碼、環境和配置的只讀模板。

技術解析

鏡像由多個層組成,每層對應一個Dockerfile指令:

應用代碼 → 運行時環境 → 系統工具鏈 → 啟動配置

核心特性

  • 分層存儲(每層對應 Dockerfile指令)

  • 內容尋址(SHA256 哈希防篡改)

  • 不可變性(構建后無法修改)

1.2 容器(Container)

“鏡像的運行時實例,基于鏡像創建的獨立進程,像輕量級隔離的進程沙箱”。

技術解析

容器實例化后,會添加可寫層,并應用進程隔離與資源限制機制:

鏡像 → 可寫層 → 進程隔離(Namespace)→ 資源限制(Cgroups

核心能力

  • 進程隔離(Linux Namespaces)

  • 資源限制(CPU/內存配額 Cgroups)

  • 臨時存儲(OverlayFS可寫層)

1.3 Dockerfile

“鏡像的構建說明書”,以 文本文件形式定義如何組裝鏡像。

技術解析

FROM python:3.8-slim  # 選擇基礎鏡像
WORKDIR /app          # 設置工作目錄
COPY requirements.txt .  
RUN pip install -r requirements.txt  # 安裝依賴
COPY . .              # 復制應用代碼
CMD ["python", "app.py"]  # 設置默認啟動命令

關鍵原則

  • 指令順序影響構建效率

  • 每個 RUN 生成新層(可合并命令減少層數)

核心價值
在這里插入圖片描述

1.4 概念關系圖

Dockerfile(docker build) → 鏡像 → (docker run) → 容器 → (修改) → 可寫層
可寫層 -x (容器刪除) → 數據丟失

二、 構建第一個鏡像

1.環境準備(Mac/Win/Linux通用)

# 安裝Docker
# 官網下載:https://www.docker.com/products/docker-desktop
# 驗證安裝
docker --version
# 預期輸出示例:Docker version 20.10.17, build 100c701

2. 示例代碼

項目結構概覽

my-first-image/           # 項目根目錄
│── app.py               # Flask 應用主程序
│── requirements.txt      # Python 依賴文件
│── Dockerfile           # 構建鏡像的 Dockerfile

步驟1:創建項目文件

app.py

# 新建項目目錄
mkdir ~/my-first-image && cd ~/my-first-image# 創建Python應用文件
cat <<EOF > app.py
from flask import Flask
app = Flask(__name__)@app.route('/')
def hello():return "Hello, 這是我的第一個容器!"if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
EOF# 生成依賴文件
echo "Flask==2.2.2" > requirements.txt

requirements.txt

Flask==2.2.2

步驟2:編寫 Dockerfile (基礎版,單階段)

# 使用官方Python輕量版鏡像
FROM python:3.8-slim# 設置容器內工作目錄(自動創建)
WORKDIR /app# 1. 先復制依賴文件(利用緩存優化)
COPY requirements.txt .# 2. 安裝依賴
RUN pip install --no-cache-dir -r requirements.txt# 3. 復制應用代碼
COPY . .# 聲明容器監聽端口(實際映射需通過-p參數)
EXPOSE 5000# 容器啟動命令(JSON格式避免shell解析問題)
CMD ["python", "app.py"]

步驟3:構建鏡像

# 構建鏡像(注意最后的點 . )
docker build -t my-first-app:v1 .# 查看生成的鏡像
docker images
預期輸出示例:REPOSITORY     TAG    IMAGE ID      SIZE
my-first-app   v1     a1b2c3d4e5    123MB

步驟4:運行容器

# 啟動容器(前臺運行,便于調試)
docker run -p 8000:5000 my-first-app:v1# 新開終端,測試訪問:
curl http://localhost:8000
# 或在瀏覽器訪問:http://localhost:8000

預期輸出:

Hello, 這是我的第一個容器!

關鍵說明:

  • 緩存優化:先單獨復制 requirements.txt安裝依賴,代碼變更時避免重復安裝。

  • –no-cache-dir:禁用 pip緩存,減少鏡像體積。

  • EXPOSE:僅為文檔說明,實際端口映射需通過 -p 8000:5000實現。

三、Dockerfile實踐與高效構建

3.1 Dockerfile 三大核心特性

特性1:分層構建(Layer)

title 鏡像層組成
"基礎鏡像" 
"依賴安裝" 
"應用代碼" 
"元數據" 

緩存機制:重復構建時未變化的層直接復用緩存。

特性2:聲明式語法

Dockerfile 示例

FROM python:3.8-slim  # 聲明環境
COPY . /app           # 聲明文件
CMD ["python", "app.py"]  # 聲明啟動

特點:描述 “做什么”而非 “怎么做”。

特性3:跨平臺一致性

  • 構建結果與宿主機環境無關

  • 相同 Dockerfile 在任何平臺生成相同鏡像

3.2 核心指令解析

Dockerfile 基礎指令集 (結合第二章示例)
在這里插入圖片描述

指令說明

FROM :必須是 Dockerfile 的第一條有效指令。

最佳實踐:

? 選擇官方維護的基礎鏡像(如 python:3.8-slim)

? 避免使用 未經審計的第三方鏡像

? -slim或 alpine版本可減少鏡像體積

WORKDIR

? 會自動創建目錄(如果不存在)。

? 比 RUN cd /app && … 更規范。

COPY

? 比 ADD 更推薦使用(除非需要自動解壓功能)。

? 受 .dockerignore 文件影響。

RUN

? 每個 RUN 指令都會創建一個新的鏡像層。

? 建議合并相關命令(如 apt-get update && apt-get install)。

CMD

生產環境建議
在這里插入圖片描述

3.3 基礎鏡像選擇指南

1. 官方鏡像倉庫推薦

# 通用搜索語法(所有語言適用)
docker search --filter "is-official=true" [技術棧關鍵詞]# 示例:
docker search --filter "is-official=true" node
docker search --filter "is-official=true" golang

官方鏡像特征:

? 命名規范:[技術棧]:[版本]-[變體]

# 標準格式示例:
docker pull node:18-bullseye-slim    # Node.js 官方鏡像
docker pull golang:1.20-alpine       # Go 官方鏡像
docker pull nginx:1.25-alpine        # Nginx 官方鏡像

2. 主流語言推薦基礎鏡像

| 語言       | 開發環境鏡像          | 生產環境鏡像              |
|------------|---------------------|-------------------------|
| Python     | `python:3.10`       | `python:3.10-slim`      |
| Node.js    | `node:18`           | `node:18-alpine`        |
| Java       | `eclipse-temurin:17`| `eclipse-temurin:17-jre`|

3. 鏡像變體對比

A[鏡像變體] --> B[完整版]
A --> C[精簡版]
A --> D[最小版]
B -->|含gcc/make等| E[500MB+]
C -->|僅運行時依賴| F[100-300MB]
D -->|musl libc| G[5-50MB]

選擇原則

### 選擇原則(新手友好版)
1. 生產環境優先選擇 `-slim` 或 `-alpine````bash# 正確示例docker pull python:3.10-slim
# 開發調試 使用完整版, 臨時使用(勿用于生產)
docker pull python:3.10

常用命令

# 查看鏡像架構
docker manifest inspect python:3.9 | grep architecture# 拉取指定平臺鏡像
docker pull --platform=linux/amd64 nginx:alpine

3.4 容器生命周期管理命令集

1. 鏡像管理命令

# 構建鏡像(注意最后的點表示當前目錄)
docker build -t myapp:v1 .# 查看鏡像列表(grep 過濾)
docker images | grep python# 查看鏡像構建歷史
docker history myapp:v1# 刪除鏡像(-f 強制刪除)
docker rmi -f myapp:v1# 給鏡像打標簽
docker tag myapp:v1 registry.example.com/myapp:v1# 推送鏡像到倉庫
docker push registry.example.com/myapp:v1

2. 容器操作命令

創建與啟動# 創建并運行容器(-d 后臺運行,-p 端口映射)
docker run -d -p 8080:80 --name mynginx nginx:alpine# 只創建不運行容器
docker create --name my_redis redis:6# 啟動已創建的容器
docker start my_redis

運行中管理

# 查看運行中的容器(-a 顯示所有,-q 只顯示 ID)
docker ps -a
docker ps -q# 進入容器交互模式(推薦 /bin/sh,更輕量)
docker exec -it mynginx /bin/sh# 查看實時日志(--tail 顯示最后 N 行)
docker logs -f --tail=100 mynginx
停止與刪除# 優雅停止容器(發送 SIGTERM)
docker stop mynginx# 強制停止容器(發送 SIGKILL)
docker kill my_redis# 刪除容器(-f 強制刪除運行中的容器)
docker rm -f mynginx
3. 系統管理命令# 查看容器資源使用(CPU/內存/網絡)
docker stats# 查看容器詳細信息
docker inspect mynginx# 宿主機和容器之間拷貝文件
docker cp ./local_file mynginx:/container_path
docker cp mynginx:/container_path ./local_dir

4. 一鍵清理命令

# 清理所有停止的容器(-f 強制)
docker container prune -f# 清理所有懸空鏡像
docker image prune -f# 徹底清理(包括未使用的鏡像和緩存)
docker system prune -a

5. 生產環境組合命令

# 批量停止并刪除所有容器
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)# 刪除所有 <none> 鏡像(懸空鏡像)
docker rmi $(docker images -f "dangling=true" -q)# 重啟所有容器(先 stop 再 start)
docker stop $(docker ps -q) && docker start $(docker ps -aq)
6. 注意事項# 重要數據必須掛載 volume(示例)
docker run -v /host/path:/container/path mysql# 設置資源限制(示例)
docker run --memory="1g" --cpus="2" myapp# 使用非 root 用戶運行(在 Dockerfile 中添加)
RUN useradd -m appuser && chown -R appuser /app
USER appuser

四、總結

4.1 核心概念關系

A[Dockerfile] --> B[鏡像]
B --> C[容器]
C --> D[Pod]
D --> E[Deployment]

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

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

相關文章

better_fbx 下載

目錄 v6.0.5下載&#xff1a; better_fbx 下載 v6.0.5下載&#xff1a; Blender FBX模型導入導出插件 Better FBX Importer & Exporter V6.0.5V5.4.10 For Blender 2.8 | 齲齒一號GFXCamp better_fbx 下載 How To Install Launch Blender, navigate to Edit->User P…

Spring AOP 典型應用場景

AOP 典型應用場景 1. 日志記錄&#xff08;Logging&#xff09;代碼實現 2. 權限校驗&#xff08;Authentication&#xff09;代碼實現 3. 性能監控&#xff08;Performance Monitoring&#xff09;代碼實現 4. 緩存處理&#xff08;Caching&#xff09;代碼實現 5. 重試機制&a…

開始一個vue項目-day2

這次新增的功能有&#xff1a; 1、使用cookie存儲token 參考網站:https://vueuse.org/ 安裝包&#xff1a; npm i vueuse/integrations npm i universal-cookie^7 2、cookie的設置讀取和刪除&#xff0c;代碼&#xff1a;composables/auth.js import { useCookies } from …

「Mac暢玩AIGC與多模態18」開發篇14 - 多字段輸出與結構控制工作流示例

一、概述 本篇在輸入變量基礎上,演示如何通過執行 LLM 節點輸出多個結構化字段,并傳遞至結束節點。開發人員將掌握如何配置結構化輸出格式,實現提示詞與字段的準確映射,為后續引入條件判斷、循環結構等邏輯控制建立結構輸出規范基礎。 二、環境準備 macOS 系統Dify 平臺已…

JWT解析

什么是JWT JSON Web Token &#xff08;JWT&#xff09; 是一種開放標準 &#xff08;RFC 7519&#xff09;&#xff0c;它定義了一種緊湊且獨立的方式&#xff0c;用于在各方之間以 JSON 對象的形式安全地傳輸信息。此信息可以驗證和信任&#xff0c;因為它是經過數字簽名的。…

C語言中的自定義類型 —— 結構體.位段.聯合體和枚舉

自定義類型 1. 前言2. 結構體2.1 結構體的聲明2.2 結構體變量的定義和初始化2.3 結構體的特殊聲明2.4 結構體的自引用2.5 結構體的內存對齊2.6 修改默認對齊數2.7 結構體傳參 3. 位段4. 聯合體5. 枚舉6. 結言 1. 前言 在C語言中已經為用過戶提供了內置類型&#xff0c;如&…

StarRocks 查詢優化器深度解析

StarRocks 查詢優化器概覽 1. Development History of StarRocks 過去五年&#xff0c;StarRocks 發布了三個大版本&#xff1a; StarRocks 1.0&#xff1a;通過向量化引擎和 CBO&#xff0c;打造極速 OLAP 數據庫。 StarRocks 2.0&#xff1a;通過主鍵模型、數據湖分析和查詢…

如何提高情商?(優化版)

引言 提高情商&#xff08;EQ&#xff09;是一個需要長期練習和自我反思的過程&#xff0c;核心在于理解自己、管理情緒、共情他人并有效溝通。以下是一些具體且可操作的方法&#xff0c;結合理論和實際場景&#xff0c;幫助你逐步提升&#xff1a; 一、核心方法&#xff1a;…

Python爬蟲實戰:獲取好大夫在線各專業全國醫院排行榜數據并分析,為患者就醫做參考

一、引言 在當今醫療資源豐富但分布不均的背景下,患者在選擇合適的心血管內科醫院時面臨諸多困難。好大夫在線提供的醫院排行榜數據包含了醫院排名、線上服務得分、患者評價得分等重要信息,對患者選擇醫院具有重要的參考價值。本研究通過爬取該排行榜數據,并進行深入分析,…

【AI面試準備】電商購物車AI測試設計與實施

面試題&#xff1a;案例實踐&#xff1a; 為電商購物車設計AI測試&#xff1a;通過用戶行為日志訓練點擊路徑預測模型&#xff0c;動態生成邊界條件測試用例。 為了順利通過面試&#xff0c;回答應結構清晰、技術深入&#xff0c;并突出實際應用與創新。以下為分步解答&#…

Java 中使用 Callable 創建線程的方法

一、Callable 接口概述? Callable接口位于java.util.concurrent包中&#xff0c;與Runnable接口類似&#xff0c;同樣用于定義線程執行的任務&#xff0c;但它具有以下獨特特性&#xff1a;? 支持返回值&#xff1a;Callable接口聲明了一個call()方法&#xff0c;該方法會在…

2025-SMS短信驗證服務或存風險,小心賬號隱私“失守”

近期&#xff0c;火絨安全情報中心監測到一款偽裝成具備SMS短信驗證碼接收服務的程序。該程序通過部署持久化后門&#xff08;即僵尸網絡節點&#xff09;竊取敏感信息。火絨安全提醒廣大用戶務必從官方或可信渠道下載軟件&#xff0c;避免因使用來路不明的程序而導致賬號被盜或…

docker部署Open WebUI下載速度慢解決方法

docker pull ghcr.nju.edu.cn/open-webui/open-webui:main改成這個就可以了

氣泡圖、桑基圖的繪制

1、氣泡圖 使用氣泡圖分析某一年中國同歐洲各國之間的貿易情況。 氣泡圖分析的三個維度&#xff1a; ? 進口額&#xff1a;橫軸 ? 出口額&#xff1a;縱軸 ? 進出口總額&#xff1a;氣泡大小 數據來源&#xff1a;鏈接: 國家統計局數據 數據概覽&#xff08;進出口總額&…

前端面經-VUE3篇(三)--vue Router(二)導航守衛、路由元信息、路由懶加載、動態路由

一、導航守衛 vue Router 中的 導航守衛&#xff08;Navigation Guards&#xff09; 是一個非常重要的功能&#xff0c;用于在路由切換過程中&#xff0c;攔截、控制、檢查或延遲頁面跳轉。 你可以理解為&#xff1a; &#x1f510; “進門前的保安”&#xff0c;控制哪些頁面…

MATLAB實現二氧化硅和硅光纖的單模光波特性與仿真

一.二氧化硅和硅光纖的單模光波特性 利用麥克斯方程的精確解研究二氧化硅和硅亞波長直徑導線的單模光波特性。研究了單模條件、模場。 二氧化硅光纖導線是圓形截面&#xff0c;包層是空氣包層&#xff0c;階梯型變化的折射率&#xff0c;導線線徑D非常小長度足夠長&#xff0…

【Linux系統】第二節—基礎指令(2)

hello ~ 好久不見 自己想要的快樂要自己好好爭取&#xff01; 云邊有個稻草人-個人主頁 Linux—本篇文章所屬專欄—歡迎訂閱—持續更新中 目錄 本節課核心指令知識點總結 本節基本指令詳解 07.man 指令 08.cp 指令 09.mv 指令 10.cat 指令 11.more 指令 12.less 指令 …

為了結合后端而學習前端的學習日志——【黑洞光標特效】

前端設計專欄 今天給大家帶來一個超酷的前端特效——黑洞光標&#xff01;讓你的鼠標變成一個會吞噬光粒子的迷你黑洞&#xff0c;點擊時還會噴射出綠色能量粒子&#xff01;&#x1f320; &#x1f680; 效果預覽 想象一下&#xff1a;你的鼠標變成一個旋轉的黑洞&#xff0…

[硬件電路-11]:模擬電路常見元器件 - 什么是阻抗、什么是輸入阻抗、什么是輸出阻抗?阻抗、輸入阻抗與輸出阻抗的全面解析

1. 阻抗&#xff08;Impedance&#xff09; 定義&#xff1a;阻抗是電路或元件對交流信號&#xff08;AC&#xff09;流動的阻礙能力&#xff0c;用符號Z表示&#xff0c;單位為歐姆&#xff08;Ω&#xff09;。它綜合了電阻&#xff08;R&#xff09;、電感&#xff08;L&am…

機器學習和深度學習的對比

深度 數據經過深層網絡后&#xff0c;語義信息表征能力強&#xff0c;對幾何細節信息表征能力弱。 數據依賴性 深度學習算法需要大量的數據來訓練&#xff0c;而傳統的機器學習使用制定的規則。所以&#xff0c;當數據量少時&#xff0c;深度學習的性能差于機器學習&#xf…