Dockerfile实践-构建Nginx镜像

文章目录

注意:

本博客以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 不仅要精通其语法与构建机制,更要透彻理解软件本身的安装细节------语法决定构建镜像的流程能否"跑起来",而对底层细节的掌控决定了构建的镜像是否满足预期。


相关推荐
upp20 小时前
[最新版本centos 10系统制作与安装]
linux·运维·centos
一战成名99620 小时前
ToDesk全球节点 vs TeamViewer、AnyDesk延迟与稳定性对比
运维·服务器·teamviewer
pupudawang21 小时前
Linux下安装Nginx服务及systemctl方式管理nginx详情
linux·运维·nginx
ipad协议开发21 小时前
视频号直播间全功能自动化场控插件开发指南:基于 API 调用的全链路拆解
运维·微信·自动化·视频·ipad
维度攻城狮1 天前
Docker优雅地运行OpenClaw
运维·docker·容器·openclaw·openclaw安装
淼淼爱喝水1 天前
openEuler 下 Ansible 基础命令详解与实操演示2
linux·运维·windows
拾贰_C1 天前
【Ubuntu | install | 安装软件】 Ubuntu软件安装多种方式以及卸载
linux·运维·ubuntu
梦想的旅途21 天前
效率革命:实现外部群聊信息的自动化同步方案
运维·自动化
杨云龙UP1 天前
Linux生产环境下Oracle RMAN 备份、核查、清理与验证常用命令整理_20260330
linux·运维·服务器·数据库·oracle
网硕互联的小客服1 天前
CentOS系统如何卸载桌面并以shell 字符界面启动?
运维·服务器·网络·安全