目录

一. 方案一:基于官方 Nginx 镜像(推荐新手 / 快速部署)

1. 准备 3 个核心文件

(1)Dockerfile(构建镜像的核心脚本)

(2)nginx.conf(Nginx 核心配置文件)

(3)index.html(自定义首页)

2. 构建镜像

3. 启动容器

4. 验证结果

二、方案二:编译 Nginx 源码(适合自定义需求)

1. 核心文件说明

(1)default.conf(站点子配置,解耦主配置)

(2)Dockerfile(源码编译核心脚本)

2. 构建与启动(同方案一)

三、两种方案对比与选择建议

四、常见问题排查

1. 容器启动后无法访问?

2. 自定义配置不生效?


Nginx 是工作中常用的 Web 服务器与反向代理工具,本文提供 基于官方镜像(快速部署)和 源码编译(自定义功能)两种 Docker 部署方案,步骤清晰且可直接复用。

一. 方案一:基于官方 Nginx 镜像(推荐新手 / 快速部署)

直接使用官方精简镜像(nginx:alpine),仅需补充自定义配置与页面,构建速度快、体积小。

1. 准备 3 个核心文件

将以下 3 个文件放在同一目录(如 nginx-docker/),避免路径错误。

(1)Dockerfile(构建镜像的核心脚本)

# 基础镜像:选择 alpine 版本(体积仅约 20MB,比默认版本更小)
FROM nginx:alpine

# 维护者信息(替换为你的信息)
LABEL maintainer="Your Name <your.email@example.com>"

# 复制本地配置文件到容器(覆盖官方默认配置)
# 若无需自定义,可删除这行(直接用官方默认配置)
COPY nginx.conf /etc/nginx/nginx.conf

# 复制自定义首页到 Nginx 默认站点目录
COPY index.html /usr/share/nginx/html/index.html

# 暴露 Nginx 默认端口(仅声明,需 run 时映射)
EXPOSE 80

# 前台启动 Nginx(Docker 容器需前台进程才能保持运行)
CMD ["nginx", "-g", "daemon off;"]

(2)nginx.conf(Nginx 核心配置文件)

基础配置满足静态服务需求,可根据业务修改(如反向代理、HTTPS):

worker_processes  1;  # 工作进程数(建议设为 CPU 核心数,简单场景设 1 即可)

events {
    worker_connections  1024;  # 单个工作进程的最大连接数
}

