🔥 前言

在容器化技术日益普及的今天,你会不会觉得制作出来的镜像动辄几百MB太臃肿?或者在修改 Nginx 默认首页时,中文总是显示成“楹︽槉褰”这种外星文字?

今天,我就带大家实战一次:基于 RockyLinux 官方镜像,利用 多阶段构建(Multi-stage build) 技术,从零编译安装 Nginx,并彻底搞定中文显示镜像瘦身

🚀 核心需求图鉴

  1. 基础镜像:RockyLinux 9

  2. 构建技巧:多阶段构建(编译环境与运行环境分离)

  3. 功能定制:自定义维护者信息,修改 index.html 为个人姓名学号。

  4. 终极攻克:彻底解决 Docker 中 Nginx 中文乱码问题。


🛠️ 极简版 Dockerfile 源码

这份 Dockerfile 经过反复调试,直接复制可用:

# ==========================================
# 第一阶段:编译阶段 (Builder)
# ==========================================
FROM rockylinux:9 AS builder
LABEL maintainer=""
# 2. 安装编译环境 (gcc, make, wget等)
RUN yum install -y wget gcc make pcre-devel zlib-devel tar
# 3. 下载并解压 Nginx 源码
WORKDIR /src
RUN wget https://nginx.org/download/nginx-1.25.3.tar.gz && \
    tar -zxvf nginx-1.25.3.tar.gz
# 4. 编译安装 (剔除不必要的模块)
WORKDIR /src/nginx-1.25.3
RUN ./configure --prefix=/usr/local/nginx --without-http_rewrite_module --without-http_gzip_module && \
    make && \
    make install

# 5. 【关键点】修改首页并解决中文乱码
RUN sed -i 's/Welcome to nginx!/你好/g' /usr/local/nginx/html/index.html

# 在 nginx.conf 中强制开启 UTF-8 编码,防止浏览器乱码
RUN sed -i '/http {/a \    charset utf-8;' /usr/local/nginx/conf/nginx.conf


# ==========================================
# 第二阶段:运行阶段 (Runtime)
# ==========================================
FROM rockylinux:9

# 再次声明作者
LABEL maintainer="你好"

# 【精髓】仅从 builder 阶段拷贝编译好的二进制文件
COPY --from=builder /usr/local/nginx /usr/local/nginx

# 配置环境变量
ENV PATH="/usr/local/nginx/sbin:${PATH}"

EXPOSE 80

# 启动命令
CMD ["nginx", "-g", "daemon off;"]

💡 深度解析:为什么这么写?

1. 为什么要用“多阶段构建”?

传统的 Dockerfile 构建完后,镜像里会带着 gccmake 和几十 MB 的源码包。 使用 AS builder 之后,我们在第二阶段只拿走了 /usr/local/nginx 文件夹。最终镜像体积能从 600MB+ 缩减到 200MB 左右!

2. 解决乱码的“两把斧”
  • 内容替换sed -i 's/Welcome to nginx!/你好/g' 确保 HTML 源码被修改。

  • 编码声明charset utf-8; 这一行非常关键!它告诉浏览器:“喂,用 UTF-8 解析我!”,从而完美避开“楹︽槉褰”乱码。


📋 常用操作命令手册

  • 构建镜像docker build -t my-nginx:v1 .

  • 启动容器docker run -d -p 8080:80 --name my-nginx-v1 my-nginx:v1

  • 查看容器 IPdocker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx-v1

  • 导出镜像 Tar 包docker save -o nginx_assignment.tar my-nginx:v1


✨ 运行效果展示

打开浏览器访问 http://localhost:8080,你会看到:

你好

If you see this page, the nginx web server is successfully installed...


✍️ 总结

通过本次实战,我们不仅掌握了 Dockerfile 的多阶段构建,还深入理解了 Nginx 配置与字符编码的关系。在生产环境下,保持镜像轻量和规范的编码习惯是每个架构师的必修课!

更多推荐