1. 基于官方镜像构建

1.1 什么是官方镜像?

官方 Docker 镜像 是由 Docker 团队或经其认可的团队创建和维护的镜像。这些镜像通常在 GitHub 上公开维护,遇到漏洞时会及时更新,并遵循最佳实践。

举个例子,我们使用 Nginx 官方镜像来部署一个静态网站:

FROM nginx:1.19.2
COPY my-static-website/ /usr/share/nginx/html

构建并运行:

$ docker build -t my-static-website .
$ docker run -p 8080:80 -d my-static-website

这个 Dockerfile 只有两行。官方镜像已经处理了 Nginx 的默认配置、端口暴露等细节,比如:

CMD ["nginx", "-g", "daemon off;"]

优势:避免自己处理一些容易踩坑的问题,比如 Nginx 守护进程导致容器退出。

1.2 由软件作者维护的镜像

有些镜像虽然不是“官方”定义的,但由软件作者维护,例如 EMQX 这个 MQTT 消息中间件。

我们可以通过环境变量来配置 EMQX,例如修改监听端口:

$ docker run -d -e EMQX_LISTENER__TCP__EXTERNAL=9999 -p 9999:9999 emqx/emqx:v4.1.3

优势:这些镜像通常更贴近软件本身的最佳实践,值得参考。

1.3 没有官方镜像怎么办?

比如 H2 数据库,虽然没有官方镜像,但社区提供了不错的替代,如 oscarfonts/h2,并配有 GitHub 项目说明。

建议:即使不直接使用,也可以作为构建自定义镜像的参考。


2. 尽量避免频繁构建新镜像

在熟悉 Docker 的过程中,我们可能会习惯性地每次修改都重新构建镜像。其实,有些配置可以直接通过容器运行时注入。

比如 HAProxy 的配置文件 my-config.cfg,我们可以直接挂载进容器:

$ docker run -d -v my-config.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:2.2.2

这样做的好处是:

  • ✅ 无需每次构建新镜像
  • ✅ 更容易升级 HAProxy 版本
  • ✅ 更适合配合编排工具使用(如 Kubernetes 的 ConfigMap)

2.1 使用编排工具管理配置

如果你使用 Docker Swarm 或 Kubernetes,它们都支持将配置文件作为外部资源挂载到容器中:

建议:对于不频繁变更但需要定制的配置,尽量避免构建镜像,而是使用挂载方式。


3. 构建精简镜像

镜像大小影响部署效率和安全性:

  • ✅ 轻量镜像传输更快
  • ✅ 去除不必要的包可减少攻击面

3.1 使用精简版基础镜像

常见的选择有:

  • Debian slim:如 debian:buster-slim,比完整版小很多
  • Alpine Linux:体积通常在 10MB 左右,专为容器优化

⚠️ 注意:Alpine 使用的是 musl libc 而非 glibc,部分软件可能不兼容,务必测试。

3.2 使用多阶段构建(Multi-Stage Build)

Docker 支持在一个 Dockerfile 中分阶段构建,最终只保留需要的部分。

比如为 HAProxy 添加 Data Plane API:

FROM haproxy:2.2.2-alpine AS downloadapi
RUN apk add --no-cache curl
RUN curl -L https://github.com/haproxytech/dataplaneapi/releases/download/v2.1.0/dataplaneapi_2.1.0_Linux_x86_64.tar.gz --output api.tar.gz
RUN tar -xf api.tar.gz
RUN cp build/dataplaneapi /usr/local/bin/

FROM haproxy:2.2.2-alpine
COPY --from=downloadapi /usr/local/bin/dataplaneapi /usr/local/bin/dataplaneapi

优势:第一阶段下载依赖和解压,最终镜像中只保留 API 二进制文件,无需保留构建工具。


4. 总结

容器化已经成为现代应用开发的标配,Docker 是最容易上手的工具。虽然它上手简单,但要构建出高效、安全的镜像,还需要一定的经验。

本文总结了几点构建高效 Docker 镜像的实用技巧:

  • ✅ 优先使用官方或作者维护的镜像
  • ✅ 避免不必要的镜像构建,考虑使用挂载配置
  • ✅ 使用 slim 或 Alpine 镜像精简体积
  • ✅ 利用多阶段构建优化最终镜像结构

这些技巧不仅有助于提升部署效率,也有助于增强系统的安全性与可维护性。


原始标题:Tips for Creating Efficient Docker Images

» 下一篇: Spinnaker 简介