Docker 從入門到精通全體系學(xué)習(xí)指南

本指南遵循零基礎(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)境)

  1. 直接下載 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)安裝包

  2. 安裝完成后啟動(dòng)Docker Desktop,在設(shè)置中可直接切換中文、配置鏡像加速、開啟WSL集成
  3. 打開終端執(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ī)瀏覽器訪問

  1. 創(chuàng)建本地網(wǎng)頁目錄和文件
    mkdir -p ~/docker-nginx/html && cd ~/docker-nginx/html
    echo "<h1>Hello Docker! 我的第一個(gè)容器化應(yīng)用</h1>" > index.html
    
  2. 啟動(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
    
  3. 驗(yàn)證效果:瀏覽器訪問http://宿主機(jī)IP:8080,即可看到自定義的網(wǎng)頁內(nèi)容
  4. 常用調(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)用鏡像

  1. 項(xiàng)目目錄結(jié)構(gòu)
    flask-demo/
    ├── Dockerfile
    ├── requirements.txt
    └── app.py
    
  2. 編寫應(yīng)用代碼app.py
    from 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)
    
  3. 編寫依賴文件requirements.txt
    Flask==2.3.3
    
  4. 編寫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"]
    
  5. 構(gòu)建鏡像
    # -t 指定鏡像名稱和標(biāo)簽,. 表示Dockerfile所在的當(dāng)前目錄
    docker build -t flask-demo:v1.0.0 .
    
  6. 啟動(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)化核心技巧

  1. 多階段構(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"]
    
  2. 基礎(chǔ)鏡像選擇:優(yōu)先使用alpine(5M左右)、slim系列鏡像,避免使用ubuntu/centos等完整系統(tǒng)鏡像,減少鏡像體積和攻擊面。

  3. 優(yōu)化鏡像層:合并多條RUN指令,用&&連接,減少鏡像層數(shù)量;執(zhí)行完安裝命令后立即清理緩存(apt clean && rm -rf /var/lib/apt/lists/*、yum clean all)。

  4. 使用 .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í)踐

  1. 數(shù)據(jù)庫、消息隊(duì)列等IO密集型應(yīng)用,必須使用Volume掛載數(shù)據(jù)目錄,繞過overlay2可寫層,IO性能提升50%以上。
  2. 配置文件使用Bind Mount只讀掛載(添加:ro后綴),避免容器內(nèi)修改配置,提升安全性:docker run -v /local/nginx.conf:/etc/nginx/nginx.conf:ro nginx。
  3. 禁止在容器內(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í)踐

  1. 生產(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
    
  2. 僅對外暴露必要的端口,禁止將容器所有端口映射到宿主機(jī),減少攻擊面。
  3. 高并發(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)

  1. 創(chuàng)建項(xiàng)目目錄
    mkdir -p ~/lnmp-docker && cd ~/lnmp-docker
    # 創(chuàng)建子目錄
    mkdir -p nginx/conf html mysql/data php/conf
    
  2. 編寫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:
    
  3. 編寫Nginx配置文件nginx/conf/default.conf
    server {
        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;
        }
    }
    
  4. 編寫PHP測試文件html/index.php
    <?php
    phpinfo();
    ?>
    
  5. 一鍵啟動(dòng)所有服務(wù)
    # 后臺啟動(dòng)所有服務(wù)
    docker compose up -d
    # 查看服務(wù)運(yùn)行狀態(tài)
    docker compose ps
    
  6. 驗(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)限管理。主流方案分為兩種:

  1. Docker Registry:Docker官方輕量級倉庫,無UI界面,適合簡單場景、測試環(huán)境
  2. 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一鍵部署,核心步驟:

  1. 下載Harbor安裝包:Harbor官方發(fā)布頁
  2. 修改harbor.yml配置文件,設(shè)置主機(jī)名、管理員密碼、HTTPS證書等
  3. 執(zhí)行./install.sh腳本,自動(dòng)生成Docker Compose文件并啟動(dòng)服務(wù)
  4. 訪問https://主機(jī)名,登錄Harbor UI界面,創(chuàng)建項(xiàng)目、管理用戶和權(quán)限
  5. 配置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)境必須落地的安全加固措施。

  1. 最小權(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
    
  2. 鏡像安全管控

    • 禁止使用未經(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)境。
  3. 運(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ò)攻擊面。
  4. 平臺與宿主機(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 容器日志管理

  1. 日志配置最佳實(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配置中已包含該配置。
  2. 企業(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示例)

核心流程:

  1. 開發(fā)者提交代碼到GitHub倉庫
  2. 觸發(fā)GitHub Actions流水線,拉取代碼
  3. 執(zhí)行單元測試、代碼掃描
  4. 通過Dockerfile構(gòu)建應(yīng)用鏡像
  5. 鏡像安全掃描,通過后推送到私有鏡像倉庫
  6. 自動(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)篇:落地場景全覆蓋

  1. 前后端分離項(xiàng)目容器化實(shí)戰(zhàn):Vue前端+SpringBoot后端+MySQL數(shù)據(jù)庫,通過Docker Compose實(shí)現(xiàn)一鍵部署,包含多階段構(gòu)建、環(huán)境隔離、配置管理、日志持久化全流程。
  2. 微服務(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)境集群部署。
  3. AI應(yīng)用容器化部署:Stable Diffusion、LLM大模型等AI應(yīng)用,通過Docker封裝復(fù)雜的依賴環(huán)境,實(shí)現(xiàn)一鍵啟動(dòng),解決環(huán)境配置繁瑣的問題。
  4. 容器化故障排查全流程實(shí)戰(zhàn):覆蓋容器啟動(dòng)失敗、網(wǎng)絡(luò)不通、數(shù)據(jù)丟失、性能瓶頸、OOM崩潰、日志異常等高頻故障,提供標(biāo)準(zhǔn)化的排查思路和解決方案。
  5. Docker高可用集群部署:基于Docker Swarm實(shí)現(xiàn)Docker集群的高可用,實(shí)現(xiàn)服務(wù)的多副本部署、故障自愈、滾動(dòng)更新,適合中小型集群場景,比K8s更輕量、更易上手。

五、高頻避坑指南

  1. latest標(biāo)簽的坑:使用latest標(biāo)簽會導(dǎo)致鏡像版本漂移,每次構(gòu)建/拉取都可能獲取到最新版本,引發(fā)兼容性問題,生產(chǎn)環(huán)境必須鎖定鏡像版本,甚至鏡像哈希值。
  2. 數(shù)據(jù)丟失的坑:未掛載數(shù)據(jù)卷,容器刪除后數(shù)據(jù)全部丟失,所有需要持久化的數(shù)據(jù)必須通過Volume掛載,禁止在容器可寫層存儲重要數(shù)據(jù)。
  3. 資源耗盡的坑:未給容器設(shè)置資源限制,單個(gè)容器耗盡宿主機(jī)CPU/內(nèi)存,導(dǎo)致宿主機(jī)和其他容器崩潰,生產(chǎn)環(huán)境所有容器必須設(shè)置CPU和內(nèi)存limits。
  4. 容器時(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。
  5. 日志磁盤占滿的坑:未配置日志輪轉(zhuǎn),容器日志文件無限增長,耗盡宿主機(jī)磁盤空間,必須在daemon.json中配置日志大小和數(shù)量限制,生產(chǎn)環(huán)境必須集中收集日志。
  6. 容器逃逸的安全坑:使用--privileged特權(quán)模式、掛載宿主機(jī)敏感目錄、以root用戶運(yùn)行容器,導(dǎo)致容器被入侵后攻擊者可控制宿主機(jī),必須嚴(yán)格遵循安全加固最佳實(shí)踐。
  7. 鏡像體積過大的坑:未使用多階段構(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í)路線

  1. 吃透本指南所有知識點(diǎn),完成所有實(shí)戰(zhàn)案例,熟練掌握Docker核心命令、Dockerfile編寫、Docker Compose編排。
  2. 深入學(xué)習(xí)Linux內(nèi)核相關(guān)知識,Namespace、Cgroups、OverlayFS、網(wǎng)絡(luò)協(xié)議棧,徹底吃透容器底層原理。
  3. 學(xué)習(xí)Shell腳本編寫、Linux運(yùn)維知識,提升容器化部署和故障排查能力。
  4. 學(xué)習(xí)企業(yè)級監(jiān)控、日志體系,掌握Prometheus、Grafana、ELK等工具的使用。
  5. 學(xué)習(xí)CI/CD相關(guān)知識,掌握GitLab CI、GitHub Actions、Jenkins等流水線工具,實(shí)現(xiàn)容器化應(yīng)用的自動(dòng)化部署。
  6. 進(jìn)階學(xué)習(xí)Kubernetes,掌握云原生容器編排技術(shù),進(jìn)入大規(guī)模集群管理、微服務(wù)架構(gòu)、云原生開發(fā)領(lǐng)域。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容