首页 > 系统相关 >8、利用构建好的Ubuntu镜像构建Nginx镜像

8、利用构建好的Ubuntu镜像构建Nginx镜像

时间:2023-06-10 12:33:11浏览次数:47  
标签:http ubuntu2004 Nginx -- module nginx 构建 镜像 root

利用DockerFile文件执行docker build基于基础镜像自动构建nginx镜像

做的时候可以找一台宿主机边执行命令,边写Dockerfile
应用级镜像一定要有一个进程是前台执行,进程存在不至于程序启动就退出
CMD:容器启动命令
第一步:按照业务类型或系统类型等方式划分创建目录环境,方便后期镜像比较多的时候进行分类
[root@ubuntu2004 ~]#mkdir -pv /data/dockerfile/{app/{nginx,tomcat,jdk},system/{ubuntu,rocky,alpine}}
[root@ubuntu2004 ~]#tree /data/
/data/
└── dockerfile
    ├── app
    │   ├── jdk
    │   ├── nginx
    │   └── tomcat
    └── system
        ├── alpine
        ├── rocky
        └── ubuntu

9 directories, 0 files
第二步:以做好的ubuntu镜像为基础镜像,因为nginx要在ubuntu上运行  
可以在ubuntu上创建用户和组
[root@ubuntu2004 ~]#cd /data/dockerfile/app/nginx/
下载nginx包
[root@ubuntu2004 nginx]#wget http://nginx.org/download/nginx-1.22.0.tar.gz
[root@ubuntu2004 nginx]#ls
Dockerfile  nginx-1.22.0.tar.gz

写Dockerfile文件
[root@ubuntu2004 nginx]#vim Dockerfile
FROM ubuntu:20.04-20221018-v2.0              #父镜像是制作好的ubuntu镜像
ENV VERSION=1.22.0
ENV NGINX_INSTALL_DIR=/apps/nginx
LABEL Author=mengfanchao version=nginx-${VERSION}
RUN apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev                                   #安装编译nginx所需要的依赖包
ADD ngixn-${VERSION}.tar.gz /usr/local/src/  #把下载好的包复制并解压缩到镜像指定目录
RUN cd /usr/local/src/nginx-${VERSION} && \  #执行shell命令进入目录进行编译
    ./configure --prefix=${NGINX_INSTALL_DIR} --user=www --group=www --with-http_ssl_module \
    --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module \
    --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install
EXPOSE 80                                   #暴露端口80,执行-P可找到随机端口和80的映射关系
CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"] 
#把镜像打成容器的时候,要指定容器启动时默认启动哪个程序作为系统中的第一个进程,并且进程前台运行
#应用级镜像一定要有一个进程是前台执行,进程存在不至于程序启动就退出
#CMD命令可以写多次,但是只有最后一次有效,在docker build不执行,在容器启动时执行

[root@ubuntu2004 nginx]#bash build.sh v1.22.0-`date +%F`
#!/bin/bash

docker build -t nginx:$1 .

跑nginx容器
[root@ubuntu2004 nginx]#docker run nginx:v1.22.0-2022-10-18

打开另外页面 查看运行的容器
[root@ubuntu2004 ubuntu]#docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED              STATUS              PORTS     NAMES
b227af3bef9b   nginx:v1.22.0-2022-10-18   "/apps/nginx/sbin/ng…"   About a minute ago   Up About a minute   80/tcp    gallant_tesla
查看IP
[root@ubuntu2004 nginx]#docker inspect b227af3bef9b
"IPAddress": "172.17.0.2",
访问
[root@ubuntu2004 nginx]#curl 172.17.0.2 -I
HTTP/1.1 200 OK
Server: nginx/1.22.0
Date: Tue, 18 Oct 2022 13:56:51 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 18 Oct 2022 13:48:49 GMT
Connection: keep-alive
ETag: "634eaec1-267"
Accept-Ranges: bytes
第三步:定制web页面   
[root@ubuntu2004 nginx]#mv /data/dockerfile/system/ubuntu/index.html.tar .
[root@ubuntu2004 nginx]#ls
build.sh  Dockerfile  index.html.tar.gz  nginx-1.22.0.tar.gz

