目录
1. 为什么需要自定义 Nginx 镜像?
2. Dockerfile 解析
2.1 基础镜像选择
2.2 安装依赖
2.3 下载并解压 Nginx 源码
2.4 应用补丁并编译 Nginx
2.5 暴露端口并设置启动命令
3. 构建并运行自定义 Nginx 镜像
3.1 构建镜像
3.2 运行容器
3.3 健康检测配置
4. 验证
5. 总结
1. 为什么需要自定义 Nginx 镜像?
Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,广泛应用于生产环境中。然而,默认的 Nginx 镜像可能不包含我们所需的特定模块或配置。通过自定义 Nginx 镜像,我们可以:
-
集成第三方模块(如
nginx_upstream_check_module
)。 -
优化配置以满足特定需求。
-
减少镜像大小,提高部署效率。
2. Dockerfile 解析
下面是我们将要使用的 Dockerfile,它基于 Alpine Linux 构建,并集成了 nginx_upstream_check_module
模块。
# 使用构建基础镜像,例如 Alpine Linux,并标记为构建阶段
FROM alpine:3.21.2# 安装必要的依赖包,并清理缓存以减少镜像大小
RUN apk add --no-cache \build-base \pcre2-dev \openssl-dev \zlib-dev \linux-headers \&& rm -rf /var/cache/apk/*# 创建工作目录
WORKDIR /usr/local/src# 下载 Nginx 源码和 nginx_upstream_check_module 源码,并解压
RUN wget http://nginx.org/download/nginx-1.25.3.tar.gz && \tar -zxvf nginx-1.25.3.tar.gz && \wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master && \unzip master# 切换到 Nginx 源码目录,配置、编译并安装 Nginx
WORKDIR nginx-1.25.3RUN patch -p1 < ../nginx_upstream_check_module-master/check_1.20.1+.patchRUN ./configure --prefix=/usr/local/nginx \--with-http_stub_status_module \--with-http_ssl_module \--add-module=../nginx_upstream_check_module-master \&& make \&& make install \&& rm -rf /usr/local/src/* # 清理源码和临时文件,减少最终镜像大小# 暴露 Nginx 常用的端口
EXPOSE 80 443 8080 8000WORKDIR /usr/local/nginx/sbin
# 设置 Nginx 为容器启动时执行的命令
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
2.1 基础镜像选择
我们选择了 alpine:3.21.2
作为基础镜像。Alpine Linux 是一个轻量级的 Linux 发行版,镜像体积小,适合构建最小化的 Docker 镜像。
2.2 安装依赖
在构建 Nginx 之前,我们需要安装一些必要的依赖包,如 build-base
、pcre2-dev
、openssl-dev
等。这些依赖包是编译 Nginx 所必需的。
RUN apk add --no-cache \build-base \pcre2-dev \pcre2 \openssl-dev \zlib-dev \linux-headers \&& rm -rf /var/cache/apk/*
2.3 下载并解压 Nginx 源码
接下来,我们下载 Nginx 的源码和 nginx_upstream_check_module
模块的源码,并解压它们。
RUN wget http://nginx.org/download/nginx-1.25.3.tar.gz && \tar -zxvf nginx-1.25.3.tar.gz && \wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master && \unzip master
2.4 应用补丁并编译 Nginx
nginx_upstream_check_module
模块需要打补丁才能与 Nginx 1.20.1+ 版本兼容。我们使用 patch
命令应用补丁,然后配置、编译并安装 Nginx。
RUN patch -p1 < ../nginx_upstream_check_module-master/check_1.20.1+.patchRUN ./configure --prefix=/usr/local/nginx \--with-http_stub_status_module \--with-http_ssl_module \--add-module=../nginx_upstream_check_module-master \&& make \&& make install \&& rm -rf /usr/local/src/* # 清理源码和临时文件,减少最终镜像大小
2.5 暴露端口并设置启动命令
最后,我们暴露 Nginx 常用的端口(80、443、8080、8000),并设置 Nginx 为容器启动时执行的命令。
EXPOSE 80 443 8080 8000WORKDIR /usr/local/nginx/sbin
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
3. 构建并运行自定义 Nginx 镜像
3.1 构建镜像
在 Dockerfile 所在的目录下,运行以下命令构建镜像:
docker build -t nginx-upstream-check:1.25.3 .
3.2 运行容器
构建完成后,可以使用以下命令运行容器:
docker run -d -p 8000:8000 -v /home/nginx/conf:/usr/local/nginx/conf -v /home/nginx/logs:/usr/local/nginx/logs nginx-upstream-check:1.25.3
3.3 健康检测配置
upstream upstream1 {server www.baidu.com;server 192.168.1.3:8080;server 192.168.1.4:8080;# 每隔2秒检查后端真实节点状态,成功2次为up状态,失败3次为down状态,超时时间为1秒check interval=2000 rise=2 fall=3 timeout=1000 type=http;# 设置描述了检查模块在每次检查时,向后端节点发送什么样的信息check_http_send "HEAD / HTTP/1.0\r\n\r\n";# 健康的状态码 check_http_expect_alive http_2xx http_3xx;
}
4. 验证
出现以下相关日志表示已经成功
5. 总结
通过本文,我们学习了如何使用 Dockerfile 构建一个自定义的 Nginx 镜像,并集成了 nginx_upstream_check_module
模块。这种自定义镜像不仅可以根据需求灵活配置,还能减少镜像体积,提高部署效率。希望本文对你有所帮助,欢迎在评论区分享你的想法和经验!
参考链接:
-
Nginx 官方文档
-
nginx_upstream_check_module GitHub 仓库
-
Alpine Linux 官方镜像