镜像构建
Docker构建镜像时,如果某一层没有变化,就会复用缓存,跳过该层的执行。理解缓存机制,可以让构建从分钟级降到秒级。
# 缓存失效示例
FROM node:20-alpine ✅ 缓存命中
WORKDIR /app ✅ 缓存命中
COPY package*.json ./ ✅ 缓存命中(package.json没变)
RUN npm ci ✅ 缓存命中(上一层命中+命令不变)
COPY . . ❌ 缓存失效(源码变了!)
RUN npm run build ❌ 缓存失效(上一层失效,全链重建)
# ❌ 糟糕的顺序——每次改代码都重新装依赖
COPY . .
RUN npm install
RUN npm run build
# ✅ 优化顺序——代码变了也不用重新装依赖 ✅
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
# 强制不用缓存(完全重建)✅
docker build --no-cache -t my-app .
# 指定某层不用缓存
# 在Dockerfile中插入无效化注释
RUN echo "cache-bust-2024-01-15" && apt-get update
# BuildKit缓存挂载(推荐)✅
# syntax=docker/dockerfile:1
RUN --mount=type=cache,target=/root/.npm \
npm ci
# pip缓存挂载 ✅
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements.txt
# apt缓存挂载
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && apt-get install -y curl
# 使用远程缓存 ✅
docker buildx build \
--cache-from type=registry,ref=myregistry.com/myapp:cache \
--cache-to type=registry,ref=myregistry.com/myapp:cache,mode=max \
-t my-app:v1.0 .
# 使用本地目录缓存
docker buildx build \
--cache-from type=local,src=/tmp/docker-cache \
--cache-to type=local,dest=/tmp/docker-cache,mode=max \
-t my-app:v1.0 .
# GHA缓存集成
docker buildx build \
--cache-from type=gha \
--cache-to type=gha,mode=max \
-t my-app:v1.0 .
# 第一次构建 ✅
docker build -t cache-test .
# 每层都执行,总耗时约2分钟
# 不改任何文件,第二次构建
docker build -t cache-test .
# 全部使用缓存 → CACHED,耗时约1秒!
# 只改src/index.js,第三次构建
docker build -t cache-test .
# COPY package*.json之前的层: CACHED
# COPY . . 及之后: 重新执行
# npm ci 被跳过(package.json没变)→ 节省大量时间
❓ RUN命令没变但缓存还是失效了?因为前面的层失效了。缓存是链式的——前面任何一层失效,后续所有层都失效。检查
docker build输出,找到第一个miss的层。❓ --mount=type=cache需要BuildKit吗?是的。需要Docker 18.09+和BuildKit。在Dockerfile首行添加
# syntax=docker/dockerfile:1,或设置DOCKER_BUILDKIT=1环境变量。Docker 23.0+默认启用BuildKit。❓ 缓存挂载会不会导致构建不可复现?有可能。缓存挂载可能在不同构建间产生不同结果(如依赖版本变化)。如果需要严格可复现,使用
lockfile(package-lock.json等)并定期--no-cache全量重建验证。| 要点 | 说明 | 最佳实践 |
|---|---|---|
| 资源规划 | 根据业务负载合理分配CPU/内存 | 先压测再上线,设置requests和limits |
| 监控告警 | 设置关键指标阈值和告警规则 | Prometheus + AlertManager,5分钟P99延迟告警 |
| 备份策略 | 定期备份关键数据和配置 | 自动化备份脚本 + 异地存储 + 定期恢复演练 |
| 灰度发布 | 新版本逐步放量降低风险 | 金丝雀发布5%→20%→50%→100% |
| 回滚预案 | 部署前确认回滚方案和步骤 | 保留前一版本镜像,数据库迁移向前兼容 |
| 文档更新 | 配置变更必须同步更新文档 | GitOps管理配置,变更即文档 |
| 安全基线 | 遵循CIS Docker Benchmark | 非root运行、只读FS、最小能力 |
| 日志规范 | 结构化日志,统一格式 | JSON格式日志,包含traceId |
# 容器生命周期
docker create/start/stop/restart/rm/pause/unpause
docker logs/top/stats/inspect/exec diff
# 镜像构建
docker build/pull/push/tag/rmi/images/history
docker save/load/import/manifest
# 网络与存储
docker network create/ls/inspect/connect/disconnect/rm/prune
docker volume create/ls/inspect/rm/prune
# Docker Compose
docker compose up/down/ps/logs/build/exec
docker compose config/stop/start/scale/top/cp
# 系统维护
docker system df/prune/info
docker builder prune
docker container/prune/image prune
# K8s常用命令
kubectl get/describe/logs/exec/apply/delete
kubectl rollout status/undo/history
kubectl scale/autoscale/set
| 标准 | 内容 | 作用 |
|---|---|---|
| OCI Image Spec | 镜像格式规范 | 镜像可跨运行时使用 |
| OCI Runtime Spec | 容器运行时规范 | runc/crun/kata等兼容 |
| OCI Distribution Spec | 镜像分发规范 | Registry API标准化 |
# Step 1: 检查容器状态
docker ps -a # 查看所有容器
docker inspect <container> # 查看详细配置
# Step 2: 查看日志
docker logs --tail 100 <container> # 最近100行日志
docker logs --since 1h <container> # 最近1小时
# Step 3: 进入容器排查
docker exec -it <container> sh # 进入容器shell
# Step 4: 检查资源
docker stats --no-stream # 资源使用概览
docker system df # 磁盘使用
# Step 5: 网络排查
docker network ls # 网络列表
docker exec <c> ping <target> # 网络连通性
docker exec <c> nslookup <svc> # DNS解析
# Step 6: 检查健康状态
docker inspect --format '{{.State.Health}}' <c>
docker inspect --format '{{.State.ExitCode}}' <c>
docker inspect --format '{{.State.OOMKilled}}' <c>
# 通用最佳实践模板
FROM alpine:3.19 AS builder
# ... 构建步骤 ...
FROM alpine:3.19
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --from=builder /app/output .
USER appuser
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD wget -qO- http://localhost:8080/health || exit 1
EXPOSE 8080
CMD ["./app"]
services:
app:
build: .
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
restart: unless-stopped
deploy:
resources:
limits:
cpus: '1'
memory: 512M