修改Dockerfile文件
FROM ubuntu:20.04-20221018-v2.0
ENV VERSION=1.22.0
ENV NGINX_INSTALL_DIR=/apps/nginx
LABEL Author=mengfanchao version=nginx-${VERSION}
RUN apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
ADD nginx-${VERSION}.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-${VERSION} && \
    ./configure --prefix=${NGINX_INSTALL_DIR} --user=www --group=www --with-http_ssl_module \
    --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module \
    --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install
EXPOSE 80
ADD index.html.tar.gz /apps/nginx/html/                #新加的,用来解压文件
CMD ${NGINX_INSTALL_DIR}/sbin/nginx -g "daemon off;"   #两种写法

重新打镜像
[root@ubuntu2004 nginx]#bash build.sh v1.22.0-`date +%F`
查看运行的容器
[root@ubuntu2004 nginx]#docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS          PORTS     NAMES
8d56d4b6c3e9   nginx:v1.22.0-2022-10-18   "/bin/sh -c '${NGINX…"   27 seconds ago   Up 26 seconds   80/tcp    elastic_franklin
查看容易详细内容
[root@ubuntu2004 nginx]#docker inspect 8d56d4b6c3e9
访问
[root@ubuntu2004 nginx]#curl 172.17.0.2
docker websit

退出上面的容器正式跑下面的容器(小p做端口映射)
[root@ubuntu2004 nginx]#docker run -d -p 80:80 --name nginx nginx:v1.22.0-2022-10-18 
595f03958221587f89fecc21baec54078cc5cfa1c950d43042c62116940d5d35
去其他机器进行访问
[root@rocky8 ~]#curl 10.0.0.101
docker website
定制配置文件,把容器里面的配置文件拷贝到宿主机/data/dockerfile/app/nginx/下
[root@ubuntu2004 nginx]#docker cp nginx:/apps/nginx/conf/nginx.conf /data/dockerfile/app/nginx
[root@ubuntu2004 nginx]#ls
build.sh  Dockerfile  index.html.tar.gz  nginx-1.22.0.tar.gz  nginx.conf

修改配置文件(打开日志格式)
vim nginx.conf
worker_processes  auto;                  #进程个数改为和宿主机CPU核数数量一样
log_format access_log_format  '$remote_addr - $remote_user [$time_local] "$request" '          '$status $body_bytes_sent "$http_referer" '
     '"$http_user_agent" "$http_x_forwarded_for"'   
     '$server_name:$server_port';        #自定义访问日志      
