应选用alpine基础镜像并多阶段构建,通过apk --no-cache安装编译工具、configure精简模块、合并run指令清理中间文件、strip去除调试符号、entrypoint直接运行httpd,最终获得轻量安全的apache镜像。

在 Dockerfile 中基于源码安装 Apache 并构建轻量镜像,核心是“精简依赖、分层清理、避免冗余”。不建议直接用 yum install httpd(版本旧、包臃肿),而应从源码编译,但必须控制中间产物、删除调试符号、选用合适基础镜像。
选 Alpine 或多阶段构建来压体积
Alpine 镜像本身仅 5MB 左右,搭配 musl 和 busybox,天然适合轻量部署:
- 用
FROM alpine:latest起步,比 CentOS(230MB+)小一个数量级 - 安装时只取必要工具:
apk add --no-cache build-base apr-dev apr-util-dev pcre-dev openssl-dev autoconf automake libtool - 编译完成后立即
apk del所有 -dev 包和 build-base,不残留头文件和静态库
源码编译关键参数要精简模块
Apache 默认启用大量模块,多数容器场景用不到。configure 时显式关闭非必需项:
-
--enable-mods-shared=most改为--enable-mods-shared=so,rewrite,ssl,headers,expires(按需列) - 禁用 CGI、FastCGI、proxy、cache、ldap 等:加
--disable-cgi --disable-proxy --disable-cache等 - 指定前缀统一到
/usr/local/apache,便于后续清理和路径管理 - 加上
--with-mpm=prefork(简单稳定)或--with-mpm=event(高并发),避免默认的混合模式
Dockerfile 写法要合并 RUN、清除中间文件
每条 RUN 都新增一层,所以要把下载、解压、编译、安装、清理写在同一 RUN 中,并用 && \ 连接:
- 用
ADD *.tar.gz /tmp/自动解压,再RUN cd /tmp/httpd-* && ./configure ... && make && make install && rm -rf /tmp/* - 安装后立即删掉源码目录、
.o文件、文档(rm -rf /usr/local/apache/{build,manual}) - 用
strip --strip-all /usr/local/apache/bin/*去除二进制调试信息(可省 1–3MB)
启动方式要干净,不带 shell 封装
避免用 CMD ["/bin/sh", "-c", "httpd -D FOREGROUND"] 多一层进程,直接:
-
EXPOSE 80显式声明端口 ENTRYPOINT ["/usr/local/apache/bin/httpd"]-
CMD ["-D", "FOREGROUND"]—— 这样容器主进程就是 httpd,信号可直达,便于健康检查和优雅退出











