一、基礎概念
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]