用途
该技能面向生产环境的容器与 Docker 工作负载,提供构建高效、安全、可维护容器的策略与操作规范。当用户提出优化 Docker、Docker 最佳实践、容器安全、镜像体积等需求时适用。
主要能力
Dockerfile 最佳实践
- 层排序:按从最不常变到最常变的顺序排列指令,系统依赖在前,应用依赖其次,源码最后。Docker 自上而下缓存层,变更层以下全部失效。
- 多阶段构建:将构建时依赖与运行时分离,仅复制所需产物。对静态链接二进制(Go、Rust)可使用 scratch 或 gcr.io/distroless/static-debian12 作为最终阶段,镜像约 2MB。
- .dockerignore:减小构建上下文并防止密钥泄漏进镜像。
- 基础镜像选择:node:20 约 350MB(生产避免)、node:20-slim 约 200MB(良好默认)、node:20-alpine 约 50MB(多数应用最佳)、distroless 约 2-20MB(最高安全性)。
- 版本固定:生产环境绝不使用 latest,固定到补丁版本或使用 digest 实现完全可复现。
安全加固
- 非 root 用户:Alpine 与 Debian 分别提供创建用户命令,配合 COPY --chown 与 USER 使用。
- 只读文件系统:通过 --read-only、--tmpfs 与卷挂载实现。
- 镜像中不含密钥:Dockerfile 指令中的密钥会持久化在层历史中,应使用 BuildKit secrets 或运行时注入。
- 镜像扫描:trivy、grype、docker scout cves 等工具。
- 能力丢弃:--cap-drop=ALL --cap-add=NET_BIND_SERVICE。
层缓存优化
- 先复制清单文件安装依赖,再复制源码,这是最具影响力的缓存规则。
- BuildKit 缓存挂载:跨构建持久化包管理器缓存(apt、pip、npm)。需启用 export DOCKER_BUILDKIT=1。
健康检查
- HTTP 检查与 TCP 检查(无需 curl/wget)。
- Compose 中结合依赖的健康检查,使用 condition: service_healthy。
容器网络
- Bridge:隔离网络,容器按名称解析。
- Host:共享主机网络栈,无需端口映射。
- Overlay:多主机(Swarm)。
- 用户自定义 bridge 网络上的容器可按容器名进行 DNS 解析,默认 bridge 网络不提供此功能。
卷管理
- 命名卷:Docker 管理,持久化数据。
- 绑定挂载:主机目录,适合开发。
- tmpfs:内存中,适合密钥/临时数据。
- 卷备份方法。
日志最佳实践
- 应用应写入 stdout/stderr,绝不写入容器内文件。
- JSON 文件驱动带轮转、Syslog 驱动。
- 可在 daemon.json 中设置默认值。
资源限制
- 内存、CPU、pids 限制。
- 内存与 swap 组合。
- CPU shares(相对权重,默认 1024)。
- Compose 资源限制与 ulimits。
调试容器
- docker exec、logs、inspect、stats、history、cp 等命令。
- 调试崩溃容器与网络调试方法。
生产模式
- 优雅关闭与信号处理:容器停止时收到 SIGTERM,应用必须处理,否则宽限期(默认 10s)后 Docker 发送 SIGKILL。始终使用 exec 形式使应用成为 PID 1。
- 使用 Tini 作为 PID 1 回收僵尸进程并转发信号。
- 停止宽限期配置。
- 镜像体积缩减:多阶段构建、Alpine 或 distroless、合并 RUN 命令、同层移除缓存、使用 --no-install-recommends 或 --no-cache。
- 编排考量:标签与元数据、Docker Compose 生产栈、镜像仓库操作(tag、cosign 签名、清理)。
使用方式
该技能以文档形式提供上述实践与代码示例,用户可依据具体场景查阅对应章节并应用其中的 Dockerfile 片段、命令行参数与 Compose 配置。
适用场景
- 优化 Docker 镜像体积与构建速度
- 提升容器安全性
- 编写生产级 Dockerfile 与 Compose 配置
- 排查容器运行、网络、资源问题
- 实施容器日志、健康检查与优雅关闭
限制
资料未提供该技能的具体安装方式、收费模式、平台支持范围或效果保证等信息。