在使用容器化部署项目的过程中,我们经常会需要用到 nginx
镜像来作为前端服务的基础镜像,或者作为后端服务的转发和负载均衡。今天我们就一起来看一下如何使用 Dockerfile
构建 nginx
基础镜像。
这里主要介绍三种构建方式:
通过 yum
安装方式构建: 无需手动编译安装,可以在联网的情况下直接将 nginx 安装到镜像中,操作较为简单。
镜像大小:271M
通过编译源码包方式构建: 需要提前下载官网源码包,安装编译环境并手动编译安装到镜像中,手动配置环境变量,操作较为复杂。
镜像大小:555M
通过直接使用安装包方式构建: 需要提前将官网的源码包编译好,直接拷贝到容器中,手动配置环境变量即可,操作比较简单。
镜像大小:273M
创建一个目录 nginx-base1
,创建 Dockerfile
文本文件,输入如下内容:
FROM quay.io/centos/centos:stream9
RUN yum -q -y update && yum -q -y upgrade \
&& yum install -y tzdata vim less ncurses telnet wget zip unzip traceroute procps net-tools iproute tcpdump nginx \
&& ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& yum clean all \
&& echo "alias ls='ls --color'" >> ~/.bashrc \
&& echo "alias ll='ls -l'" >> ~/.bashrc \
&& echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
ENTRYPOINT ["nginx"]
CMD ["-c","/etc/nginx/nginx.conf"]
注意: 由于 nginx
命令默认执行完后会转入后台,当使用 docker 容器启动时我们需要 nginx
一直在前台运行,有两种方式:
方法一:在 nginx.conf
末尾追加 "daemon off;"
;
echo "daemon off;" >> /etc/nginx/nginx.conf
方法二:使用 nginx -g "daemon off;"
方式启动。
ENTRYPOINT ["nginx","-g","daemon off;"]
执行如下命令,构建 docker 镜像:
docker build -t nginx-base1:v1 .
执行结果:(我本地之前已经构建过了,所以比较快)
查看构建好的镜像:
docker images
执行结果:(镜像大小:271MB)
执行如下命令,创建 docker 容器:
docker run -d -p 81:80 --name=nginx-base1 nginx-base1:v1
执行结果:
查看创建好的容器:
docker ps
执行结果:
访问页面:http://localhost:81
(如果有下载编译好的 Nginx 安装包,可以跳过编译,采用第三种方式,更为便捷)
1.22.1版本编译后Nginx安装包下载地址: https://download.csdn.net/download/qq_33204709/87591370
通过 nginx 官网下载安装包并编译安装教程可以参考:https://blog.csdn.net/qq_33204709/article/details/129632895
FROM quay.io/centos/centos:stream9
# nginx 文件夹名称
ENV NGINX_NAME=nginx-1.22.1
# nginx 源码包路径
ENV NGINX_SRC_DIR=/usr/local/src
# nginx 安装路径
ENV NGINX_HOME=/usr/local/$NGINX_NAME
# 拷贝源码包
ADD nginx-1.22.1.tar.gz $NGINX_SRC_DIR
RUN yum -q -y update && yum -q -y upgrade \
# 安装基础组件
&& yum install -y tzdata vim less ncurses telnet wget zip unzip traceroute procps net-tools iproute tcpdump \
# 安装编译组件
&& yum install -y gcc gcc-c++ autoconf automake make openssl openssl-devel pcre pcre-devel zlib-devel \
&& ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& yum clean all \
&& echo "alias ls='ls --color'" >> ~/.bashrc \
&& echo "alias ll='ls -l'" >> ~/.bashrc \
# 配置基本信息
&& cd $NGINX_SRC_DIR/$NGINX_NAME && ./configure --prefix=$NGINX_HOME --with-http_ssl_module --with-http_stub_status_module \
# 编译安装
&& cd $NGINX_SRC_DIR/$NGINX_NAME && make && make install
# 配置环境变量
ENV PATH=$PATH:$NGINX_HOME/sbin
EXPOSE 80
ENTRYPOINT ["nginx","-g","daemon off;"]
CMD ["-c","conf/nginx.conf"]
执行如下命令,构建 docker 镜像:
docker build -t nginx-base2:v1 .
执行结果:(耗时较长,我本地执行了11分钟)
查看构建好的镜像:
docker images
执行结果:(镜像大小:555MB)
执行如下命令,创建 docker 容器:
docker run -d -p 82:80 --name=nginx-base2 nginx-base2:v1
执行结果:
查看创建好的容器:
docker ps --no-tunc
执行结果:
访问页面:http://localhost:82
这里的安装包指的是通过源码包编译安装后的文件夹打包。
(如果有下载编译好的 Nginx 安装包,可以跳过此步)
1.22.1版本编译后Nginx安装包下载地址: https://download.csdn.net/download/qq_33204709/87591370
我这里是将第二种方式构建好的安装包直接导出到本地,用作以后构建使用。(如果有其他方式获取,欢迎评论学习)
将安装目录压缩打包命令如下:
tar -zcvf nginx-1.22.1-install.tar.gz nginx-1.22.1
执行结果:
将压缩包从容器复制到本地命令:
docker cp nginx-base2:/usr/local/nginx-1.22.1-install.tar.gz .
FROM quay.io/centos/centos:stream9
# 基础目录
ENV BASE_DIR=/usr/local
# nginx 安装路径
ENV NGINX_HOME=$BASE_DIR/nginx-1.22.1
# 拷贝安装包
ADD nginx-1.22.1-install.tar.gz $BASE_DIR
RUN yum -q -y update && yum -q -y upgrade \
# 安装基础组件
&& yum install -y tzdata vim less ncurses telnet wget zip unzip traceroute procps net-tools iproute tcpdump \
&& ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& yum clean all \
&& echo "alias ls='ls --color'" >> ~/.bashrc \
&& echo "alias ll='ls -l'" >> ~/.bashrc
# 配置环境变量
ENV PATH=$PATH:$NGINX_HOME/sbin
EXPOSE 80
ENTRYPOINT ["nginx","-g","daemon off;"]
CMD ["-c","conf/nginx.conf"]
执行如下命令,构建 docker 镜像:
docker build -t nginx-base3:v1 .
执行结果:
查看构建好的镜像:
docker images
执行结果:(镜像大小:273MB)
执行如下命令,创建 docker 容器:
docker run -d -p 83:80 --name=nginx-base3 nginx-base3:v1
执行结果:
访问页面:http://localhost:83
整理完毕,完结撒花~