如何创建一个自行设计的nginx的Docker Image
目录
- 前奏
- 问题描述
- 问题解决
- 第一步:设置构建环境
- 第二步:构建BoringSSL
- 第三步:下载并构建Nginx
- 第四步:创建最终镜像
- 整体的Dockerfile
前奏
你是否曾经想过,亲手打造一个属于自己的Nginx Docker镜像呢?
今天,让我们创建一个支持HTTP/3的Nginx Docker镜像吧!
请原谅我选择开启仅粉丝可见。
问题描述
在现代网络架构中,Nginx作为一个高性能的Web服务器和反向代理服务器,广受欢迎。然而,默认的Nginx镜像可能无法满足我们所有的需求,尤其是当我们需要支持一些高级特性比如HTTP/3时。因此,我们需要自行设计并构建一个自定义的Nginx镜像。
问题解决
第一步:设置构建环境
首先,我们需要一个基础镜像,这里我们选择Ubuntu 22.04作为起点。接着,我们设置非交互式安装环境,以确保安装过程不会因为用户交互而中断。以下是相关的Dockerfile配置:
FROM ubuntu:22.04 AS builder# 设置非交互式安装
ENV DEBIAN_FRONTEND=noninteractive# 安装构建依赖
RUN apt-get update && apt-get install -y \git wget build-essential libpcre3-dev zlib1g-dev \libssl-dev cmake ninja-build golang libunwind-dev \pkg-config curl gnupg2 ca-certificates
第二步:构建BoringSSL
为了支持HTTP/3,我们需要使用BoringSSL。我们将其源码克隆下来,并进行构建。以下是相关步骤:
WORKDIR /src
RUN git clone https://github.com/google/boringssl.git && \cd boringssl && \mkdir build && \cd build && \cmake -GNinja .. && \ninja
第三步:下载并构建Nginx
接下来,我们需要下载Nginx的源码,并配置其构建参数,以便支持HTTP/3。具体步骤如下:
ARG NGINX_VERSION=1.25.4
WORKDIR /src
RUN wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \tar -xzvf nginx-${NGINX_VERSION}.tar.gz && \git clone --recursive https://github.com/cloudflare/quiche.git && \cd nginx-${NGINX_VERSION} && \./configure \--prefix=/etc/nginx \--sbin-path=/usr/sbin/nginx \--modules-path=/usr/lib/nginx/modules \--conf-path=/etc/nginx/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 \--http-client-body-temp-path=/var/cache/nginx/client_temp \--http-proxy-temp-path=/var/cache/nginx/proxy_temp \--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \--http-scgi-temp-path=/var/cache/nginx/scgi_temp \--with-http_ssl_module \--with-http_v2_module \--with-http_v3_module \--with-cc-opt="-I../quiche/deps/boringssl/include" \--with-ld-opt="-L../quiche/deps/boringssl/lib" && \make -j$(nproc) && \make install
第四步:创建最终镜像
我们将构建好的Nginx及其依赖复制到最终镜像中,同时设置运行时的环境和参数。以下是相关配置:
FROM ubuntu:22.04# 安装运行时依赖
RUN apt-get update && apt-get install -y \ca-certificates libpcre3 openssl \&& rm -rf /var/lib/apt/lists/*# 复制Nginx及其依赖
COPY --from=builder /etc/nginx /etc/nginx
COPY --from=builder /usr/sbin/nginx /usr/sbin/nginx
COPY --from=builder /var/log/nginx /var/log/nginx
COPY --from=builder /src/boringssl/build/ssl/libssl.a /usr/lib/
COPY --from=builder /src/boringssl/build/crypto/libcrypto.a /usr/lib/# 创建所需的目录
RUN mkdir -p /var/cache/nginx/client_temp && \mkdir -p /etc/nginx/conf.d && \mkdir -p /usr/share/nginx/html# 创建默认配置,支持HTTP/3
RUN echo 'worker_processes auto;\n\
events {\n\worker_connections 1024;\n\
}\n\
\n\
http {\n\sendfile on;\n\tcp_nopush on;\n\tcp_nodelay on;\n\keepalive_timeout 65;\n\types_hash_max_size 2048;\n\include /etc/nginx/mime.types;\n\default_type application/octet-stream;\n\ssl_protocols TLSv1.3;\n\ssl_prefer_server_ciphers on;\n\access_log /var/log/nginx/access.log;\n\error_log /var/log/nginx/error.log;\n\include /etc/nginx/conf.d/*.conf;\n\
}' > /etc/nginx/nginx.conf# 默认站点配置
RUN echo 'server {\listen 80;\listen 443 ssl http2;\listen 443 quic reuseport;\server_name localhost;\ssl_certificate /etc/nginx/ssl/nginx.crt;\ssl_certificate_key /etc/nginx/ssl/nginx.key;\ssl_protocols TLSv1.3;\add_header Alt-Svc '\''h3=":443"; ma=86400'\'';\location / {\root /usr/share/nginx/html;\index index.html;\}\
}' > /etc/nginx/conf.d/default.conf# 创建默认首页
RUN echo '<html><body><h1>HTTP/3 Enabled!</h1></body></html>' > /usr/share/nginx/html/index.html# 转发请求日志到Docker日志收集器
RUN ln -sf /dev/stdout /var/log/nginx/access.log && \ln -sf /dev/stderr /var/log/nginx/error.log# 创建非root用户
RUN adduser --system --no-create-home --shell /bin/false --group --disabled-login nginx# 创建SSL证书目录
RUN mkdir -p /etc/nginx/ssl# 暴露端口
EXPOSE 80 443/tcp 443/udpSTOPSIGNAL SIGQUITCMD ["nginx", "-g", "daemon off;"]
整体的Dockerfile
哈~这就是我们完整的定制Nginx Dockerfile了!希望你能在这次旅程中找到乐趣,并成功创建出属于你自己的Nginx镜像。记住,真正的自由,是带着自己的创造力翱翔哦!
FROM ubuntu:22.04 AS builder# 设置非交互式安装
ENV DEBIAN_FRONTEND=noninteractive# 安装构建依赖
RUN apt-get update && apt-get install -y \git wget build-essential libpcre3-dev zlib1g-dev \libssl-dev cmake ninja-build golang libunwind-dev \pkg-config curl gnupg2 ca-certificates# 构建BoringSSL
WORKDIR /src
RUN git clone https://github.com/google/boringssl.git && \cd boringssl && \mkdir build && \cd build && \cmake -GNinja .. && \ninja# 下载并构建Nginx
ARG NGINX_VERSION=1.25.4
WORKDIR /src
RUN wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \tar -xzvf nginx-${NGINX_VERSION}.tar.gz && \git clone --recursive https://github.com/cloudflare/quiche.git && \cd nginx-${NGINX_VERSION} && \./configure \--prefix=/etc/nginx \--sbin-path=/usr/sbin/nginx \--modules-path=/usr/lib/nginx/modules \--conf-path=/etc/nginx/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 \--http-client-body-temp-path=/var/cache/nginx/client_temp \--http-proxy-temp-path=/var/cache/nginx/proxy_temp \--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \--http-scgi-temp-path=/var/cache/nginx/scgi_temp \--with-http_ssl_module \--with-http_v2_module \--with-http_v3_module \--with-cc-opt="-I../quiche/deps/boringssl/include" \--with-ld-opt="-L../quiche/deps/boringssl/lib" && \make -j$(nproc) && \make install# 创建最终镜像
FROM ubuntu:22.04# 安装运行时依赖
RUN apt-get update && apt-get install -y \ca-certificates libpcre3 openssl \&& rm -rf /var/lib/apt/lists/*# 复制Nginx及其依赖
COPY --from=builder /etc/nginx /etc/nginx
COPY --from=builder /usr/sbin/nginx /usr/sbin/nginx
COPY --from=builder /var/log/nginx /var/log/nginx
COPY --from=builder /src/boringssl/build/ssl/libssl.a /usr/lib/
COPY --from=builder /src/boringssl/build/crypto/libcrypto.a /usr/lib/# 创建所需的目录
RUN mkdir -p /var/cache/nginx/client_temp && \mkdir -p /etc/nginx/conf.d && \mkdir -p /usr/share/nginx/html# 创建默认配置,支持HTTP/3
RUN echo 'worker_processes auto;\n\
events {\n\worker_connections 1024;\n\
}\n\
\n\
http {\n\sendfile on;\n\tcp_nopush on;\n\tcp_nodelay on;\n\keepalive_timeout 65;\n\types_hash_max_size 2048;\n\include /etc/nginx/mime.types;\n\default_type application/octet-stream;\n\ssl_protocols TLSv1.3;\n\ssl_prefer_server_ciphers on;\n\access_log /var/log/nginx/access.log;\n\error_log /var/log/nginx/error.log;\n\include /etc/nginx/conf.d/*.conf;\n\
}' > /etc/nginx/nginx.conf# 默认站点配置
RUN echo 'server {\listen 80;\listen 443 ssl http2;\listen 443 quic reuseport;\server_name localhost;\ssl_certificate /etc/nginx/ssl/nginx.crt;\ssl_certificate_key /etc/nginx/ssl/nginx.key;\ssl_protocols TLSv1.3;\add_header Alt-Svc '\''h3=":443"; ma=86400'\'';\location / {\root /usr/share/nginx/html;\index index.html;\}\
}' > /etc/nginx/conf.d/default.conf# 创建默认首页
RUN echo '<html><body><h1>HTTP/3 Enabled!</h1></body></html>' > /usr/share/nginx/html/index.html# 转发请求日志到Docker日志收集器
RUN ln -sf /dev/stdout /var/log/nginx/access.log && \ln -sf /dev/stderr /var/log/nginx/error.log# 创建非root用户
RUN adduser --system --no-create-home --shell /bin/false --group --disabled-login nginx# 创建SSL证书目录
RUN mkdir -p /etc/nginx/ssl# 暴露端口
EXPOSE 80 443/tcp 443/udpSTOPSIGNAL SIGQUITCMD ["nginx", "-g", "daemon off;"]
相关文章:
如何创建一个自行设计的nginx的Docker Image
目录 前奏问题描述问题解决第一步:设置构建环境第二步:构建BoringSSL第三步:下载并构建Nginx第四步:创建最终镜像 整体的Dockerfile 前奏 你是否曾经想过,亲手打造一个属于自己的Nginx Docker镜像呢? 今天…...
CKPT文件是什么?
检查点(Checkpoint,简称ckpt)是一种用于记录系统状态或数据变化的技术,广泛应用于数据库管理、机器学习模型训练、并行计算以及网络安全等领域。以下将详细介绍不同领域中ckpt检查点的定义、功能和应用场景。 数据库中的ckpt检查点…...
zk基础—5.Curator的使用与剖析二
大纲 1.基于Curator进行基本的zk数据操作 2.基于Curator实现集群元数据管理 3.基于Curator实现HA主备自动切换 4.基于Curator实现Leader选举 5.基于Curator实现分布式Barrier 6.基于Curator实现分布式计数器 7.基于Curator实现zk的节点和子节点监听机制 8.基于Curator创…...
前端布局难题:父元素padding导致子元素无法全屏?3种解决方案
大家好,我是一诺。今天要跟大家分享一个我在实际项目中经常用到的CSS技巧——如何让子元素突破父元素的padding限制,实现真正的全屏宽度效果。 为什么会有这个需求? 记得我刚入行的时候,接到一个需求:要在内容区插入…...
Android使用OpenGL和MediaCodec录制
目录 一,什么是opengl 二,什么是Android OpenGL ES 三, OpenGL 绘制流程 四, OpenGL坐标系 五, OpenGL 着色器 六, GLSL编程语言 七,使用MediaCodec录制在Opengl中渲染架构 八,代码实现 8.1 自定义渲染view继承GLSurfaceView 8.2 自定义渲染器TigerRender 8.3 创建编…...
《如何避免虚无》速读笔记
文章目录 书籍信息概览躺派(出世)卷派(入世)虚无篇:直面虚无自我篇:认识自我孤独篇:应对孤独幸福篇:追寻幸福超越篇:超越自我 书籍信息 书名:《如何避免虚无…...
哈尔滨工业大学:大模型时代的具身智能
大家好,我是樱木。 机器人在工业领域,已经逐渐成熟。具身容易,智能难。 机器人-》智能机器人,需要自主能力,加上通用能力。 智能机器人-》人类,这个阶段就太有想象空间了。而最受关注的-类人机器人。 如何…...
19.go日志包log
核心功能与接口 基础日志输出 Print 系列:支持 Print()、Println()、Printf(),输出日志不中断程序。 log.Print("常规日志") // 输出: 2025/03/18 14:47:13 常规日志 log.Printf("格式化: %s", "数据") Fatal…...
理解OSPF 特殊区域NSSA和各类LSA特点
本文基于上文 理解OSPF Stub区域和各类LSA特点 在理解了Stub区域之后,我们再来理解一下NSSA区域,NSSA区域用于需要引入少量外部路由,同时又需要保持Stub区域特性的情况 一、 网络总拓扑图 我们在R1上配置黑洞路由,来模拟NSSA区域…...
如何通过优化HMI设计大幅提升产品竞争力?
一、HMI设计的重要性与竞争力提升 HMI(人机交互界面)设计在现代产品开发中扮演着至关重要的角色。良好的HMI设计不仅能够提升用户体验,还能显著增强产品的竞争力。在功能趋同的市场环境中,用户体验成为产品竞争的关键。HMI设计通…...
Linux信号——信号的处理(3)
信号是什么时候被处理? 进程从内核态,切换到用户态的时候,信号会被检测处理。 内核态:操作系统的状态,权限级别高 用户态:你自己的状态 内核态和用户态 进程地址空间第三次 所谓的系统调用本质其实是一堆…...
Pod的调度
在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上&…...
LabVIEW面向对象编程设计方法
一、概述 面向对象编程(OOP)在软件开发中占据重要地位,尤其是在大规模软件项目中。它与小型程序开发思路不同,更注重未来功能的升级与扩展。在设计阶段,需思考如何构建既灵活又稳定的系统,这涉及众多设计方…...
Spring常见问题复习
############Spring############# Bean的生命周期是什么? BeanFactory和FactoryBean的区别? ApplicationContext和BeanFactory的区别? BeanFactoryAware注解,还有什么其它的Aware注解 BeanFactoryAware方法和Bean注解的方法执行顺…...
JJJ:generic netlink例程分析
接嵌入式毕设、课设辅导、技术咨询,欢迎私信 完整代码:github代码仓链接 若想要和指定的generic netlink family通信,如: 994 static struct genl_family genl_ctrl __ro_after_init { // generic netlink子协议995 .module THIS_MODU…...
Dify票据识别遇到的分支判断不准确问题
已测试这篇文章中 https://zhuanlan.zhihu.com/p/5465385787 使用多分支条件判断使用不同的大模型识别图片内容 发现了细节问题。在使用时若不注意,分支会出现走向不准的问题。 需要关注部分 下方红框处。1,2后不能跟点。否则会出问。除此之外࿰…...
《全栈+双客户端Turnkey方案》架构设计图
今天分享一些全栈双客户端Turnkey方案的架构与结构图。 1:三种分布式部署方案:网关方案,超级服务器单服方案,直连逻辑服方案 2: 单服多线程核心架构: 系统服务逻辑服服务 3: 系统服务的多线程池调度设计 4:LogicServer Update与ECS架构&…...
某碰瓷国赛美赛,号称第三赛事的数模竞赛
首先我非常不能理解的就是怎么好意思自称第三赛事的呢?下面我们进行一个简单讨论,当然这里不对国赛和美赛进行讨论。首先我们来明确一点,比赛的含金量由什么来定?这个可能大家的评价指标可能不唯一,我通过DeepSeek选取…...
【代码模板】如何用FILE操作符打开文件?fopen、fclose
#include "stdio.h" #include "unistd.h"int main(int argc, char *argv[]) {FILE *fp fopen("1.log", "wb");if (!fp) {perror("Failed open 1.log");return -1;}fclose(fp); }关于权限部分参考兄弟篇【代码模板】C语言中…...
【大模型深度学习】如何估算大模型需要的显存
一、模型参数量 参数量的单位 参数量指的是模型中所有权重和偏置的数量总和。在大模型中,参数量的单位通常以“百万”(M)或“亿”(B,也常说十亿)来表示。 百万(M):表示…...
Mysql 数据库编程技术01
一、数据库基础 1.1 认识数据库 为什么学习数据库 瞬时数据:比如内存中的数据,是不能永久保存的。持久化数据:比如持久化至数据库中或者文档中,能够长久保存。 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长…...
Class<?> 和Class<T >有什么区别
Class<?> 和 Class<T> 在 Java 中都表示 Class 类型的对象,但它们的使用方式和作用略有不同。让我们详细分析它们的区别: 1. Class<?>(通配符 Class 类型) ? 代表一个未知类型(Wildcard…...
[自制调试工具]利用模板函数打造通用调试工具
引言 上一篇文章 我们介绍了调式类工具,这篇文章我们补充一下 点击这里查看 在软件开发的过程中,调试是必不可少的环节。为了能更高效地定位和解决问题,我们常常需要在代码中插入一些调试信息,来输出变量的值、函数的执行状态等。传统的调试…...
Python地理数据处理 28:基于Arcpy批量操作实现——按属性提取和分区统计
Arcpy批量操作 1. 批量按属性提取2. 批量分区统计(最大值、最小值和像元个数等) 1. 批量按属性提取 # -*- coding: cp936 -*- """ PROJECT_NAME: ArcPy FILE_NAME: batch_attribute_extract AUTHOR: JacksonZhao DATE: 2025/04/05 &qu…...
Mysql慢查询设置 和 建立索引
1 .mysql慢查询的设置 slow_query_log ON //或 slow_query_log_file /usr/local/mysql/data/slow.log long_query_time 2 修改后重启动mysql 1.1 查看设置后的参数 mysql> show variables like slow_query%; --------------------------------------------------…...
【Android】界面布局-相对布局RelativeLayout-例子
题目 完成下面相对布局,要求: 中间的button在整个屏幕的中央,其他的以它为基准排列。Hints:利用layout_toEndof,_toRightof,_toLeftof,_toStartof完成。 结果演示 代码实现 <?xml version"1.0" encoding"u…...
Spring Boot 中使用 Redis:从入门到实战
🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...
【ROS】 CMakeLists 文件详解
【ROS】 CMakeLists文件详解 前言标准的CMAKELIST.TXT文件的组成部分CMake 版本要求和项目名称指定编译器和设置构建规则查找 ROS 依赖消息和服务文件catkin_package设置头文件目录路径添加可执行文件的构建规则设置编译依赖关系(构建顺序)设置目标文件的…...
【每日算法】Day 17-1:位图(Bitmap)——十亿级数据去重与快速检索的终极方案(C++实现)
解锁海量数据处理的极致空间效率!今日深入解析位图的核心原理与实战应用,从基础操作到分块优化,彻底掌握仅用1bit存储一个数据的压缩艺术。 一、位图核心思想 位图(Bitmap) 是一种通过比特位表示数据存在性的数据结构…...
7-1 素数求和(线性筛实现)
7-1 素数求和。 分数 10 中等 全屏浏览 切换布局 作者 魏英 单位 浙江科技大学 输入两个正整数m和n(1<m<n<500)统计并输出m和n之间的素数个数以及这些素数的和。 输入格式: 输入两个正整数m和n(1<m<n<500࿰…...
