镜像构建
容器镜像可能包含已知漏洞(CVE)。安全扫描是CI/CD中不可或缺的环节,在部署前发现并修复漏洞。
# 安装Trivy ✅
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh
# 扫描镜像漏洞 ✅
trivy image nginx:1.25-alpine
nginx:1.25-alpine (alpine 3.19.0)
============================
Total: 2 (UNKNOWN: 0, LOW: 1, MEDIUM: 1, HIGH: 0, CRITICAL: 0)
┌──────────────┬───────────┬──────────┬───────────────────┐
│ Library │ Vulnerability │ Severity │ Installed Version │
├──────────────┼───────────┼──────────┼───────────────────┤
│ libcrypto3 │ CVE-2024-xxxx│ Medium │ 3.1.4-r1 │
│ libssl3 │ CVE-2024-xxxx│ Low │ 3.1.4-r1 │
└──────────────┴───────────┴──────────┴───────────────────┘
# 只显示严重和高级漏洞
trivy image --severity HIGH,CRITICAL nginx:1.25-alpine
# JSON格式输出
trivy image --format json -o report.json nginx:1.25-alpine
# SARIF格式(GitHub集成)
trivy image --format sarif -o trivy.sarif nginx:1.25-alpine
# Docker Scout扫描 ✅
docker scout cves nginx:1.25-alpine
# 快速概览
docker scout quickview nginx:1.25-alpine
# 比较两个版本
docker scout compare --to nginx:1.26-alpine nginx:1.25-alpine
# 推荐基础镜像
docker scout recommendations nginx:1.25
# GitHub Actions集成 ✅
# .github/workflows/security-scan.yml
name: Security Scan
on: [push, pull_request]
jobs:
trivy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build image
run: docker build -t my-app:${{ github.sha }} .
- name: Run Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: 'my-app:${{ github.sha }}'
severity: 'CRITICAL,HIGH'
exit-code: '1' # 发现高危漏洞则CI失败
# GitLab CI集成
trivy_scan:
stage: security
image: aquasec/trivy:latest
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
allow_failure: false
# Dockerfile安全实践 ✅
# 1. 使用非root用户
RUN adduser -D appuser
USER appuser
# 2. 不安装不必要的包
RUN apk add --no-cache curl # 不缓存索引
# 3. 使用COPY而非ADD
COPY app /app/ # ADD有自动解压和URL风险
# 4. 固定基础镜像版本
FROM node:20.11.0-alpine3.19 # 不用latest或20-alpine
# 5. 验证下载文件完整性
RUN curl -sL https://example.com/app.tar.gz | sha256sum -c -
# 6. 使用多阶段构建去除构建工具 ✅
# 7. 扫描后再推送到生产仓库
# 生成SBOM ✅
trivy image --format spdx-json -o sbom.json my-app:latest
# Docker SBOM命令
docker sbom my-app:latest
# 从SBOM扫描漏洞
trivy sbom sbom.json
❓ 扫描出大量漏洞怎么办?分级处理:①CRITICAL/HIGH:立即修复,升级基础镜像或依赖 ②MEDIUM:安排修复 ③LOW/INFO:可接受风险。使用
--severity过滤优先级。记住:不是所有CVE都在你的使用场景下可利用。| 要点 | 说明 | 最佳实践 |
|---|---|---|
| 资源规划 | 根据业务负载合理分配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