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


相关推荐
一叶飘零_sweeeet4 小时前
Docker Compose实战指南
运维·docker·容器
亚空间仓鼠4 小时前
Docker 容器技术入门与实践 (六):Docker镜像瘦身
docker·容器·eureka
Bruce_Liuxiaowei4 小时前
Windows防火墙规则导出工具:让安全配置可备份、可迁移、可审计
运维·windows·安全·网络安全
SPC的存折5 小时前
10、Docker容器故障排查
linux·运维·数据库·docker·容器
liuyunshengsir5 小时前
linux 下新增用户后无法使用TAB补全功能的最佳解决方法
linux·运维·服务器
志栋智能6 小时前
超自动化巡检:驱动运维团队从操作走向优化
运维·服务器·自动化
乌托邦的逃亡者7 小时前
Dockerfile的配置和使用
linux·运维·docker·容器
小此方7 小时前
Re:Linux系统篇(三)指令篇 · 二:十二个高频指令精讲+重定向操作+“一切皆文件“深入理解
linux·运维·服务器
七七powerful7 小时前
loki监控docker容器&系统&nginx日志的告警规则
nginx·docker·容器
用户1401056775197 小时前
线上接口偶发超时,最后发现是 conntrack 打满:一次网络故障排查实战
运维