镜像安全
约 614 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › Docker › 最佳实践(在新窗口打开) › 镜像安全
使用官方镜像
# ✅ 使用官方镜像
FROM node:20-alpine
FROM nginx:alpine
FROM python:3.12-slim
# ❌ 使用不明来源的镜像
FROM someuser/my-custom-ubuntu:latest- 官方镜像经过安全审核,定期修复 CVE。
- Docker Hub 的官方镜像带有
Docker Official Image标签。 - 使用
slim/alpine精简版减少攻击面。
非 root 用户运行
FROM node:20-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY . .
USER appuser
EXPOSE 3000
CMD ["node", "server.js"]容器默认以 root 运行——如果攻击者通过应用漏洞进入容器,可以获得 root 权限。非 root 用户是最基础的安全措施。
最小基础镜像
# ❌ 大镜像,包含大量不必要的工具
FROM node:20
# ✅ 只包含运行所需的最小依赖
FROM node:20-alpine基础镜像越小,攻击面越小。
镜像安全扫描
# Trivy(推荐,开源)
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image nginx:alpine
# Docker Scout(Docker Desktop 内置)
docker scout quickview nginx:alpine
docker scout cves nginx:alpine
# 在 CI 中检查严重 CVE
docker scout cves --only-severity critical,high nginx:alpine# GitHub Actions 示例
- name: Scan image
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:latest'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'Capability 降权
# 丢弃所有 Capability,只添加需要的
docker run -d \
--cap-drop ALL \
--cap-add NET_BIND_SERVICE \
nginx:alpine- Docker 默认赋予容器一系列 Linux Capability。
--cap-drop ALL丢弃所有,再--cap-add按需添加。- 这是"最小权限"原则在容器安全中的体现。
其他安全措施
# 不要将敏感信息写入镜像层
# ❌ 错误:密码被写入不可变镜像层
RUN echo "password=secret" > /app/config.properties
# ✅ 正确:通过环境变量传入
ENV DB_PASSWORD=${DB_PASSWORD}# 使用只读根文件系统
# docker run --read-only --tmpfs /tmp --tmpfs /var/run myapp
# 禁止容器提升权限
# docker run --security-opt no-new-privileges:true myapp
# 限制系统调用
# docker run --security-opt seccomp=/path/to/seccomp/profile.json myapp.dockerignore 排除敏感文件
.env
*.key
*.pem
credentials.json
config/production.yml确保
.env、私钥文件不被意外打包进镜像。
小结
- 始终使用官方基础镜像 + 最小版本(
alpine/slim)。 - Dockerfile 中用
USER切换到非 root 用户。 - 使用 Trivy / Docker Scout 定期扫描镜像 CVE。
--cap-drop ALL --cap-add NEEDED按最小权限原则。- 敏感信息走环境变量/Secret 机制,不写入镜像层。
.dockerignore排除敏感文件和密钥。
