Docker 最佳实践
该技能提供当前 Docker 在容器开发、部署和运维各方面的最佳实践,涵盖镜像、容器运行时、Docker Compose、生产部署、平台差异与性能优化等主题,并附带常见反模式清单和生产就绪检查清单。
镜像最佳实践
基础镜像选择
2025 推荐层级:Wolfi/Chainguard(cgr.dev/chainguard/,零 CVE 目标,内置 SBOM)、Alpine(alpine:3.19,约 7MB,最小攻击面)、Distroless(gcr.io/distroless/,约 2MB,无 shell)、Slim 变体(node:20-slim,约 70MB,均衡)。
关键规则:始终指定精确版本标签(如 node:20.11.0-alpine3.19);绝不使用 latest;使用可信仓库的官方镜像;按实际需求匹配基础镜像。
Dockerfile 结构
按变更频率由低到高排列层:基础镜像与系统依赖、应用依赖、应用代码、配置与元数据。这样可利用 Docker 层缓存,代码改动而依赖不变时可复用依赖层,加快构建。文中给出了 Python 3.12-slim 的示例。
多阶段构建
将构建依赖与运行时分离,示例使用 node:20-alpine 构建阶段与独立运行时阶段,仅复制 dist 与 node_modules。收益:最终镜像更小、安全性更好、部署更快。
层优化
合并命令以减少层数并使清理生效:反例为 update、install、rm 分三条 RUN;正例为在单条 RUN 中用 && 串联安装与清理。
.dockerignore
始终创建,排除版本控制文件、依赖目录、IDE 配置、系统文件、日志、测试覆盖率、文档和环境变量文件等。
容器运行时最佳实践
安全
docker run 示例包含:以非 root 用户运行(--user 1000:1000)、丢弃全部能力并按需添加(--cap-drop=ALL、--cap-add=NET_BIND_SERVICE)、只读文件系统(--read-only)、临时可写文件系统(--tmpfs /tmp:noexec,nosuid)、禁止新特权(--security-opt="no-new-privileges:true")、资源限制(--memory、--cpus)。
资源管理
生产环境始终设置资源限制,示例为 docker-compose.yml 中 deploy.resources 的 limits(cpus、memory)与 reservations。
健康检查
为所有长期运行容器实现健康检查,示例为 Dockerfile 的 HEALTHCHECK 指令(含 interval、timeout、retries、start-period)以及 Compose 中的 healthcheck 配置。
日志
配置日志防止磁盘写满,示例为 json-file 驱动配合 max-size、max-file;也可在 /etc/docker/daemon.json 全局配置。
重启策略
开发环境可用 restart: "no",生产可用 unless-stopped,或使用 Swarm 模式的 deploy.restart_policy 进行细粒度控制(condition、delay、max_attempts、window)。
Docker Compose 最佳实践
文件结构
Compose v2.40.3+ 无需 version 字段。文件可包含 services、networks、volumes、configs、secrets 等顶层配置,示例区分了自定义网络、命名卷、Swarm 配置与密钥。
网络隔离
使用自定义 bridge 网络,后端网络设置 internal: true 禁止外部访问;web 仅接入前端网络,api 接入前后端,数据库仅接入后端网络。
环境变量
优先用 env_file 加载 .env,服务专属变量可内联 environment,Swarm 模式使用 secrets。注意事项:.env 加入 .gitignore、提供 .env.example 模板、绝不提交密钥到版本控制。
依赖管理
depends_on 可搭配 condition,例如等待数据库 service_healthy、等待 Redis service_started。
生产最佳实践
镜像标签策略
使用语义化版本(如 my-app:1.2.3、1.2、1、latest),可附加 git commit 以追溯(如 1.2.3-abc123f),也可使用环境标签(production、staging)。
密钥管理
不要在 ENV 或 RUN 中写入密钥(会留在层历史)。应使用 Docker secrets(Swarm)、运行时挂载密钥目录(-v /secure/secrets:/run/secrets:ro)或环境文件(--env-file)。
监控与可观测性
通过 healthcheck、Prometheus 抓取标签(prometheus.io/scrape、port)、团队与版本标签、日志驱动配置实现。
备份策略
使用临时容器挂载命名卷与备份目录,通过 tar 打包备份与恢复卷数据。
更新策略
Swarm 模式滚动更新示例:replicas: 3,update_config 设置 parallelism、delay、failure_action: rollback、monitor,以及 rollback_config。
平台特定最佳实践
- Linux:使用用户命名空间重映射、利用原生性能优势、使用 Alpine 获取最小镜像、配置 SELinux/AppArmor、用 systemd 管理 Docker 守护进程。给出了 daemon.json 示例(userns-remap、log-driver、log-opts、storage-driver: overlay2、live-restore)。
- macOS:在 Docker Desktop 中分配充足资源、绑定挂载使用 :delegated 或 :cached、考虑 ARM(M1/M2)多平台构建、限制文件共享目录。
- Windows:选择容器类型(Windows 或 Linux)、路径使用正斜杠、在 Docker Desktop 中共享驱动器、注意 CRLF 与 LF 差异、考虑 WSL2 后端提升性能。
性能最佳实践
- 构建性能:启用 BuildKit(export DOCKER_BUILDKIT=1)、使用缓存挂载(--mount=type=cache)、为依赖使用绑定挂载。
- 镜像体积:多阶段构建、最小基础镜像、同一层内清理、使用 .dockerignore、移除构建依赖。
- 运行时性能:使用 exec 形式 CMD(无 shell 开销)、设置 STOPSIGNAL SIGTERM、以非 root 用户运行。
安全最佳实践摘要
镜像安全:使用官方最小基础镜像、扫描漏洞(Docker Scout、Trivy)、层中不含密钥、非 root 运行、保持镜像更新。
运行时安全:丢弃能力、只读文件系统、资源限制、启用安全选项、网络隔离、密钥管理。
合规:遵循 CIS Docker Benchmark、在 CI/CD 中实现容器扫描、使用签名镜像(Docker Content Trust)、维护审计日志、定期安全审查。
常见反模式
不要:以 root 运行、使用 --privileged、挂载 Docker socket、使用 latest 标签、硬编码密钥、跳过健康检查、忽略资源限制、使用超大基础镜像、跳过漏洞扫描、暴露不必要端口、低效层缓存、把密钥提交到 Git。
应当:非 root 运行、最小能力、隔离容器、版本标签、密钥管理、健康检查、资源限制、最小镜像、定期扫描、最小权限、优化构建缓存、使用 .env.example 模板。
生产就绪镜像检查清单
基于官方、带版本的最小镜像;多阶段构建(如适用);以非 root 用户运行;层中无密钥;配置 .dockerignore;通过漏洞扫描;实现健康检查;正确标注(版本、描述等);高效层缓存;定义资源限制;配置日志;正确处理信号;设置安全选项;文档完整;在目标平台测试。
其他说明
技能开头的关键指南提到 Windows 文件路径要求(在 Windows 上使用 Edit 或 Write 工具时应使用反斜杠而非正斜杠),以及文档指南(除非用户明确要求,不创建新文档文件;优先更新现有 README.md;保持仓库根目录整洁;文档风格简洁直接专业)。
该技能内容随 Docker 持续演进,建议始终对照官方文档核实最新建议。
关于收费、价格、平台支持范围等信息,资料暂未提供。