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


相关推荐
XIAOHEZIcode1 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
武子康2 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
ping某3 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树885 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠5 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn865 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智5 天前
ARP代理--工作原理
运维·网络·arp·arp代理