gzip  on;                                #开启压缩
charset utf-8;                           #字符集
include /apps/nginx/conf/conf.d/*.conf;  #增加include,后期好扩展

把文件加进去,修改Dockerfile文件
[root@ubuntu2004 nginx]#vim Dockerfile
FROM ubuntu:20.04-20221018-v2.0
ENV VERSION=1.22.0
ENV NGINX_INSTALL_DIR=/apps/nginx
LABEL Author=mengfanchao version=nginx-${VERSION}
RUN apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
ADD nginx-${VERSION}.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-${VERSION} && \
    ./configure --prefix=${NGINX_INSTALL_DIR} --user=www --group=www --with-http_ssl_module \
    --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module \
    --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install
EXPOSE 80
COPY nginx.conf ${NGINX_INSTALL_DIR}/conf/nginx.conf
ADD index.html.tar.gz /apps/nginx/html/
CMD ${NGINX_INSTALL_DIR}/sbin/nginx -g "daemon off;"

重新打镜像
[root@ubuntu2004 nginx]#docker exec -it nginx bash
开启容器
[root@ubuntu2004 nginx]#docker run -d -p 80:80 --name nginx nginx:v1.22.0-2022-10-18 
9c99f741250a683db48ab33ad88ef3e32f983b1643645b0b91c3688ac745bd1c
进入容器进行查看
[root@ubuntu2004 nginx]#docker exec -it nginx bash
查看配置文件
root@9c99f741250a:/# vim /apps/nginx/conf/nginx.conf
ENTRYPOINT指令与CMD指令的关系
1、可以替代CMD
2、如果ENTRYPOINT与CMD共存,ENTRYPOINT的优先级高,将ENTRYPOINT指定的指令作为系统第一个启动的进程,而不是CMD指定的指令,并且CMD指定的指令将沦落为ENTRYPOINT的参数

如下所示:

1、ENTRYPOINT指令替代CMD指令
ENTRYPOINT ${NGINX_INSTALL_DIR}/sbin/nginx -g "daemon off;" #在Dockerfile中用其替代CMD


2、CMD作为ENTRYPOINT的参数 
CMD的指令将作为ENTRYPOINT参数,用"/apps/nginx/sbin/nginx","-g","daemon off;"指令替代
"/docker-entrypoint.sh"指令,最终执行"/apps/nginx/sbin/nginx","-g","daemon off;"

但ENTRYPOINT ["/docker-entrypoint.sh"]成了初始化环境的脚本
脚本之前的命令已经执行完毕,在执行的时候最后一条写的exec "$@",此时CMD便不再是ENTRYPOINT的参数
最终用CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]实现了系统的第一个进程  
如下所示:
ENTRYPOINT指令:做初始化环境用
做一个初始化脚本
#创建配置文件
[root@ubuntu2004 nginx]#vim docker-entrypoint.sh  
#!/bin/bash
mkdir -p /apps/nginx/conf/conf.d
cat > /apps/nginx/conf/conf.d/www.conf <<EOF
server {
    listen 80;
    server_name www.meng.org;
    root /data/website;
}
EOF
exec "$@"     #执行exec "$@"后,CMD便不再是ENTRYPOINT的参数

#exec,用当前的命令把bash替换掉,并保留进程编号。
#如echo $BASHID  是1958
#exec sleep 100
#pstree 可看到sleep替换了bash,进程编号还是1958

[root@ubuntu2004 nginx]#chmod +x docker-entrypoint.sh
[root@ubuntu2004 nginx]#vim Dockerfile
FROM ubuntu:20.04-20221018-v2.0
ENV VERSION=1.22.0
ENV NGINX_INSTALL_DIR=/apps/nginx
LABEL Author=mengfanchao version=nginx-${VERSION}
RUN apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
ADD nginx-${VERSION}.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-${VERSION} && \
    ./configure --prefix=${NGINX_INSTALL_DIR} --user=www --group=www --with-http_ssl_module \
    --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module \
    --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install
EXPOSE 80
COPY nginx.conf ${NGINX_INSTALL_DIR}/conf/nginx.conf
ADD index.html.tar.gz /apps/nginx/html/
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"] 
CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]  

   
打镜像
[root@ubuntu2004 nginx]# bash build.sh v1.22.0-`date +%F`
开启容器
[root@ubuntu2004 nginx]# docker run -d -p 80:80 --name nginx nginx:v1.22.0-2022-10-18
进入容器查看配置文件
[root@ubuntu2004 nginx]#docker exec -it nginx bash
root@7332ad4fdd09:/# cat /apps/nginx/conf/conf.d/www.conf 
server {
    listen 80;
    server_name www.meng.org;
    root /data/website;
}
最终运行的程序是CMD实现的,ENTRYPOINT做初始化环境用

也可以在临时运行中用自己指定的接命令把CMD替了
[root@ubuntu2004 nginx]# docker run -d -p 80:80 --name nginx nginx:v1.22.0-2022-10-18 sleep 1000

标签:http,ubuntu2004,Nginx,--,module,nginx,构建,镜像,root
From: https://blog.51cto.com/mfc001/6454386

相关文章

  • 使用阿里云快速构建海外镜像实战案例
    目录一.github创建项目1.注册账号2.登录github账号3.创建仓库4.添加一个Dockerfile文件二.登录阿里云创建镜像仓库1.进入容器镜像服务页面2.创建命名空间3.创建镜像仓库3.1配置仓库信息3.2配置代码源3.2.1选择代码源3.2.2绑定github账号3.2.3绑定成功3.2.4配置代码源3.2.5......
  • nginx-clojure 源码构建一些问题
    因为nginx-clojure就是一个标准的nginx模块,一些是尝试基于源码进行构建发现一些问题的说明简单说明nginx当前1.25版本的构建是有问题的,1.24版本构建是可以的,1.23版本实际上官方已经提供了但是如果查看nginx官方文档会发现1.23版本的下载官方是似乎移除了,没直接提......
  • nginx-clojure 0.6.0 的一些新特性
    昨天制作了0.6.0的docker镜像,并说明了一些问题,以下简单说明下一些新特性新特性所有的handler可以在http以及servercontext使用了,可以方便进行组合使用nginx1.23.x支持jdk19支持,支持协程了官方提供的二进制构建基于1.23.3说明昨天也说明了,官方提供的二进制包缺......
  • mybatis-动态构建SQL
    又学习到了,今天翻着队友写的代码,我看到了个注解,起初还以为是自定义的,我搜了下才发现,竟然是mybatis自带的这个注解,我竟然不知道,又是孤陋寡闻的一天,记录一下这个注解。查找了下这个注解发现这个注解是四个:我看了下与@Select有啥区别,这个@SelectProvider是能够加多条件判断的,看下面......
  • Docker配置完镜像加速重启失败
    systemctlstatusdocker-l●docker.service-DockerApplicationContainerEngineLoaded:loaded(/usr/lib/systemd/system/docker.service;enabled;vendorpreset:disabled)Active:failed(Result:start-limit)since六2023-06-1009:09:01CST;1m......
  • 内网环境nginx配置https访问
    #!/bin/sh#createself-signedservercertificate:read-p"Enteryourdomain[www.example.com]:"DOMAINecho"Createserverkey..."opensslgenrsa-des3-out$DOMAIN.key2048echo"Createservercertificatesigningrequest.......
  • 构建编译dockerfile docker build报错make: uname: Operation not permitted
    报错信息:查看docker版本#docker-vDockerversion1.13.1,build7d71120/1.13.1在dockerfile中我使用的基础镜像为FROMalpine:3.16.5解决办法是升级docker或者降低Alpine的版本,我这边选择升级docker版本卸载现有docker版本#yum-yremove$(rpm-qa|grepdocker......
  • MDT部署Windows系列 (十二): 进阶篇—制作完美的Win10 22H2系统镜像模板之移除Windows
    前言由于工作等原因(借口),距离发布上一篇MDT系列的文章已经过去一年::twemoji:sweat::上一章我记录了基于MDT如何使用一个Task即可实现制作Windows基础wim镜像+DIY基础软件+捕捉镜像。传送门有好多同学一直咨询在制作捕捉镜像的时候遇到的常见的2个问题:如何彻底的移除掉Windows10中......
  • 使用OCCT构建三角网模型并导出模型文件
    首先需要构建三角网的数据,点集和构成面的点的索引序列,构建成TopoDS_Face后,可以自行选择实现需要导出的文件类型,该功能在DataExchange模块。以下是代码示例//20230606voidApp_20230606(){TColgp_Array1OfPntNodes(1,6);Nodes.SetValue(1,gp_Pnt(0,0,0));N......
  • 构建高可用、高效、安全和可靠的分布式系统:Spring Cloud为开发人员提供便利
    SpringCloud是一个基于Spring框架的云应用开发工具箱,可以快速构建分布式应用程序。它为开发人员提供了许多有用的功能,例如服务发现、负载均衡、配置管理和应用监控等,这些功能可以使分布式系统更加稳定和可靠。如果您还没有了解过SpringCloud,我强烈建议您观看以下这个视频链接:ht......