Docker镜像-基于DockerFile制作编译版nginx镜像

          Docker镜像-基于DockerFile制作编译版nginx镜像

                                     作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

 

一.下载nginx的安装包

1>.打开nginx官网,找到最新稳定版下载即可(http://nginx.org/en/download.html)

Docker镜像-基于DockerFile制作编译版nginx镜像_第1张图片

2>.下载nginx安装包

[[email protected] ~]# 
[[email protected] ~]# cd /yinzhengjie/softwares/dockerfile/web/nginx/
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# ll
total 12
-rwxr-xr-x 1 root root  461 Jan 21 16:37 docker-build.sh
-rw-r--r-- 1 root root 1833 Jan 21 16:44 Dockerfile
-rw-r--r-- 1 root root 1979 Jan 21 16:31 nginx.conf
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# wget http://nginx.org/download/nginx-1.14.2.tar.gz
--2020-01-21 16:53:09--  http://nginx.org/download/nginx-1.14.2.tar.gz
Resolving nginx.org (nginx.org)... 95.211.80.227, 62.210.92.35, 2001:1af8:4060:a004:21::e3
Connecting to nginx.org (nginx.org)|95.211.80.227|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1015384 (992K) [application/octet-stream]
Saving to: ‘nginx-1.14.2.tar.gz’

100%[==================================================================================================================================>] 1,015,384    355KB/s   in 2.8s   

2020-01-21 16:53:13 (355 KB/s) - ‘nginx-1.14.2.tar.gz’ saved [1015384/1015384]

[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# ll
total 1004
-rwxr-xr-x 1 root root     461 Jan 21 16:37 docker-build.sh
-rw-r--r-- 1 root root    1833 Jan 21 16:44 Dockerfile
-rw-r--r-- 1 root root 1015384 Dec  4  2018 nginx-1.14.2.tar.gz
-rw-r--r-- 1 root root    1979 Jan 21 16:31 nginx.conf
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 

3>.属性编译安装nginx的步骤(如果你不清楚nginx的编译步骤请估计写不出来Dockerfile的,因此你得了解nginx的编译安装步骤,不熟悉的没关系,看一下我之前的笔记即可,熟悉的同学跳过该步骤)

博主推荐阅读:
  https://www.cnblogs.com/yinzhengjie/p/12031651.html

 

二.准备测试数据

1>.模拟打包生产环境代码

[[email protected] ~]# 
[[email protected] ~]# ll
total 0
[[email protected] ~]# 
[[email protected] ~]# echo "

YinZhengjie's Nginx Web Server

" > index.html [[email protected] ~]# [[email protected] ~]# echo "

YinZhengjie's Nginx Web Server 2020

" > index2020.html [[email protected] ~]# [[email protected] ~]# ll total 8 -rw-r--r-- 1 root root 45 Jan 21 17:38 index2020.html -rw-r--r-- 1 root root 40 Jan 21 17:38 index.html [[email protected] ~]# [[email protected] ~]# tar zcvf code.tar.gz index* index2020.html index.html [[email protected] ~]# [[email protected] ~]# ll total 12 -rw-r--r-- 1 root root 197 Jan 21 17:38 code.tar.gz -rw-r--r-- 1 root root 45 Jan 21 17:38 index2020.html -rw-r--r-- 1 root root 40 Jan 21 17:38 index.html [[email protected] ~]# [[email protected] ~]# ll /yinzhengjie/softwares/dockerfile/web/nginx/ total 1004 -rwxr-xr-x 1 root root 461 Jan 21 16:37 docker-build.sh -rw-r--r-- 1 root root 2603 Jan 21 17:34 Dockerfile -rw-r--r-- 1 root root 1015384 Dec 4 2018 nginx-1.14.2.tar.gz -rw-r--r-- 1 root root 1979 Jan 21 16:31 nginx.conf [[email protected] ~]# [[email protected] ~]# cp code.tar.gz /yinzhengjie/softwares/dockerfile/web/nginx/ [[email protected] ~]# [[email protected] ~]# cd /yinzhengjie/softwares/dockerfile/web/nginx/ [[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# [[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# ll total 1008 -rw-r--r-- 1 root root 197 Jan 21 17:39 code.tar.gz -rwxr-xr-x 1 root root 461 Jan 21 16:37 docker-build.sh -rw-r--r-- 1 root root 2603 Jan 21 17:34 Dockerfile -rw-r--r-- 1 root root 1015384 Dec 4 2018 nginx-1.14.2.tar.gz -rw-r--r-- 1 root root 1979 Jan 21 16:31 nginx.conf [[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]#

Docker镜像-基于DockerFile制作编译版nginx镜像_第2张图片

2>.编写nginx的配置文件

[[email protected] ~]# cat /yinzhengjie/softwares/dockerfile/web/nginx/nginx.conf 
user nginx;

worker_processes auto;

#错误日志也应该指定到咱们编译安装的nginx目录中
error_log /yinzhengjie/softwares/nginx/logs/error.log;

pid /run/nginx.pid;

#Docker最终运行Nginx建议大家把后台进程关闭,默认是"on".
daemon off;

events {
    worker_connections 1024;
}
   
http {
    #自定义Nginx的日志格式
    log_format my_access_json '{"@timestamp":"$time_iso8601",' 
                               '"host":"$server_addr",' 
                          '"clientip":"$remote_addr",' 
                           '"size":$body_bytes_sent,' 
                          '"responsetime":$request_time,' 
                          '"upstreamtime":"$upstream_response_time",' 
                          '"upstreamhost":"$upstream_addr",' 
                          '"http_host":"$host",' 
                          '"uri":"$uri",' 
                          '"domain":"$host",' 
                          '"xff":"$http_x_forwarded_for",' 
                          '"referer":"$http_referer",' 
                          '"tcp_xff":"$proxy_protocol_addr",' 
                          '"http_user_agent":"$http_user_agent",' 
                          '"status":"$status"}';
    #同理,我们将访问日志也放到咱们编译安装nginx的目录中             
    access_log /yinzhengjie/softwares/nginx/logs/access_json.log my_access_json;

    sendfile            on;
    keepalive_timeout   65;
    include       mime.types;
    default_type  text/html;
    charset utf-8;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;

        #别忘记修改站点代码的根目录也要指定到咱们编译安装nginx的目录中哟~
        root         /yinzhengjie/softwares/nginx/html;
        location / {
        }
        error_page 404 /404.html;             
        location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}
[[email protected] ~]# 
[[email protected] ~]# 

3>.编写快速编译docker的脚本(我这里就是抛砖引玉了,你可以自行优化)

[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# cat docker-build.sh 
#!/bin/bash
#
#********************************************************************
#Author:        yinzhengjie
#QQ:             1053419035
#Date:             2020-01-18
#FileName:        docker-build.sh
#URL:             http://www.cnblogs.com/yinzhengjie
#Description:        The test script
#Copyright (C):     2020 All rights reserved
#********************************************************************


TAG=$1

docker image build -t nginx:${TAG} ./
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 

 Docker镜像-基于DockerFile制作编译版nginx镜像_第3张图片

4>.编写Dockerfile

[[email protected] ~]# cat /yinzhengjie/softwares/dockerfile/web/nginx/Dockerfile 
#********************************************************************
#Author:        yinzhengjie
#QQ:             1053419035
#Date:             2019-11-25
#Blog:             http://www.cnblogs.com/yinzhengjie
#Description:        YinZhengjie's Nginx Dockerfile
#Copyright notice:     original works, no reprint! Otherwise, legal liability will be investigated.
#********************************************************************

#第一行先定义基础镜像,表示当前镜像文件是基于哪个进行编辑的.
FROM centos:centos7.6.1810

#指定镜像维护者的信息.
MAINTAINER Jason.Yin [email protected]

#除了安装编译nginx的依赖的安装包外,还可以将一些常用的命令工具也安装上
#类似于这样的安装命令(或者经常改动相对较小的命令)应该尽量往前写,这样在多次编译时就不会重复执行了(因为默认会使用缓存),从而提升编译效率.
RUN yum -y install epel-release && yum -y install vim net-tools bridge-utils firewalld bc iotop bc gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel zip unzip zlib-devel lrzsz tree ntpdate telnet lsof tcpdump wget libevent libevent-devel systemd-devel bash-completion traceroute psmisc 

#将
"nginx-1.14.2.tar.gz"安装包文件解压到"/usr/local/src"目录中 #相比COPY指令,ADD指令可以解压"*.tar.gz"的文件,但如果你的安装包是"*.zip"文件的话,ADD指令也不好使,得咱们自己使用unzip相关命令自行解压,索性我上面已经安装了unzip相关的软件包
ADD nginx
-1.14.2.tar.gz /usr/local/src #编译安装nginx RUN cd /usr/local/src/nginx-1.14.2 && ./configure --prefix=/yinzhengjie/softwares/nginx --user=nginx --group=nginx --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 && ln -sv /yinzhengjie/softwares/nginx/sbin/nginx /usr/sbin/nginx
#将nginx的配置文件放在镜像的指定编译安装的目录
"/yinzhengjie/softwares/nginx/conf" COPY nginx.conf /yinzhengjie/softwares/nginx/conf #将测试代码解压到咱们编译安装的nginx网站默认根目录中 ADD code.tar.gz /yinzhengjie/softwares/nginx/html #创建nginx用户,yum方式安装无需做此步骤,因为默认yum安装会自动创建nginx用户,咱们上面指令了以nginx用户运行,因此我们需要在镜像中创建"nginx用户" RUN useradd nginx -s /sbin/nologin -u 2000 #定义向外暴露的端口号,多个端口用空格做间隔,启动容器的时候"-p"需要使用此端向外端映射. EXPOSE 80/tcp 443/tcp #定义前台运行的命令,每个Docker只能有一条,如果定义了多条"CMD"指令那么最后一条CMD指令会覆盖之前的(即只有最后一条CMD被执行). CMD ["nginx"] [[email protected] ~]# [[email protected] ~]#

5>.编译生成nginx镜像

[[email protected] ~]# docker image ls
REPOSITORY          TAG                       IMAGE ID            CREATED             SIZE
nginx               make-v0.1-20200121-0846   5d81119e1e53        9 minutes ago       590MB
                                  fd9dcda01aa8        12 minutes ago      590MB
                                  896b954fd6d4        14 minutes ago      590MB
                                  88d854efd276        18 minutes ago      589MB
                                  252190d9a459        53 minutes ago      589MB
centos              centos7.6.1810            f1cb7c7d58b7        10 months ago       202MB
[[email protected] ~]# 
[[email protected] ~]# 
[[email protected] ~]# cd /yinzhengjie/softwares/dockerfile/web/nginx/
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# ll
total 1008
-rw-r--r-- 1 root root     197 Jan 21 17:39 code.tar.gz
-rwxr-xr-x 1 root root     461 Jan 21 16:37 docker-build.sh
-rw-r--r-- 1 root root    2867 Jan 21 18:02 Dockerfile
-rw-r--r-- 1 root root 1015384 Dec  4  2018 nginx-1.14.2.tar.gz
-rw-r--r-- 1 root root    2198 Jan 21 18:12 nginx.conf
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# ./docker-build.sh make-v0.1-20200121-0846
Sending build context to Docker daemon  1.026MB
Step 1/10 : FROM centos:centos7.6.1810
 ---> f1cb7c7d58b7
Step 2/10 : MAINTAINER Jason.Yin [email protected]
 ---> Using cache
 ---> 44bbf438782f
Step 3/10 : RUN yum -y install epel-release && yum -y install vim net-tools bridge-utils firewalld bc iotop bc gcc gcc-c++ glibc glibc-devel pcre pcre-
devel openssl openssl-devel zip unzip zlib-devel lrzsz tree ntpdate telnet lsof tcpdump wget libevent libevent-devel systemd-devel bash-completion traceroute psmisc ---> Using cache
 ---> c8282c8fcd0c
Step 4/10 : ADD nginx-1.14.2.tar.gz /usr/local/src
 ---> Using cache
 ---> 117d35e96dc3
Step 5/10 : RUN cd /usr/local/src/nginx-1.14.2 && ./configure --prefix=/yinzhengjie/softwares/nginx --user=nginx --group=nginx --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 && ln -sv /yinzhengjie/softwares/nginx/sbin/nginx /usr/sbin/nginx ---> Using cache
 ---> 5b687e6a0dad
Step 6/10 : COPY nginx.conf /yinzhengjie/softwares/nginx/conf
 ---> 2891153689a3
Step 7/10 : ADD code.tar.gz /yinzhengjie/softwares/nginx/html
 ---> a4847d0e3b19
Step 8/10 : RUN useradd nginx -s /sbin/nologin -u 2000
 ---> Running in 7562ef0c366a
Removing intermediate container 7562ef0c366a
 ---> e700a97c15de
Step 9/10 : EXPOSE 80/tcp 443/tcp
 ---> Running in cdc6364a25e7
Removing intermediate container cdc6364a25e7
 ---> fdc19386ef1f
Step 10/10 : CMD ["nginx"]
 ---> Running in acc980fae2ad
Removing intermediate container acc980fae2ad
 ---> e8520d2c15ae
Successfully built e8520d2c15ae
Successfully tagged nginx:make-v0.1-20200121-0846
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# docker image ls
REPOSITORY          TAG                       IMAGE ID            CREATED             SIZE
nginx               make-v0.1-20200121-0846   e8520d2c15ae        3 seconds ago       590MB
                                  5d81119e1e53        9 minutes ago       590MB
                                  fd9dcda01aa8        13 minutes ago      590MB
                                  896b954fd6d4        14 minutes ago      590MB
                                  88d854efd276        18 minutes ago      589MB
                                  252190d9a459        54 minutes ago      589MB
centos              centos7.6.1810            f1cb7c7d58b7        10 months ago       202MB
[[email protected] /yinzhengjie/softwares/dockerfile/web/nginx]# 

 

三.验证编译版本的nginx镜像

1>.运行容器

[[email protected] ~]# docker image ls
REPOSITORY          TAG                       IMAGE ID            CREATED             SIZE
nginx               make-v0.1-20200121-0846   e8520d2c15ae        About an hour ago   590MB
                                  5d81119e1e53        About an hour ago   590MB
                                  fd9dcda01aa8        About an hour ago   590MB
                                  896b954fd6d4        About an hour ago   590MB
                                  88d854efd276        About an hour ago   589MB
                                  252190d9a459        2 hours ago         589MB
centos              centos7.6.1810            f1cb7c7d58b7        10 months ago       202MB
[[email protected] ~]# 
[[email protected] ~]# docker container run -it --rm -p 172.200.3.101:8080:80 --name myNginx --hostname yinzhengjie nginx:make-v0.1-20200121-0846       #运行容器后会阻塞在当前终端,需要再开启一个终端连接该容器,如下图所示。

Docker镜像-基于DockerFile制作编译版nginx镜像_第4张图片

2>.客户端访问时最好先连接容器查看日志记录

[[email protected] ~]# 
[[email protected] ~]# docker container ls
CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                                 NAMES
86cbd7aa982c        nginx:make-v0.1-20200121-0846   "nginx"             5 minutes ago       Up 5 minutes        443/tcp, 172.200.3.101:8080->80/tcp   myNginx
[[email protected] ~]# 
[[email protected] ~]# docker container inspect -f "{{.NetworkSettings.IPAddress}}" myNginx
172.17.0.2
[[email protected] ~]# 
[[email protected] ~]# ss -ntl
State      Recv-Q Send-Q                                                 Local Address:Port                                                                Peer Address:Port              
LISTEN     0      20480                                                  172.200.3.101:8080                                                                           *:*                  
LISTEN     0      128                                                                *:22                                                                             *:*                  
LISTEN     0      128                                                               :::22                                                                            :::*                  
[[email protected] ~]# 
[[email protected] ~]# docker container exec -it myNginx bash
[root@yinzhengjie /]# 
[root@yinzhengjie /]# tail -10f /yinzhengjie/softwares/nginx/logs/access_json.log 
{"@timestamp":"2020-01-21T11:29:57+00:00","host":"172.17.0.2",       '"clientip":"172.200.0.1",'      "size":0,       '"responsetime":0.000,'       '"upstreamtim
e":"-",'       '"upstreamhost":"-",'       '"http_host":"docker101.yinzhengjie.org.cn",'       '"uri":"/index.html",'       '"domain":"docker101.yinzhengjie.org.cn",'       '"xff":"-",'       '"referer":"-",'       '"tcp_xff":"",'       '"http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36",'       '"status":"304"}'{"@timestamp":"2020-01-21T11:30:31+00:00","host":"172.17.0.2",       '"clientip":"172.200.0.1",'      "size":45,       '"responsetime":0.000,'       '"upstreamti
me":"-",'       '"upstreamhost":"-",'       '"http_host":"docker101.yinzhengjie.org.cn",'       '"uri":"/index2020.html",'       '"domain":"docker101.yinzhengjie.org.cn",'       '"xff":"-",'       '"referer":"-",'       '"tcp_xff":"",'       '"http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36",'       '"status":"200"}'

Docker镜像-基于DockerFile制作编译版nginx镜像_第5张图片

你可能感兴趣的:(Docker镜像-基于DockerFile制作编译版nginx镜像)