文章目录
注意:
本博客以Ubuntu系统为例进行讲解
一、实践目标
通过Dockerfile构建自定义Nginx,实现下面的目标:
版本参数化 :利用 ARG 与 ENV 实现 OS 基础镜像与 Nginx 源码版本的灵活切换。
源码级构建 :实现在 Docker 容器内自动化完成依赖安装、环境预检及源码编译。
定制化部署 :通过 COPY 覆盖默认配置,实现自定义 Web 根目录与站点的快速发布。
二、宿主机上安装Nginx的方式
要学习Dockerfile怎么根据Ubuntu构建Ningx,必然,我们需要先了解宿主机上是如何下载和安装Ningx的。
第一步:安装编译环境和依赖
首先更新软件源,安装C语言编译器(build-essential:nginx源码由C语言编写)、正则表达式库(libpcre3和libpcre3-dev:用于nginx识别网址)、网络下载工具(wget:在linux上可以通过wget https://nginx.org/download/${NGINX_VERSION}.tar.gz下载资源)、压缩工具(zlib1g-dev:./configure命令需要)
bash
sudo apt update -y
sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g-dev libssl-dev
第二步:下载并解压源码包
bash
# 定义变量方便后续升级
export NGINX_VERSION="nginx-1.22.1"
# 下载
wget https://nginx.org/download/${NGINX_VERSION}.tar.gz
# 解压并进入目录
tar -zxvf ${NGINX_VERSION}.tar.gz
cd ${NGINX_VERSION}
第三步:配置、编译与安装
bash
# 1. 预编译配置,指定安装路径
sudo ./configure --prefix=/usr/local/nginx
# 2. 编译并安装到指定目录
sudo make && sudo make install
第四步:部署自定义配置与静态文件
Nginx 已经安装到了 /usr/local/nginx。现在需要把你自定义的网页文件和配置文件放进去。
bash
# 1. 创建你定义的 Web 根目录
sudo mkdir -p /data/web/www/
# 2. 将你的 index.html 放入该目录(假设 index.html 是你创建的)
sudo cp /path/to/your/index.html /data/web/www/
# 3. 修改或者替换nginx原本的nginx.conf(比如把root换成/data/web/www)
sudo cp /path/to/your/nginx.conf /usr/local/nginx/conf/
第五步:启动nginx,验证是否启动成功
bash
#直接输入这个命令
/usr/local/nginx/sbin/nginx
#curl查看
curl 127.0.0.1
haha <- 我配置的index.html界面
三、Dockerfile自定义构建Nginx
1、自定义文件:index.html
该文件用于最终显示网页的界面
html
hyy blog
2、自定义文件:nginx.conf
该文件用于配置nginx的默认代理路径以及网页资源:
# 核心配置:适配 /usr/local/nginx 安装路径
worker_processes 1; # 工作进程数,默认1即可
events {
worker_connections 1024; # 每个进程最大连接数
}
http {
# 自定义站点配置:适配你的 WEB_ROOT=/data/web/www/
server {
listen 80; # 监听80端口
server_name localhost;
# 网页根目录对应 Dockerfile 中的 WEB_ROOT
root /data/web/www/;
index index.html index.htm;
}
}
3、Dockerfile
bash
# 设置默认linux版本,后面也可以通过docker build --build-arg LINUX_VERSION=XX.X进行修改
ARG LINUX_VERSION=22.04
# 定义ubuntu作为基础镜像
FROM ubuntu:${LINUX_VERSION} as buildbase
#设置维护人信息
MAINTAINER "hyy@blog.com"
#自定义信息
LABEL name="hyy" app="nginx"
# 通过环境变量指定站点路径
ENV WEB_ROOT=/data/web/www/
# 设置默认nginx版本,后续可以通过docker run -e NGINX_VERSION="xx"进行修改
ENV NGINX_VERSION="nginx-1.22.1"
# 下载 获取网络资源、编译/安装/配置nginx的必要工具
RUN apt-get update -y && \
apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g-dev wget
#指定镜像工作目录
WORKDIR /usr/local/src
# 通过刚才下载的wget网络工具,下载nginx源码包
RUN wget https://nginx.org/download/${NGINX_VERSION}.tar.gz
# 解压源码包(tar是ubuntu基础镜像自带的)
RUN tar zxvf ${NGINX_VERSION}.tar.gz
# 编译,打包nginx,
# 启动./configrue需要用到刚才下载的zlib1g-dev工具
RUN cd ./${NGINX_VERSION} && \
./configure --prefix=/usr/local/nginx && \
make && make install
# 把配置文件覆盖到镜像对应路径(修改了index.html文件的读取位置)
COPY ./nginx.conf /usr/local/nginx/conf/
# 拷贝index.html到镜像nginx读取index.html文件的路径
COPY ./index.html ${WEB_ROOT}
# 声明镜像暴露端口
EXPOSE 80/tcp
# nginx启动命令
ENTRYPOINT ["/usr/local/nginx/sbin/nginx"]
# nginx启动参数
CMD ["-g", "daemon off;"]
4、构建/启动容器,并演示
bash
ls -lh
total 12K
-rw-r--r-- 1 root root 684 Mar 5 09:59 Dockerfile
-rw-r--r-- 1 root root 9 Mar 5 09:55 index.html
-rw-r--r-- 1 root root 508 Mar 5 09:58 nginx.conf
# 可以不配置LINUX_VERSION,因为已经设置了默认值
docker build -t --build-arg LINUX_VERSION=22.05 n1:v1 .
docker run -p 8080:80 --name n1 -itd n1:v1
curl 127.0.0.1:8080
hyy blog <-这是自定义的index.html文件
四、小提示
Dockerfile 是宿主机安装逻辑的自动化脚本 。 掌握 Dockerfile 不仅要精通其语法与构建机制,更要透彻理解软件本身的安装细节------语法决定构建镜像的流程能否"跑起来",而对底层细节的掌控决定了构建的镜像是否满足预期。
