全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-21 5 分钟 ✍️ juanwangdev

最小化镜像原则

减小镜像体积和攻击面是安全最佳实践,下面介绍最小化方法。

选择精简基础镜像

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 临时目录,增强安全
  • 生产镜像移除调试工具,减小攻击面

📝 发现内容有误?点击此处直接编辑

← 上一篇 安全扫描与漏洞检测
下一篇 → 非 root 用户运行
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库