最小化镜像原则
减小镜像体积和攻击面是安全最佳实践,下面介绍最小化方法。
选择精简基础镜像
Alpine
dockerfile
# Alpine(~5MB)
FROM alpine:3.18
# Alpine + Node.js(~45MB)
FROM node:18-alpine
# 特点:
# - 体积小
# - 包少,攻击面小
# - 使用 musl libc(非 glibc)
Distroless
dockerfile
# Distroless(~20MB)
FROM gcr.io/distroless/nodejs18
# 仅包含运行时,无 shell、包管理器
# 特点:
# - 极小的攻击面
# - 无 shell,无法 exec 进入
# - 适合生产环境
对比
| 基础镜像 | 大小 | 包数量 | Shell | 推荐场景 |
|---|---|---|---|---|
| ubuntu | ~77MB | 多 | ✅ | 开发/调试 |
| debian-slim | ~30MB | 中 | ✅ | 通用 |
| alpine | ~5MB | 少 | ✅ | 生产 |
| distroless | ~20MB | 极少 | ❌ | 高安全 |
删除无用包
dockerfile
# 安装后清理
FROM ubuntu:22.04
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
ca-certificates && \
rm -rf /var/lib/apt/lists/* && \
apt-get clean
--no-install-recommends不安装推荐包,rm -rf /var/lib/apt/lists/*清理缓存。
多阶段构建
dockerfile
# 构建阶段
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /app
COPY . .
RUN mvn package -DskipTests
# 运行阶段(精简)
FROM eclipse-temurin:17-jre-alpine
COPY --from=builder /app/target/app.jar .
CMD ["java", "-jar", "app.jar"]
只读文件系统
Bash
# 运行只读容器
docker run -d \
--read-only \
--tmpfs /tmp \
--tmpfs /var/run \
my-app
# 容器内文件系统只读,仅 tmpfs 可写
移除调试工具
dockerfile
# 生产镜像不包含
# - vim/nano
# - curl/wget(除非需要)
# - ping/traceroute
# - ssh
扫描验证
Bash
# 扫描最小化前后
trivy image ubuntu:22.04
# 漏洞: 50+
trivy image alpine:3.18
# 漏洞: 0-5
要点总结
- Alpine 和 distroless 是精简基础镜像,体积小攻击面小
- 安装后清理包缓存,使用
--no-install-recommends - 多阶段构建仅包含运行时依赖,丢弃编译工具
- 只读文件系统 + tmpfs 临时目录,增强安全
- 生产镜像移除调试工具,减小攻击面
📝 发现内容有误?点击此处直接编辑