基于 Alpine 基础镜像制作 Nginx 源码编译镜像

本次尝试将dockerfile的18条命令全部进行应用(非精简) 大概流程和命令解释如下

1.各命令说明

  1. FROM:指定基础镜像,这里使用了 Alpine Linux 作为基础系统
  2. LABEL:添加镜像元数据,如维护者、版本和描述
  3. ARG:定义构建时参数,可以在构建命令中通过--build-arg覆盖
  4. ENV:设置环境变量,用于后续命令和运行时
  5. RUN:执行命令,用于安装依赖和执行编译操作
  6. WORKDIR:设置工作目录,后续命令的相对路径都基于此目录
  7. RUN:下载 Nginx 及依赖库的源码包
  8. RUN:解压下载的源码包
  9. RUN:配置并编译 Nginx,启用多个模块
  10. RUN:创建运行用户和必要的目录结构
  11. COPY:从本地复制自定义配置文件到镜像中
  12. EXPOSE:声明容器运行时监听的端口
  13. VOLUME:创建挂载点,用于持久化日志和网站内容
  14. USER:指定运行 Nginx 的用户,增强安全性
  15. HEALTHCHECK:设置健康检查命令,确保 Nginx 服务正常运行
  16. RUN:在最终镜像中安装必要的运行时依赖
  17. COPY:从 builder 阶段复制编译好的 Nginx 和相关文件
  18. CMD:设置容器启动时执行的命令,以非守护进程方式运行 Nginx
# 1. FROM - 指定基础镜像
FROM alpine:3.18 AS builder

# 2. LABEL - 添加元数据
LABEL maintainer="阿苏卫"
LABEL version="1.0"
LABEL description="Nginx compiled from source with custom modules"

# 3. ARG - 定义构建参数
ARG NGINX_VERSION=1.24.0
ARG PCRE_VERSION=8.45
ARG ZLIB_VERSION=1.2.13
ARG OPENSSL_VERSION=3.0.8

# 4. ENV - 设置环境变量
ENV NGINX_INSTALL_DIR=/usr/local/nginx
ENV WORK_DIR=/tmp/build
ENV PATH="${PATH}:${NGINX_INSTALL_DIR}/sbin"

# 5. RUN - 执行命令(更新包管理器并安装依赖)
RUN sed -i '[email protected]@mirrors.tuna.tsinghua.edu.cn@' /etc/apk/repositories
RUN apk update && \
    apk add --no-cache \
    gcc \
    g++ \
    make \
    openssl-dev \
    pcre-dev \
    zlib-dev \
    linux-headers \
    curl \
    tar \
    bash \
    ca-certificates

# 6. WORKDIR - 设置工作目录
WORKDIR $WORK_DIR

# 7. RUN - 下载源码包
RUN curl -O https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    curl -O https://ftp.pcre.org/pub/pcre/pcre-${PCRE_VERSION}.tar.gz && \
    curl -O https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz && \
    curl -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz

# 8. RUN - 解压源码包
RUN tar -zxvf nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxvf pcre-${PCRE_VERSION}.tar.gz && \
    tar -zxvf zlib-${ZLIB_VERSION}.tar.gz && \
    tar -zxvf openssl-${OPENSSL_VERSION}.tar.gz

# 9. RUN - 配置并编译Nginx
RUN cd ${WORK_DIR}/nginx-${NGINX_VERSION} && \
    ./configure \
    --prefix=${NGINX_INSTALL_DIR} \
    --sbin-path=${NGINX_INSTALL_DIR}/sbin/nginx \
    --conf-path=${NGINX_INSTALL_DIR}/conf/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/run/nginx.lock \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_gzip_static_module \
    --with-openssl=${WORK_DIR}/openssl-${OPENSSL_VERSION} \
    --with-pcre=${WORK_DIR}/pcre-${PCRE_VERSION} \
    --with-zlib=${WORK_DIR}/zlib-${ZLIB_VERSION} && \
    make && \
    make install

# 10. RUN - 创建必要目录和用户
RUN addgroup -S nginx && \
    adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx && \
    mkdir -p /var/log/nginx && \
    mkdir -p /var/cache/nginx && \
    chown -R nginx:nginx /var/log/nginx && \
    chown -R nginx:nginx /var/cache/nginx

# 11. COPY - 复制配置文件(假设本地有自定义配置)
COPY nginx.conf ${NGINX_INSTALL_DIR}/conf/nginx.conf
COPY default.conf ${NGINX_INSTALL_DIR}/conf/conf.d/default.conf

# 12. EXPOSE - 声明容器运行时监听的端口
EXPOSE 80 443

# 13. VOLUME - 创建挂载点
VOLUME ["/var/log/nginx", "/usr/local/nginx/html"]

# 14. USER - 指定运行容器时的用户名或UID
USER nginx

# 15. HEALTHCHECK - 设置健康检查
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
    CMD curl -f http://localhost/ || exit 1

# 16. RUN - 安装必要的运行时依赖
RUN apk update && \
    apk add --no-cache \
    openssl \
    pcre \
    zlib \
    tzdata && \
    rm -rf /var/cache/apk/*

# 17. COPY - 从builder阶段复制编译好的Nginx
COPY --from=builder /usr/local/nginx /usr/local/nginx
COPY --from=builder /var/cache/nginx /var/cache/nginx
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /etc/group /etc/group

# 18. CMD - 设置容器启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]    

2.个性化定制

1.先写一个脚本mynginx.sh

#!/bin/bash
mkdir -p /usr/local/nginx/conf/conf.d /data/website
cat > /usr/local/nginx/conf/conf.d/www.conf < /data/website/index.html
nginx -g 'daemon off;'

2.定制对应的dockerfile文件

FROM alpine:3.22.0
LABEL author=handsome version=1.2.0
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories \
    && apk update && apk --no-cache add \
    tzdata gcc make curl zip unzip net-tools \
    pstree wget libgcc libc-dev libcurl \
    libc-utils pcre-dev zlib-dev libnfs pcre pcre2 libevent libevent-dev iproute2 \
    && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && addgroup -g 888 -S nginx \
    && adduser -s /sbin/nologin -S -D -u 888 -G nginx nginx

ADD nginx-1.29.0.tar.gz /usr/local/src

RUN cd /usr/local/src/nginx-1.29.0 \
    && ./configure --prefix=/usr/local/nginx \
    && make \
    && make install \
    && ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx \
    && chown -R nginx:nginx /usr/local/nginx/ \
    && rm -rf /usr/local/src/nginx-1.29.0 \
    && apk add bash
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
COPY mynginx.sh /usr/local/sbin/mynginx.sh
CMD ["mynginx.sh"]

注意:mynginx.sh的权限设置应当为755 否者程序执行不了

3.创建容器并测试 

假设自己创建的镜像名字:标签为mynginx:1.29.0  主机ip是10.0.0.101

docker run -d -p 88:80 --name c1 mynginx:1.29.0 

curl -H "host:www.w.org" 10.0.0.101:88   得到结果为:www.w.org

自己定制的话需要在dockerfile文件里面添加USER root 然后在重复上面定义的测试

你可能感兴趣的:(nginx,服务器,前端)