http {
    include       mime.types;  # 引入文件类型映射表
    default_type  application/octet-stream;  # 默认文件类型

    sendfile        on;  # 开启高效文件传输模式
    keepalive_timeout  65;  # 客户端连接超时时间(秒)

    # 单个站点配置(可配置多个 server 块实现多站点)
    server {
        listen       80;  # 监听 80 端口
        server_name  localhost;  # 站点域名(如实际域名可替换为 example.com)

        # 根路径匹配(访问 http://localhost 时触发)
        location / {
            root   /usr/share/nginx/html;  # 静态文件根目录
            index  index.html index.htm;  # 默认首页文件
        }

        # 错误页面配置(5xx 错误时返回 50x.html)
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

(3)index.html(自定义首页)

用于验证部署结果,可替换为你的业务页面:

<!DOCTYPE html>
<html>
<head>
    <title>My Docker Nginx</title>
    <style>body { width: 40em; margin: 2em auto; font-family: Arial, sans-serif; text-align: center; }</style>
</head>
<body>
    <h1>✅ Nginx 部署成功!</h1>
    <p>当前环境:Docker + 官方 Nginx 镜像</p>
    <p>访问地址:<a href="http://localhost:8080">http://localhost:8080</a></p>
</body>
</html>

2. 构建镜像

进入文件所在目录,执行以下命令(my-nginx 为镜像名,可自定义):

docker build -t my-nginx .
  • 执行成功后,用 docker images 可查看已构建的 my-nginx 镜像。

3. 启动容器

# -d:后台运行;-p 8080:80:宿主机 8080 端口映射到容器 80 端口;--name:容器名
docker run -d -p 8080:80 --name my-nginx-container my-nginx

4. 验证结果

打开浏览器访问 http://localhost:8080,若看到自定义首页,说明部署成功。

二、方案二:编译 Nginx 源码(适合自定义需求)

当需要 指定 Nginx 版本添加第三方模块(如 ngx_http_redis_module)或 编译级优化 时,选择源码编译方式。

1. 核心文件说明

需准备 4 个文件(同一目录下):Dockerfilenginx.confdefault.confindex.html
其中 nginx.confindex.html 与「方案一」一致,仅需新增 default.conf(站点子配置)和修改 Dockerfile

(1)default.conf(站点子配置,解耦主配置)

server {
    listen       80;
    server_name  localhost;

    root   /usr/local/nginx/html;
    index  index.html index.htm;

    # 日志配置(便于排查问题)
    access_log  /usr/local/nginx/logs/access.log;
    error_log   /usr/local/nginx/logs/error.log;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/nginx/html;
    }
}

(2)Dockerfile(源码编译核心脚本)

# 基础镜像:alpine 最小 Linux 环境(减少最终镜像体积)
FROM alpine:latest

LABEL maintainer="Your Name <your.email@example.com>"

# 1. 安装编译依赖(编译完成后会删除,避免冗余)
RUN apk update && \
    apk add --no-cache \
        gcc g++ make libc-dev \  # 编译工具链
        pcre-dev zlib-dev openssl-dev \  # Nginx 依赖库(正则、压缩、HTTPS)
        wget tar linux-headers && \  # 下载工具、解压工具、内核头文件
    rm -rf /var/cache/apk/*  # 清理缓存

# 2. 定义 Nginx 版本(可替换为需要的版本,如 1.24.0)
ENV NGINX_VERSION=1.25.3
ENV NGINX_INSTALL_PATH=/usr/local/nginx  # Nginx 安装目录

# 3. 下载并解压源码
WORKDIR /usr/local/src  # 切换到源码目录
RUN wget http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz && \
    tar -zxvf nginx-$NGINX_VERSION.tar.gz && \
    rm nginx-$NGINX_VERSION.tar.gz  # 解压后删除压缩包

# 4. 配置编译参数(核心:启用需要的模块,禁用无用功能)
WORKDIR /usr/local/src/nginx-$NGINX_VERSION
RUN ./configure \
    --prefix=$NGINX_INSTALL_PATH \  # 安装目录
    --user=nginx --group=nginx \  # 运行 Nginx 的用户/组(安全隔离)
    # 启用常用 HTTP 模块
    --with-http_ssl_module \  # HTTPS 支持
    --with-http_v2_module \  # HTTP/2 支持
    --with-http_realip_module \  # 获取客户端真实 IP(反向代理场景必备)
    --with-http_gzip_static_module \  # 预压缩静态文件支持
    --with-http_stub_status_module \  # Nginx 状态监控模块
    # 启用 Stream 模块(TCP/UDP 代理,如数据库代理)
    --with-stream --with-stream_ssl_module \
    # 编译优化(减少资源占用)
    --with-threads \  # 线程池支持
    --with-cc-opt="-O2 -g -pipe -Wall"  # GCC 编译优化参数

# 5. 编译并安装(-j$(getconf _NPROCESSORS_ONLN):用满 CPU 核心,加速编译)
RUN make -j$(getconf _NPROCESSORS_ONLN) && \
    make install

# 6. 配置 Nginx 运行环境
RUN addgroup -S nginx && \  # 创建 nginx 组
    adduser -S -D -H -h $NGINX_INSTALL_PATH -s /sbin/nologin -G nginx nginx && \  # 创建 nginx 用户(无登录权限)
    # 创建必要目录并授权(避免权限错误)
    mkdir -p $NGINX_INSTALL_PATH/conf/conf.d $NGINX_INSTALL_PATH/logs && \
    chown -R nginx:nginx $NGINX_INSTALL_PATH

# 7. 配置环境变量(让系统能直接找到 nginx 命令)
ENV PATH=$NGINX_INSTALL_PATH/sbin:$PATH

# 8. 复制自定义配置文件
COPY nginx.conf $NGINX_INSTALL_PATH/conf/nginx.conf
COPY default.conf $NGINX_INSTALL_PATH/conf/conf.d/default.conf
COPY index.html $NGINX_INSTALL_PATH/html/index.html

# 9. 暴露端口(80:HTTP;443:HTTPS)
EXPOSE 80 443

# 10. 前台启动 Nginx(用 nginx 用户运行,更安全)
USER nginx
CMD ["nginx", "-g", "daemon off;"]

2. 构建与启动(同方案一)

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

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

  • 验证:访问 http://localhost:8080 查看结果。

三、两种方案对比与选择建议

维度 基于官方镜像 源码编译
构建速度 快(直接复用官方层) 慢(需编译依赖与源码)
镜像体积 小(alpine 版本约 20MB) 较大(约 100-200MB,含编译残留)
自定义程度 低(仅能修改配置 / 页面) 高(可指定版本、添加第三方模块)
适用场景 快速部署、静态服务、简单反向代理 需特定模块(如缓存、防盗链)、版本控制
推荐人群 新手、常规业务需求 进阶用户、定制化需求

四、常见问题排查

1. 容器启动后无法访问?

  • 检查端口映射:docker ps 确认 8080->80 映射是否存在;

  • 查看容器日志:docker logs my-nginx-container 排查配置错误。

2. 自定义配置不生效?

  • 确认 COPY 命令路径正确(如方案二中配置路径是 /usr/local/nginx/conf/);

  • 进入容器验证:docker exec -it my-nginx-container cat /etc/nginx/nginx.conf

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