本指南遵循零基礎(chǔ)入門→核心能力進(jìn)階→企業(yè)級精通→生產(chǎn)落地實(shí)戰(zhàn)的漸進(jìn)式路徑,覆蓋Docker全生命周期知識點(diǎn),兼顧理論深度與可落地實(shí)操,適配2026年最新穩(wěn)定版Docker規(guī)范。
一、入門篇:零基礎(chǔ)上手 Docker
核心目標(biāo):理解Docker核心價(jià)值,完成環(huán)境搭建,掌握基礎(chǔ)命令,跑通第一個(gè)容器化應(yīng)用
1.1 Docker 核心認(rèn)知
Docker是一個(gè)開源的容器化引擎,核心解決應(yīng)用環(huán)境一致性問題,實(shí)現(xiàn)“一次構(gòu)建,到處運(yùn)行”,徹底告別“在我電腦上能跑,線上跑不了”的痛點(diǎn)。
核心本質(zhì):容器不是輕量級虛擬機(jī),而是宿主機(jī)上一組被隔離和資源受限的進(jìn)程,共享宿主機(jī)Linux內(nèi)核,啟動(dòng)秒級,資源占用極低。
-
三大核心概念(必記)
概念 通俗類比 核心定義 鏡像Image 程序安裝包/系統(tǒng)ISO 只讀的文件模板,包含應(yīng)用運(yùn)行所需的代碼、依賴、環(huán)境變量、配置文件,是容器的基礎(chǔ) 容器Container 運(yùn)行的程序?qū)嵗?/td> 鏡像的運(yùn)行時(shí)實(shí)體,是一個(gè)獨(dú)立的沙箱環(huán)境,擁有自己的進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng),與其他容器和宿主機(jī)相互隔離 倉庫Registry 應(yīng)用商店/軟件倉庫 集中存儲和分發(fā)Docker鏡像的服務(wù),公共倉庫如Docker Hub,私有倉庫如Harbor、Registry 與傳統(tǒng)虛擬機(jī)的核心區(qū)別
虛擬機(jī)需要完整的Guest OS,資源占用大、啟動(dòng)分鐘級;Docker共享宿主機(jī)內(nèi)核,僅隔離應(yīng)用運(yùn)行環(huán)境,資源占用極小、啟動(dòng)秒級,單機(jī)可輕松運(yùn)行數(shù)百個(gè)容器。
1.2 全平臺Docker安裝與環(huán)境配置
Docker 分為 CE 社區(qū)版(免費(fèi),日常使用)和 EE 企業(yè)版(付費(fèi),企業(yè)級支持),以下為2026年最新穩(wěn)定版安裝方案。
1.2.1 Linux(生產(chǎn)環(huán)境首選,Ubuntu/CentOS)
Ubuntu 22.04 LTS 官方倉庫安裝(最穩(wěn)定)
# 1. 更新系統(tǒng)并安裝依賴
sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release
# 2. 添加Docker官方GPG密鑰
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 3. 添加Docker軟件源(阿里云國內(nèi)源,速度更快)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 4. 安裝Docker核心組件
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 5. 啟動(dòng)Docker并設(shè)置開機(jī)自啟
sudo systemctl enable --now docker
# 6. 驗(yàn)證安裝
docker --version # 輸出版本號即成功
docker run hello-world # 拉取測試鏡像并運(yùn)行,輸出歡迎信息即環(huán)境就緒
CentOS/RHEL 安裝
# 1. 卸載舊版本
sudo yum remove -y docker docker-client docker-common docker-engine
# 2. 安裝依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 3. 添加阿里云源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4. 安裝并啟動(dòng)
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
# 5. 驗(yàn)證
docker run hello-world
權(quán)限優(yōu)化(必做)
避免每次執(zhí)行docker命令都需要sudo,將當(dāng)前用戶加入docker組:
sudo usermod -aG docker $USER && newgrp docker
# 注銷重登錄后永久生效
國內(nèi)鏡像加速配置(必做)
解決官方鏡像源拉取慢的問題,修改Docker daemon配置:
# 編輯配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
# 重啟Docker生效
sudo systemctl daemon-reload && sudo systemctl restart docker
# 驗(yàn)證配置
docker info | grep "Registry Mirrors"
1.2.2 Windows/Mac(開發(fā)環(huán)境)
- 直接下載 Docker Desktop 官方安裝包:Docker Desktop官網(wǎng)
Windows需開啟WSL2(安裝包默認(rèn)勾選,需BIOS開啟CPU虛擬化),僅支持Windows 10/11專業(yè)版/家庭版
Mac需區(qū)分Intel芯片和Apple Silicon芯片,下載對應(yīng)架構(gòu)安裝包
- 安裝完成后啟動(dòng)Docker Desktop,在設(shè)置中可直接切換中文、配置鏡像加速、開啟WSL集成
- 打開終端執(zhí)行
docker run hello-world驗(yàn)證安裝成功
1.3 核心基礎(chǔ)命令(必學(xué)必會)
所有命令均可通過docker 命令 --help查看詳細(xì)用法,以下為高頻核心命令,按功能分類。
1.3.1 鏡像操作命令
# 1. 拉取鏡像(從倉庫下載到本地)
docker pull nginx:1.27.0-alpine # 推薦指定版本,避免latest標(biāo)簽
docker pull ubuntu:22.04
# 2. 查看本地鏡像列表
docker images
docker images -q # 僅輸出鏡像ID,批量操作常用
# 3. 查看鏡像詳情/歷史
docker inspect nginx:1.27.0-alpine # 查看鏡像完整元數(shù)據(jù)
docker history nginx:1.27.0-alpine # 查看鏡像構(gòu)建分層歷史
# 4. 給鏡像打標(biāo)簽(用于推送到倉庫)
docker tag nginx:1.27.0-alpine my-registry.com/my-nginx:v1.0.0
# 5. 刪除鏡像
docker rmi nginx:1.27.0-alpine # 刪除指定鏡像
docker rmi $(docker images -q) # 批量刪除所有本地鏡像
docker image prune -af # 清理無用的懸空鏡像(無標(biāo)簽、無容器引用)
1.3.2 容器生命周期核心命令
# 1. 核心:創(chuàng)建并啟動(dòng)容器(最常用,必掌握所有參數(shù))
docker run -d --name my-nginx -p 8080:80 -v /local/html:/usr/share/nginx/html nginx:1.27.0-alpine
# 核心參數(shù)詳解:
# -d:后臺守護(hù)進(jìn)程運(yùn)行
# --name:給容器指定唯一名稱,替代隨機(jī)名稱
# -p 宿主機(jī)端口:容器端口:端口映射,宿主機(jī)端口訪問容器內(nèi)服務(wù)
# -v 宿主機(jī)路徑:容器路徑:目錄掛載,實(shí)現(xiàn)數(shù)據(jù)持久化
# --restart=always:容器退出時(shí)自動(dòng)重啟,生產(chǎn)環(huán)境必加
# -e 環(huán)境變量名=值:給容器注入環(huán)境變量
# --cpus=1 --memory=512m:限制容器CPU和內(nèi)存使用,生產(chǎn)環(huán)境必加
# 2. 查看容器列表
docker ps # 查看運(yùn)行中的容器
docker ps -a # 查看所有容器(包括停止的)
docker ps -q # 僅輸出容器ID,批量操作常用
# 3. 停止/啟動(dòng)/重啟容器
docker stop my-nginx # 停止運(yùn)行中的容器
docker start my-nginx # 啟動(dòng)已停止的容器
docker restart my-nginx # 重啟容器
# 4. 進(jìn)入運(yùn)行中的容器(調(diào)試必備)
docker exec -it my-nginx /bin/sh # alpine鏡像用sh,ubuntu/centos用bash
# -it:交互式終端,必加,否則無法正常輸入命令
# 5. 查看容器日志(排障必備)
docker logs my-nginx # 輸出容器完整日志
docker logs -f --tail 100 my-nginx # 實(shí)時(shí)滾動(dòng)查看最新100行日志,高頻使用
# 6. 刪除容器
docker rm my-nginx # 刪除已停止的容器
docker rm -f my-nginx # 強(qiáng)制刪除運(yùn)行中的容器
docker rm $(docker ps -aq) # 批量刪除所有容器
docker container prune -f # 清理所有已停止的容器
1.3.3 倉庫操作命令
# 登錄倉庫
docker login # 登錄Docker Hub,輸入用戶名密碼
docker login my-registry.com # 登錄私有倉庫
# 推送鏡像到倉庫(需先打?qū)?yīng)倉庫的標(biāo)簽)
docker push my-registry.com/my-nginx:v1.0.0
# 登出倉庫
docker logout my-registry.com
1.4 第一個(gè)容器化應(yīng)用實(shí)戰(zhàn)
目標(biāo):用 Docker 啟動(dòng)一個(gè)Nginx服務(wù),掛載本地網(wǎng)頁,通過宿主機(jī)瀏覽器訪問
- 創(chuàng)建本地網(wǎng)頁目錄和文件
mkdir -p ~/docker-nginx/html && cd ~/docker-nginx/html echo "<h1>Hello Docker! 我的第一個(gè)容器化應(yīng)用</h1>" > index.html - 啟動(dòng) Nginx 容器,完成端口映射和目錄掛載
docker run -d \ --name my-first-nginx \ --restart=always \ -p 8080:80 \ -v ~/docker-nginx/html:/usr/share/nginx/html \ nginx:1.27.0-alpine - 驗(yàn)證效果:瀏覽器訪問
http://宿主機(jī)IP:8080,即可看到自定義的網(wǎng)頁內(nèi)容 - 常用調(diào)試操作
docker ps # 查看容器是否正常運(yùn)行 docker logs my-first-nginx # 查看Nginx訪問日志 docker exec -it my-first-nginx /bin/sh # 進(jìn)入容器內(nèi)部調(diào)試
二、進(jìn)階篇:核心能力全面掌握
核心目標(biāo):掌握鏡像自定義構(gòu)建、數(shù)據(jù)持久化、容器網(wǎng)絡(luò)、多容器編排,能獨(dú)立完成中小型應(yīng)用的容器化部署
2.1 Dockerfile:自定義鏡像構(gòu)建核心
Dockerfile是一個(gè)文本文件,包含一系列構(gòu)建鏡像的指令,Docker通過讀取該文件自動(dòng)構(gòu)建自定義鏡像,是容器化的核心技能。
2.1.1 核心指令與規(guī)范
| 指令 | 作用 | 最佳實(shí)踐 |
|---|---|---|
| FROM | 指定基礎(chǔ)鏡像,所有Dockerfile必須以FROM開頭 | 優(yōu)先使用官方精簡鏡像(alpine/slim),必須鎖定版本,禁止使用latest |
| WORKDIR | 設(shè)置容器內(nèi)的工作目錄,后續(xù)RUN/CMD/COPY/ADD指令均在此目錄執(zhí)行 | 絕對路徑,避免頻繁cd,禁止使用相對路徑 |
| COPY | 將宿主機(jī)的文件/目錄復(fù)制到鏡像內(nèi) | 優(yōu)先使用COPY,僅在需要自動(dòng)解壓tar包時(shí)用ADD |
| ADD | 復(fù)制文件到鏡像,支持遠(yuǎn)程URL、自動(dòng)解壓tar包 | 禁止用ADD下載遠(yuǎn)程文件(會殘留鏡像層),僅用于本地tar包解壓 |
| RUN | 構(gòu)建鏡像時(shí)執(zhí)行的shell命令,每一條RUN會生成一個(gè)新的鏡像層 | 合并多條RUN指令,用&&連接,執(zhí)行完清理緩存(apt clean/yum clean) |
| ENV | 設(shè)置容器運(yùn)行時(shí)的環(huán)境變量 | 用于配置應(yīng)用環(huán)境,避免硬編碼,區(qū)分構(gòu)建參數(shù)ARG |
| ARG | 構(gòu)建鏡像時(shí)的臨時(shí)參數(shù),僅在構(gòu)建過程中有效,不會保留到最終鏡像 | 用于傳遞版本號、構(gòu)建密鑰等臨時(shí)信息,避免敏感信息殘留 |
| EXPOSE | 聲明容器運(yùn)行時(shí)監(jiān)聽的端口,僅做文檔說明,不做實(shí)際端口映射 | 聲明應(yīng)用默認(rèn)端口,提升Dockerfile可讀性 |
| CMD | 容器啟動(dòng)時(shí)默認(rèn)執(zhí)行的命令,一個(gè)Dockerfile只有最后一個(gè)CMD生效 | 用于啟動(dòng)主進(jìn)程,可被docker run命令行參數(shù)覆蓋 |
| ENTRYPOINT | 容器啟動(dòng)時(shí)的入口命令,與CMD配合使用 | 固定容器啟動(dòng)的核心命令,CMD作為默認(rèn)參數(shù),實(shí)現(xiàn)容器“即開即用” |
| VOLUME | 聲明容器內(nèi)的持久化目錄,自動(dòng)創(chuàng)建匿名卷 | 聲明數(shù)據(jù)庫、日志等需要持久化的目錄,避免數(shù)據(jù)丟失 |
| USER | 指定容器運(yùn)行時(shí)的用戶和用戶組 | 生產(chǎn)環(huán)境必須使用非root用戶,提升安全性 |
| HEALTHCHECK | 容器健康檢查指令,Docker自動(dòng)檢測容器運(yùn)行狀態(tài) | 配置健康檢查,實(shí)現(xiàn)故障自動(dòng)重啟,生產(chǎn)環(huán)境必加 |
2.1.2 實(shí)戰(zhàn):構(gòu)建一個(gè)Python Flask應(yīng)用鏡像
- 項(xiàng)目目錄結(jié)構(gòu)
flask-demo/ ├── Dockerfile ├── requirements.txt └── app.py - 編寫應(yīng)用代碼
app.pyfrom flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello Docker! 這是我構(gòu)建的第一個(gè)Python鏡像" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) - 編寫依賴文件
requirements.txtFlask==2.3.3 - 編寫Dockerfile
# 1. 指定基礎(chǔ)鏡像,官方python精簡版,鎖定版本 FROM python:3.11-slim-bookworm # 2. 設(shè)置工作目錄 WORKDIR /app # 3. 先復(fù)制依賴文件,利用Docker緩存機(jī)制,避免每次修改代碼都重新安裝依賴 COPY requirements.txt . # 4. 安裝依賴,合并命令,清理緩存,減少鏡像層 RUN pip install --no-cache-dir -r requirements.txt # 5. 復(fù)制應(yīng)用代碼 COPY app.py . # 6. 聲明監(jiān)聽端口 EXPOSE 5000 # 7. 健康檢查,每30秒檢測一次,超時(shí)3秒,重試3次則標(biāo)記為不健康 HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD curl -f http://localhost:5000/ || exit 1 # 8. 容器啟動(dòng)命令 CMD ["python", "app.py"] - 構(gòu)建鏡像
# -t 指定鏡像名稱和標(biāo)簽,. 表示Dockerfile所在的當(dāng)前目錄 docker build -t flask-demo:v1.0.0 . - 啟動(dòng)容器驗(yàn)證
docker run -d --name flask-app -p 5000:5000 flask-demo:v1.0.0 # 訪問 http://宿主機(jī)IP:5000 驗(yàn)證應(yīng)用正常運(yùn)行
2.1.3 鏡像優(yōu)化核心技巧
-
多階段構(gòu)建:將編譯環(huán)境和運(yùn)行環(huán)境分離,只把最終的運(yùn)行產(chǎn)物復(fù)制到最終鏡像,剔除編譯工具、源碼等無用文件,鏡像體積可減少90%以上。
示例:Go應(yīng)用多階段構(gòu)建
# 構(gòu)建階段:包含完整編譯環(huán)境 FROM golang:1.22 AS builder WORKDIR /app COPY . . RUN go build -o myapp main.go # 運(yùn)行階段:僅保留運(yùn)行所需的最小環(huán)境 FROM alpine:3.20 WORKDIR /app # 從構(gòu)建階段復(fù)制編譯好的二進(jìn)制文件,其他內(nèi)容全部丟棄 COPY --from=builder /app/myapp . EXPOSE 8080 CMD ["./myapp"] 基礎(chǔ)鏡像選擇:優(yōu)先使用alpine(5M左右)、slim系列鏡像,避免使用ubuntu/centos等完整系統(tǒng)鏡像,減少鏡像體積和攻擊面。
優(yōu)化鏡像層:合并多條RUN指令,用
&&連接,減少鏡像層數(shù)量;執(zhí)行完安裝命令后立即清理緩存(apt clean && rm -rf /var/lib/apt/lists/*、yum clean all)。使用 .dockerignore 文件:排除不需要復(fù)制到鏡像的文件(.git、node_modules、日志、臨時(shí)文件),減少構(gòu)建上下文大小,提升構(gòu)建速度。
2.2 數(shù)據(jù)持久化:Volume 核心詳解
容器的文件系統(tǒng)是臨時(shí)的,容器刪除后數(shù)據(jù)會全部丟失,Docker提供了三種數(shù)據(jù)持久化方案,實(shí)現(xiàn)數(shù)據(jù)與容器生命周期解耦。
2.2.1 三種掛載方式對比與適用場景
| 掛載類型 | 核心特點(diǎn) | 適用場景 | 命令示例 |
|---|---|---|---|
| 匿名卷/命名卷Volume | Docker管理,宿主機(jī)無需關(guān)心存儲路徑,支持卷驅(qū)動(dòng)、備份遷移,生命周期獨(dú)立于容器 | 生產(chǎn)環(huán)境數(shù)據(jù)庫、持久化數(shù)據(jù)存儲,推薦首選 | docker run -v mysql-data:/var/lib/mysql mysql:8.0 |
| 綁定掛載Bind Mount | 直接綁定宿主機(jī)指定目錄,容器可直接讀寫宿主機(jī)文件,性能最高 | 開發(fā)環(huán)境(代碼熱更新)、配置文件掛載、宿主機(jī)與容器文件共享 | docker run -v /local/nginx.conf:/etc/nginx/nginx.conf nginx |
| 臨時(shí)文件系統(tǒng)tmpfs | 掛載到宿主機(jī)內(nèi)存,容器停止后數(shù)據(jù)立即刪除,不寫入磁盤,性能極致 | 敏感臨時(shí)文件、緩存數(shù)據(jù),無需持久化的場景 | docker run --tmpfs /tmp nginx |
2.2.2 Volume核心操作命令
# 1. 創(chuàng)建命名卷
docker volume create mysql-data
# 2. 查看所有卷
docker volume ls
# 3. 查看卷詳情(存儲路徑等)
docker volume inspect mysql-data
# 4. 清理無用卷
docker volume prune -f
# 5. 刪除卷
docker volume rm mysql-data
2.2.3 生產(chǎn)環(huán)境最佳實(shí)踐
- 數(shù)據(jù)庫、消息隊(duì)列等IO密集型應(yīng)用,必須使用Volume掛載數(shù)據(jù)目錄,繞過overlay2可寫層,IO性能提升50%以上。
- 配置文件使用Bind Mount只讀掛載(添加
:ro后綴),避免容器內(nèi)修改配置,提升安全性:docker run -v /local/nginx.conf:/etc/nginx/nginx.conf:ro nginx。 - 禁止在容器內(nèi)存儲持久化數(shù)據(jù),所有需要保留的數(shù)據(jù)必須通過Volume/Bind Mount掛載到宿主機(jī),避免容器刪除導(dǎo)致數(shù)據(jù)丟失。
2.3 Docker網(wǎng)絡(luò)全解
Docker為容器提供了完整的網(wǎng)絡(luò)棧,實(shí)現(xiàn)容器間、容器與宿主機(jī)、容器與外網(wǎng)的通信,核心分為5種網(wǎng)絡(luò)模式。
2.3.1 五大網(wǎng)絡(luò)模式詳解
| 網(wǎng)絡(luò)模式 | 核心特點(diǎn) | 隔離性 | 適用場景 |
|---|---|---|---|
| bridge(默認(rèn)橋接) | Docker默認(rèn)網(wǎng)絡(luò),所有容器接入docker0網(wǎng)橋,通過端口映射對外提供服務(wù),容器間通過IP/容器名通信 | 中 | 單機(jī)多容器通信,絕大多數(shù)常規(guī)場景,默認(rèn)首選 |
| host(主機(jī)網(wǎng)絡(luò)) | 容器與宿主機(jī)共享網(wǎng)絡(luò)棧,容器內(nèi)端口直接綁定宿主機(jī)端口,無需端口映射,網(wǎng)絡(luò)性能無損耗 | 低 | 高并發(fā)網(wǎng)絡(luò)服務(wù),網(wǎng)絡(luò)性能要求極高的場景,如Nginx、網(wǎng)關(guān) |
| none(無網(wǎng)絡(luò)) | 容器禁用所有網(wǎng)絡(luò),只有l(wèi)o回環(huán)接口,完全無法與外界通信 | 極高 | 高安全要求的離線計(jì)算、敏感數(shù)據(jù)處理,禁止網(wǎng)絡(luò)訪問的場景 |
| container(容器共享網(wǎng)絡(luò)) | 多個(gè)容器共享同一個(gè)網(wǎng)絡(luò)棧,共享IP和端口,容器間通過lo回環(huán)接口通信 | 中 | 邊車模式(Sidecar),如日志采集、監(jiān)控代理與主應(yīng)用共享網(wǎng)絡(luò) |
| macvlan | 給容器分配獨(dú)立的MAC地址和IP地址,像物理機(jī)一樣直接接入局域網(wǎng),可被其他設(shè)備直接訪問 | 高 | 物聯(lián)網(wǎng)、傳統(tǒng)應(yīng)用遷移,需要容器擁有獨(dú)立局域網(wǎng)IP的場景 |
2.3.2 核心網(wǎng)絡(luò)操作命令
# 1. 查看所有Docker網(wǎng)絡(luò)
docker network ls
# 2. 創(chuàng)建自定義橋接網(wǎng)絡(luò)(生產(chǎn)環(huán)境推薦,比默認(rèn)bridge網(wǎng)絡(luò)功能更強(qiáng))
docker network create my-network
# 3. 查看網(wǎng)絡(luò)詳情
docker network inspect my-network
# 4. 容器接入網(wǎng)絡(luò)
docker network connect my-network my-nginx
# 5. 容器斷開網(wǎng)絡(luò)
docker network disconnect my-network my-nginx
# 6. 刪除網(wǎng)絡(luò)
docker network rm my-network
# 7. 清理無用網(wǎng)絡(luò)
docker network prune -f
2.3.3 容器通信最佳實(shí)踐
-
生產(chǎn)環(huán)境必須使用自定義橋接網(wǎng)絡(luò),而非默認(rèn)bridge網(wǎng)絡(luò):自定義網(wǎng)絡(luò)支持容器間通過容器名/服務(wù)名DNS解析通信,無需固定容器IP;提供更好的隔離性和網(wǎng)絡(luò)控制。
示例:兩個(gè)容器通過自定義網(wǎng)絡(luò)通信# 1. 創(chuàng)建自定義網(wǎng)絡(luò) docker network create app-network # 2. 啟動(dòng)MySQL容器,接入自定義網(wǎng)絡(luò) docker run -d --name mysql --network app-network -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 # 3. 啟動(dòng)Web應(yīng)用容器,接入同一個(gè)網(wǎng)絡(luò),可直接通過容器名mysql訪問數(shù)據(jù)庫 docker run -d --name web-app --network app-network my-web-app:v1.0.0 - 僅對外暴露必要的端口,禁止將容器所有端口映射到宿主機(jī),減少攻擊面。
- 高并發(fā)場景優(yōu)先使用host網(wǎng)絡(luò)模式,避免橋接網(wǎng)絡(luò)的轉(zhuǎn)發(fā)損耗,提升網(wǎng)絡(luò)性能。
2.4 Docker Compose:多容器編排利器
Docker Compose 是 Docker 官方的多容器編排工具,通過一個(gè)docker-compose.ymlYAML文件,定義和管理多個(gè)關(guān)聯(lián)的服務(wù),實(shí)現(xiàn)一鍵啟動(dòng)/停止/更新所有容器,徹底告別逐個(gè)手動(dòng)啟動(dòng)容器的繁瑣操作。
2.4.1 安裝與核心配置
- Docker Desktop Windows/Mac 版本已自帶 Docker Compose,無需額外安裝
- Linux環(huán)境安裝:已在前面的 Docker 安裝步驟中通過
docker-compose-plugin安裝,驗(yàn)證命令:docker compose version(注意新版是空格,不是橫杠,舊版docker-compose已棄用)
docker-compose.yml核心結(jié)構(gòu)分為四大頂級字段:
-
version:Compose文件版本,推薦3.8+ -
services:核心,定義所有服務(wù)(容器),每個(gè)服務(wù)對應(yīng)一個(gè)容器 -
networks:自定義網(wǎng)絡(luò),供服務(wù)間通信 -
volumes:數(shù)據(jù)卷,實(shí)現(xiàn)數(shù)據(jù)持久化
2.4.2 實(shí)戰(zhàn):一鍵部署LNMP環(huán)境(Nginx+MySQL+PHP)
- 創(chuàng)建項(xiàng)目目錄
mkdir -p ~/lnmp-docker && cd ~/lnmp-docker # 創(chuàng)建子目錄 mkdir -p nginx/conf html mysql/data php/conf - 編寫
docker-compose.yml核心文件version: '3.8' # 服務(wù)定義 services: # Nginx服務(wù) nginx: image: nginx:1.27.0-alpine container_name: lnmp-nginx restart: always ports: - "80:80" volumes: # 掛載網(wǎng)站根目錄 - ./html:/usr/share/nginx/html # 掛載Nginx配置文件 - ./nginx/conf:/etc/nginx/conf.d # 掛載日志目錄 - ./nginx/logs:/var/log/nginx networks: - lnmp-network depends_on: - php - mysql # PHP服務(wù) php: image: php:8.2-fpm-alpine container_name: lnmp-php restart: always volumes: - ./html:/usr/share/nginx/html - ./php/conf:/usr/local/etc/php/conf.d networks: - lnmp-network depends_on: - mysql # MySQL數(shù)據(jù)庫服務(wù) mysql: image: mysql:8.0 container_name: lnmp-mysql restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: 123456 # root用戶密碼 MYSQL_DATABASE: lnmp_db # 初始化創(chuàng)建的數(shù)據(jù)庫 volumes: # 數(shù)據(jù)庫數(shù)據(jù)持久化 - ./mysql/data:/var/lib/mysql # 初始化腳本目錄,.sql文件會自動(dòng)執(zhí)行 - ./mysql/init:/docker-entrypoint-initdb.d networks: - lnmp-network # 資源限制,生產(chǎn)環(huán)境必加 deploy: resources: limits: cpus: '1' memory: 1G # 自定義網(wǎng)絡(luò) networks: lnmp-network: driver: bridge # 數(shù)據(jù)卷(如需使用Docker管理的卷,可在此定義) volumes: mysql-data: - 編寫Nginx配置文件
nginx/conf/default.confserver { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html index.htm index.php; location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } - 編寫PHP測試文件
html/index.php<?php phpinfo(); ?> - 一鍵啟動(dòng)所有服務(wù)
# 后臺啟動(dòng)所有服務(wù) docker compose up -d # 查看服務(wù)運(yùn)行狀態(tài) docker compose ps - 驗(yàn)證效果:瀏覽器訪問
http://宿主機(jī)IP,即可看到phpinfo頁面;通過Navicat等工具可連接宿主機(jī)3306端口的MySQL數(shù)據(jù)庫。
2.4.3 Docker Compose高頻核心命令
# 1. 啟動(dòng)所有服務(wù)(核心)
docker compose up -d # -d 后臺運(yùn)行
docker compose up -d --build # 啟動(dòng)前重新構(gòu)建自定義鏡像
# 2. 停止并刪除所有服務(wù)、網(wǎng)絡(luò)、卷
docker compose down # 保留數(shù)據(jù)卷
docker compose down -v # 同時(shí)刪除數(shù)據(jù)卷,謹(jǐn)慎使用
# 3. 查看服務(wù)運(yùn)行狀態(tài)
docker compose ps
# 4. 查看服務(wù)日志
docker compose logs # 輸出所有服務(wù)日志
docker compose logs -f --tail 100 nginx # 實(shí)時(shí)查看指定服務(wù)的最新日志
# 5. 重啟/停止/啟動(dòng)服務(wù)
docker compose restart nginx # 重啟指定服務(wù)
docker compose stop # 停止所有服務(wù)
docker compose start # 啟動(dòng)已停止的所有服務(wù)
# 6. 進(jìn)入指定服務(wù)的容器
docker compose exec php /bin/sh
2.5 私有鏡像倉庫搭建
企業(yè)生產(chǎn)環(huán)境中,不能直接使用公共倉庫,需要搭建私有鏡像倉庫,實(shí)現(xiàn)鏡像的內(nèi)部存儲、分發(fā)和權(quán)限管理。主流方案分為兩種:
- Docker Registry:Docker官方輕量級倉庫,無UI界面,適合簡單場景、測試環(huán)境
- Harbor:VMware開源的企業(yè)級倉庫,提供UI界面、權(quán)限管理、安全掃描、鏡像復(fù)制、高可用等功能,生產(chǎn)環(huán)境首選
2.5.1 輕量級Registry快速搭建
# 一鍵啟動(dòng)Registry容器
docker run -d \
--name registry \
--restart=always \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry:2.8
# 驗(yàn)證:推送鏡像到私有倉庫
# 1. 給鏡像打標(biāo)簽,格式為 倉庫地址/鏡像名:標(biāo)簽
docker tag nginx:1.27.0-alpine localhost:5000/my-nginx:v1.0.0
# 2. 推送鏡像
docker push localhost:5000/my-nginx:v1.0.0
# 3. 拉取鏡像
docker pull localhost:5000/my-nginx:v1.0.0
2.5.2 Harbor企業(yè)級倉庫搭建
參考官方文檔,通過Docker Compose一鍵部署,核心步驟:
- 下載Harbor安裝包:Harbor官方發(fā)布頁
- 修改
harbor.yml配置文件,設(shè)置主機(jī)名、管理員密碼、HTTPS證書等 - 執(zhí)行
./install.sh腳本,自動(dòng)生成Docker Compose文件并啟動(dòng)服務(wù) - 訪問
https://主機(jī)名,登錄Harbor UI界面,創(chuàng)建項(xiàng)目、管理用戶和權(quán)限 - 配置Docker daemon信任Harbor倉庫地址,即可進(jìn)行鏡像的推送和拉取
三、精通篇:底層原理與企業(yè)級能力
核心目標(biāo):吃透Docker底層原理,掌握企業(yè)級安全加固、監(jiān)控運(yùn)維、性能調(diào)優(yōu)、CI/CD集成,具備生產(chǎn)環(huán)境Docker全生命周期管理能力
3.1 Docker底層核心原理
3.1.1 Docker整體架構(gòu)
Docker采用客戶端-服務(wù)端(C/S)架構(gòu),核心組件及調(diào)用鏈路如下:
docker run 命令 → Docker Client(客戶端) → REST API → Docker Daemon(dockerd,守護(hù)進(jìn)程) → containerd(容器生命周期管理) → runc(OCI運(yùn)行時(shí)標(biāo)準(zhǔn)實(shí)現(xiàn)) → 調(diào)用Linux內(nèi)核接口創(chuàng)建容器
- Docker Client:命令行工具,用戶與Docker交互的入口,將用戶命令發(fā)送給Docker Daemon
- Docker Daemon:宿主機(jī)后臺常駐進(jìn)程,負(fù)責(zé)接收客戶端請求,管理鏡像、容器、網(wǎng)絡(luò)、存儲等核心資源
- containerd:從Docker中剝離的容器運(yùn)行時(shí)管理組件,負(fù)責(zé)容器生命周期、鏡像傳輸、存儲管理,現(xiàn)已成為CNCF畢業(yè)項(xiàng)目,K8s也可直接使用
- runc:OCI容器運(yùn)行時(shí)標(biāo)準(zhǔn)的參考實(shí)現(xiàn),是一個(gè)輕量級工具,實(shí)際負(fù)責(zé)調(diào)用Linux內(nèi)核的Namespace和Cgroups接口,創(chuàng)建和銷毀容器,不常駐后臺,容器創(chuàng)建完成后即退出
3.1.2 容器隔離的基石:Namespace
Namespace是Linux內(nèi)核提供的資源視圖隔離機(jī)制,核心作用是讓容器內(nèi)的進(jìn)程“看不見”宿主機(jī)和其他容器的資源,營造一個(gè)獨(dú)立的操作系統(tǒng)環(huán)境,Docker默認(rèn)啟用6大核心Namespace:
| Namespace類型 | 隔離能力 | 容器場景價(jià)值 |
|---|---|---|
| PID Namespace | 隔離進(jìn)程ID,容器內(nèi)進(jìn)程PID從1開始編號,看不到宿主機(jī)和其他容器的進(jìn)程 | 容器內(nèi)擁有獨(dú)立的進(jìn)程樹,實(shí)現(xiàn)進(jìn)程隔離,避免容器內(nèi)進(jìn)程影響宿主機(jī) |
| NET Namespace | 隔離完整的網(wǎng)絡(luò)棧,包括獨(dú)立的網(wǎng)卡、IP地址、端口、路由表、iptables規(guī)則 | 每個(gè)容器擁有獨(dú)立的網(wǎng)絡(luò)環(huán)境,端口互不沖突,實(shí)現(xiàn)網(wǎng)絡(luò)層面的完全解耦 |
| MNT Namespace | 隔離文件系統(tǒng)掛載點(diǎn),容器擁有獨(dú)立的根文件系統(tǒng)視圖 | 容器內(nèi)只能看到自己的文件系統(tǒng),無法訪問宿主機(jī)的其他目錄,實(shí)現(xiàn)文件系統(tǒng)隔離 |
| UTS Namespace | 隔離主機(jī)名和域名 | 容器可以擁有自己獨(dú)立的主機(jī)名,像一臺獨(dú)立的服務(wù)器 |
| IPC Namespace | 隔離進(jìn)程間通信資源,包括信號量、消息隊(duì)列、共享內(nèi)存 | 容器內(nèi)進(jìn)程只能與同容器內(nèi)的進(jìn)程通信,無法跨容器進(jìn)行IPC通信 |
| User Namespace | 隔離用戶和用戶組ID,實(shí)現(xiàn)宿主機(jī)root用戶與容器內(nèi)非root用戶的映射 | 容器內(nèi)的root用戶僅在容器內(nèi)擁有權(quán)限,在宿主機(jī)上僅為普通用戶權(quán)限,大幅提升安全性 |
3.1.3 資源管控的核心:Cgroups
Cgroups(Control Groups)是Linux內(nèi)核提供的進(jìn)程組資源限制、調(diào)度、統(tǒng)計(jì)機(jī)制,核心解決“隔離不限制”的問題,規(guī)定一個(gè)容器能用多少系統(tǒng)資源,防止單個(gè)容器耗盡宿主機(jī)資源導(dǎo)致系統(tǒng)崩潰。
- 核心管控能力:CPU使用率、內(nèi)存使用上限、磁盤IO帶寬、進(jìn)程數(shù)量、網(wǎng)絡(luò)帶寬等
- 核心原理:當(dāng)執(zhí)行
docker run -m 512m --cpus=1 nginx時(shí),Docker會在宿主機(jī)/sys/fs/cgroup/目錄下,為該容器創(chuàng)建獨(dú)立的控制組,寫入對應(yīng)的資源限制規(guī)則,并將容器進(jìn)程加入該控制組,內(nèi)核會嚴(yán)格按照規(guī)則限制進(jìn)程的資源使用 - 生產(chǎn)環(huán)境必做:所有容器必須設(shè)置CPU和內(nèi)存資源限制,避免資源搶占,保障宿主機(jī)和其他容器的穩(wěn)定性
3.1.4 存儲驅(qū)動(dòng):Overlay2
Docker默認(rèn)使用Overlay2存儲驅(qū)動(dòng),基于Linux內(nèi)核的OverlayFS文件系統(tǒng),實(shí)現(xiàn)鏡像的分層存儲和寫時(shí)復(fù)制(CoW)機(jī)制。
- 分層存儲:Docker鏡像由多個(gè)只讀層疊加而成,每一條Dockerfile指令都會生成一個(gè)新的鏡像層,鏡像層可被多個(gè)鏡像共享,大幅減少存儲空間占用和鏡像拉取時(shí)間。
- 寫時(shí)復(fù)制(CoW):容器啟動(dòng)時(shí),會在所有只讀鏡像層之上,添加一個(gè)可寫層;容器內(nèi)所有的修改操作都只會發(fā)生在可寫層,不會修改底層的只讀鏡像層,多個(gè)容器可共享同一個(gè)基礎(chǔ)鏡像,僅維護(hù)自己的可寫層,極大提升了存儲效率。
- 容器刪除時(shí),對應(yīng)的可寫層會被一并刪除,只讀鏡像層保持不變,這也是容器內(nèi)數(shù)據(jù)不持久化的根本原因。
3.2 企業(yè)級安全加固最佳實(shí)踐
Docker容器的安全風(fēng)險(xiǎn)主要來自:默認(rèn)root權(quán)限運(yùn)行、鏡像漏洞、容器逃逸、權(quán)限過大等,以下為生產(chǎn)環(huán)境必須落地的安全加固措施。
-
最小權(quán)限原則:禁止使用root用戶運(yùn)行容器
容器默認(rèn)以root用戶運(yùn)行,一旦容器被入侵,攻擊者可利用root權(quán)限實(shí)現(xiàn)容器逃逸,控制宿主機(jī)。必須在Dockerfile中創(chuàng)建非root用戶,并指定該用戶運(yùn)行容器:# 創(chuàng)建非root用戶和用戶組 RUN addgroup -S appgroup && adduser -S appuser -G appgroup # 切換到非root用戶 USER appuser -
鏡像安全管控
- 禁止使用未經(jīng)驗(yàn)證的第三方鏡像,優(yōu)先使用官方鏡像,鎖定鏡像版本和哈希值,避免latest標(biāo)簽導(dǎo)致的版本漂移和惡意鏡像。
- 構(gòu)建鏡像時(shí)禁止內(nèi)置密鑰、憑證、配置文件,通過運(yùn)行時(shí)環(huán)境變量、配置中心、BuildKit的--secret參數(shù)傳遞敏感信息,避免敏感信息殘留到鏡像歷史中。
- 鏡像構(gòu)建完成后必須進(jìn)行安全掃描,使用Trivy、Clair等工具,掃描鏡像中的CVE漏洞、惡意代碼,僅通過掃描的鏡像才能部署到生產(chǎn)環(huán)境。
-
運(yùn)行時(shí)安全加固
- 啟用User Namespace,將容器內(nèi)的root用戶映射到宿主機(jī)的普通用戶,即使容器被突破,也無法獲得宿主機(jī)root權(quán)限。
- 限制容器的系統(tǒng)調(diào)用,使用Seccomp、AppArmor/SELinux配置安全策略,禁止容器執(zhí)行不必要的系統(tǒng)調(diào)用,減少攻擊面。
- 對無狀態(tài)應(yīng)用啟用只讀文件系統(tǒng)(
--read-only),禁止容器修改根文件系統(tǒng),僅給必要的目錄掛載寫入權(quán)限,防止惡意代碼寫入和執(zhí)行。 - 禁止容器掛載宿主機(jī)敏感目錄(/etc、/root、/proc、/dev/sock等),禁止使用--privileged特權(quán)模式,除非絕對必要,特權(quán)模式可直接突破容器隔離。
- 禁止容器使用host網(wǎng)絡(luò)模式,除非有明確的性能需求,減少網(wǎng)絡(luò)攻擊面。
-
平臺與宿主機(jī)安全
- 保持Docker版本為最新穩(wěn)定版,及時(shí)修復(fù)內(nèi)核和Docker引擎的安全漏洞。
- 宿主機(jī)最小化安裝,僅運(yùn)行必要的服務(wù),關(guān)閉不必要的端口和服務(wù)。
- 嚴(yán)格管控Docker daemon的訪問權(quán)限,禁止非授權(quán)用戶訪問Docker API,遠(yuǎn)程訪問必須啟用TLS雙向認(rèn)證。
3.3 容器監(jiān)控與日志體系
生產(chǎn)環(huán)境中,必須建立完善的監(jiān)控和日志體系,實(shí)時(shí)掌握容器運(yùn)行狀態(tài),快速定位和排查故障。
3.3.1 基礎(chǔ)監(jiān)控命令(快速排障必備)
# 1. 查看容器資源使用情況(CPU、內(nèi)存、IO、網(wǎng)絡(luò))
docker stats # 實(shí)時(shí)查看所有容器的資源占用
docker stats my-nginx # 查看指定容器的資源占用
# 2. 查看容器內(nèi)運(yùn)行的進(jìn)程
docker top my-nginx
# 3. 查看容器詳細(xì)信息,包括IP地址、掛載、環(huán)境變量、狀態(tài)等
docker inspect my-nginx
# 4. 查看容器端口映射
docker port my-nginx
# 5. 查看容器啟動(dòng)事件
docker events
3.3.2 企業(yè)級監(jiān)控方案
主流方案:Prometheus + Grafana + cAdvisor,實(shí)現(xiàn)容器指標(biāo)的采集、存儲、可視化告警,是生產(chǎn)環(huán)境的標(biāo)準(zhǔn)方案。
- cAdvisor:Google開源的容器指標(biāo)采集工具,運(yùn)行在宿主機(jī)上,實(shí)時(shí)采集所有容器的CPU、內(nèi)存、磁盤IO、網(wǎng)絡(luò)IO、文件系統(tǒng)等核心指標(biāo),暴露給Prometheus。
- Prometheus:時(shí)序數(shù)據(jù)庫,定時(shí)拉取cAdvisor暴露的指標(biāo),進(jìn)行存儲和聚合計(jì)算,支持配置告警規(guī)則。
- Grafana:可視化面板,對接Prometheus數(shù)據(jù)源,通過開箱即用的Docker監(jiān)控大盤,實(shí)現(xiàn)容器指標(biāo)的可視化展示、趨勢分析、告警通知。
核心部署方式:通過Docker Compose一鍵部署整套監(jiān)控系統(tǒng),配置好Prometheus采集規(guī)則和Grafana大盤,即可實(shí)現(xiàn)全容器監(jiān)控。
3.3.3 容器日志管理
-
日志配置最佳實(shí)踐
- 容器應(yīng)用必須將日志輸出到標(biāo)準(zhǔn)輸出stdout和標(biāo)準(zhǔn)錯(cuò)誤stderr,禁止將日志寫入容器內(nèi)的文件,避免日志文件占用容器存儲空間,導(dǎo)致磁盤占滿。
- 配置Docker日志輪轉(zhuǎn),限制單個(gè)日志文件大小和數(shù)量,防止日志無限增長耗盡宿主機(jī)磁盤空間,前面daemon.json配置中已包含該配置。
-
企業(yè)級日志收集方案
主流方案:ELK/EFK棧,實(shí)現(xiàn)容器日志的集中收集、存儲、檢索、分析。- Filebeat/Fluentd:日志采集器,部署在宿主機(jī)上,采集容器的標(biāo)準(zhǔn)輸出日志,發(fā)送到Elasticsearch。
- Elasticsearch:分布式搜索引擎,存儲和索引日志數(shù)據(jù)。
- Kibana:日志可視化平臺,實(shí)現(xiàn)日志的檢索、篩選、可視化分析、告警。
3.4 Docker性能調(diào)優(yōu)核心技巧
3.4.1 鏡像與構(gòu)建優(yōu)化
- 極致精簡鏡像體積,使用多階段構(gòu)建、alpine基礎(chǔ)鏡像,剔除無用文件,減少鏡像拉取時(shí)間和存儲占用,降低攻擊面。
- 優(yōu)化Dockerfile鏡像層,利用Docker構(gòu)建緩存,將不變的指令(依賴安裝)放在前面,頻繁變化的指令(代碼復(fù)制)放在后面,大幅提升構(gòu)建速度。
3.4.2 存儲性能優(yōu)化
- 生產(chǎn)環(huán)境必須使用overlay2存儲驅(qū)動(dòng),搭配xfs文件系統(tǒng),開啟pquota掛載選項(xiàng),支持容器級磁盤配額限制。
- Docker數(shù)據(jù)目錄(/var/lib/docker)必須使用SSD/NVMe磁盤,大幅提升鏡像拉取、容器啟動(dòng)、IO讀寫性能。
- IO密集型應(yīng)用(數(shù)據(jù)庫、消息隊(duì)列、ELK),必須通過數(shù)據(jù)卷掛載宿主機(jī)目錄,直接寫入宿主機(jī)文件系統(tǒng),完全繞過overlay2可寫層,避免CoW機(jī)制帶來的性能損耗。
- 臨時(shí)文件、緩存數(shù)據(jù)使用tmpfs掛載內(nèi)存文件系統(tǒng),完全不寫入磁盤,極致提升IO性能,同時(shí)避免臨時(shí)數(shù)據(jù)泄露。
3.4.3 網(wǎng)絡(luò)性能優(yōu)化
- 高并發(fā)場景優(yōu)先使用host網(wǎng)絡(luò)模式,消除橋接網(wǎng)絡(luò)的轉(zhuǎn)發(fā)和NAT損耗,網(wǎng)絡(luò)性能可接近宿主機(jī)原生水平。
- 自定義橋接網(wǎng)絡(luò)優(yōu)化內(nèi)核參數(shù),通過--sysctl參數(shù)給容器設(shè)置獨(dú)立的TCP內(nèi)核參數(shù)(tcp_tw_reuse、tcp_max_syn_backlog等),優(yōu)化高并發(fā)場景下的網(wǎng)絡(luò)性能。
- 避免頻繁的端口映射和大量的iptables規(guī)則,減少網(wǎng)絡(luò)轉(zhuǎn)發(fā)開銷。
3.4.4 資源調(diào)度優(yōu)化
- 所有容器必須設(shè)置合理的CPU和內(nèi)存資源限制(requests和limits),避免資源搶占和OOM(內(nèi)存溢出)。
- 對于CPU密集型應(yīng)用,綁定CPU核心,減少CPU上下文切換,提升性能:
docker run --cpuset-cpus="0,1" my-app。 - 合理設(shè)置容器的OOM評分,避免核心業(yè)務(wù)容器被宿主機(jī)OOM killer優(yōu)先殺死。
3.5 CI/CD與云原生集成
Docker是CI/CD和云原生架構(gòu)的核心基石,通過Docker可實(shí)現(xiàn)“代碼提交→自動(dòng)構(gòu)建→自動(dòng)測試→鏡像推送→自動(dòng)部署”的全流程自動(dòng)化,徹底打通開發(fā)、測試、生產(chǎn)環(huán)境的一致性。
3.5.1 典型CI/CD流水線(GitHub Actions示例)
核心流程:
- 開發(fā)者提交代碼到GitHub倉庫
- 觸發(fā)GitHub Actions流水線,拉取代碼
- 執(zhí)行單元測試、代碼掃描
- 通過Dockerfile構(gòu)建應(yīng)用鏡像
- 鏡像安全掃描,通過后推送到私有鏡像倉庫
- 自動(dòng)部署到測試/生產(chǎn)環(huán)境的Docker主機(jī)或K8s集群
示例流水線配置文件.github/workflows/ci-cd.yml
name: Docker CI/CD Pipeline
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 拉取代碼
- name: Checkout code
uses: actions/checkout@v4
# 登錄私有鏡像倉庫
- name: Login to Docker Registry
uses: docker/login-action@v3
with:
registry: ${{ secrets.REGISTRY_URL }}
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
# 構(gòu)建并推送鏡像
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ secrets.REGISTRY_URL }}/my-app:${{ github.sha }}
# 自動(dòng)部署到生產(chǎn)服務(wù)器
- name: Deploy to production
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
docker pull ${{ secrets.REGISTRY_URL }}/my-app:${{ github.sha }}
docker stop my-app || true
docker rm my-app || true
docker run -d --name my-app -p 80:80 --restart=always ${{ secrets.REGISTRY_URL }}/my-app:${{ github.sha }}
3.5.2 云原生進(jìn)階:Docker與K8s的關(guān)系
- Docker是容器運(yùn)行時(shí),解決單個(gè)容器的構(gòu)建、運(yùn)行、管理問題;Kubernetes(K8s)是容器編排平臺,解決大規(guī)模集群環(huán)境下多容器的調(diào)度、服務(wù)發(fā)現(xiàn)、自動(dòng)擴(kuò)縮容、故障自愈、滾動(dòng)更新等問題。
- 隨著容器技術(shù)的發(fā)展,K8s已廢棄Docker作為容器運(yùn)行時(shí),轉(zhuǎn)而使用符合CRI標(biāo)準(zhǔn)的containerd,但Docker構(gòu)建的鏡像完全符合OCI標(biāo)準(zhǔn),可無縫在K8s集群中運(yùn)行。
- 精通Docker是學(xué)習(xí)K8s的前提,掌握Docker核心能力后,可平滑過渡到K8s學(xué)習(xí),進(jìn)入云原生領(lǐng)域。
四、企業(yè)級實(shí)戰(zhàn)篇:落地場景全覆蓋
- 前后端分離項(xiàng)目容器化實(shí)戰(zhàn):Vue前端+SpringBoot后端+MySQL數(shù)據(jù)庫,通過Docker Compose實(shí)現(xiàn)一鍵部署,包含多階段構(gòu)建、環(huán)境隔離、配置管理、日志持久化全流程。
- 微服務(wù)項(xiàng)目容器化部署:SpringCloud/Dubbo微服務(wù)體系,每個(gè)服務(wù)獨(dú)立構(gòu)建鏡像,通過Docker Compose實(shí)現(xiàn)本地開發(fā)環(huán)境一鍵啟動(dòng),通過K8s實(shí)現(xiàn)生產(chǎn)環(huán)境集群部署。
- AI應(yīng)用容器化部署:Stable Diffusion、LLM大模型等AI應(yīng)用,通過Docker封裝復(fù)雜的依賴環(huán)境,實(shí)現(xiàn)一鍵啟動(dòng),解決環(huán)境配置繁瑣的問題。
- 容器化故障排查全流程實(shí)戰(zhàn):覆蓋容器啟動(dòng)失敗、網(wǎng)絡(luò)不通、數(shù)據(jù)丟失、性能瓶頸、OOM崩潰、日志異常等高頻故障,提供標(biāo)準(zhǔn)化的排查思路和解決方案。
- Docker高可用集群部署:基于Docker Swarm實(shí)現(xiàn)Docker集群的高可用,實(shí)現(xiàn)服務(wù)的多副本部署、故障自愈、滾動(dòng)更新,適合中小型集群場景,比K8s更輕量、更易上手。
五、高頻避坑指南
- latest標(biāo)簽的坑:使用latest標(biāo)簽會導(dǎo)致鏡像版本漂移,每次構(gòu)建/拉取都可能獲取到最新版本,引發(fā)兼容性問題,生產(chǎn)環(huán)境必須鎖定鏡像版本,甚至鏡像哈希值。
- 數(shù)據(jù)丟失的坑:未掛載數(shù)據(jù)卷,容器刪除后數(shù)據(jù)全部丟失,所有需要持久化的數(shù)據(jù)必須通過Volume掛載,禁止在容器可寫層存儲重要數(shù)據(jù)。
- 資源耗盡的坑:未給容器設(shè)置資源限制,單個(gè)容器耗盡宿主機(jī)CPU/內(nèi)存,導(dǎo)致宿主機(jī)和其他容器崩潰,生產(chǎn)環(huán)境所有容器必須設(shè)置CPU和內(nèi)存limits。
-
容器時(shí)區(qū)不一致的坑:容器內(nèi)默認(rèn)UTC時(shí)區(qū),與宿主機(jī)CST時(shí)區(qū)相差8小時(shí),導(dǎo)致日志、業(yè)務(wù)時(shí)間異常,啟動(dòng)容器時(shí)需掛載宿主機(jī)時(shí)區(qū)文件:
-v /etc/localtime:/etc/localtime:ro。 - 日志磁盤占滿的坑:未配置日志輪轉(zhuǎn),容器日志文件無限增長,耗盡宿主機(jī)磁盤空間,必須在daemon.json中配置日志大小和數(shù)量限制,生產(chǎn)環(huán)境必須集中收集日志。
- 容器逃逸的安全坑:使用--privileged特權(quán)模式、掛載宿主機(jī)敏感目錄、以root用戶運(yùn)行容器,導(dǎo)致容器被入侵后攻擊者可控制宿主機(jī),必須嚴(yán)格遵循安全加固最佳實(shí)踐。
- 鏡像體積過大的坑:未使用多階段構(gòu)建,將編譯環(huán)境、源碼、依賴緩存都打包到鏡像中,導(dǎo)致鏡像體積高達(dá)幾個(gè)G,拉取和部署速度極慢,鏡像優(yōu)化是生產(chǎn)環(huán)境必備技能。
六、學(xué)習(xí)資源與進(jìn)階路線
核心學(xué)習(xí)資源
- 官方文檔:Docker官方文檔,最權(quán)威、最新的學(xué)習(xí)資料,所有知識點(diǎn)的源頭。
- 推薦書籍:《Docker實(shí)戰(zhàn)》《Docker容器與容器云》《Docker進(jìn)階與實(shí)戰(zhàn)》。
- 開源項(xiàng)目:GitHub上的awesome-docker項(xiàng)目,包含大量Docker優(yōu)秀工具、實(shí)戰(zhàn)案例、最佳實(shí)踐。
- 社區(qū):Docker官方社區(qū)、Stack Overflow、掘金、InfoQ等平臺,可解決日常遇到的問題,學(xué)習(xí)行業(yè)最佳實(shí)踐。
進(jìn)階學(xué)習(xí)路線
- 吃透本指南所有知識點(diǎn),完成所有實(shí)戰(zhàn)案例,熟練掌握Docker核心命令、Dockerfile編寫、Docker Compose編排。
- 深入學(xué)習(xí)Linux內(nèi)核相關(guān)知識,Namespace、Cgroups、OverlayFS、網(wǎng)絡(luò)協(xié)議棧,徹底吃透容器底層原理。
- 學(xué)習(xí)Shell腳本編寫、Linux運(yùn)維知識,提升容器化部署和故障排查能力。
- 學(xué)習(xí)企業(yè)級監(jiān)控、日志體系,掌握Prometheus、Grafana、ELK等工具的使用。
- 學(xué)習(xí)CI/CD相關(guān)知識,掌握GitLab CI、GitHub Actions、Jenkins等流水線工具,實(shí)現(xiàn)容器化應(yīng)用的自動(dòng)化部署。
- 進(jìn)階學(xué)習(xí)Kubernetes,掌握云原生容器編排技術(shù),進(jìn)入大規(guī)模集群管理、微服務(wù)架構(gòu)、云原生開發(fā)領(lǐng)域。