使用Dockerfile编写源码安装Nginx镜像

简介: 使用Dockerfile编写源码安装Nginx镜像

 其实在Docker仓库中,存在nginx容器镜像,但是我们为什么还有自己来编写呢,是因为有的时候仓库中的版本,并非我们在需要的版本镜像,还有一点就因为安全问题,毕竟别人家的东西哪有自己家的东西用着安心呢。

       Dockerfile是使用源代码构建docker的镜像,编辑一个Dockerfile,而后根据此文件制作;docker可以自动通过读取Dockerfile中的指令,自动构建镜像。Dockerfile是一个文本文档包含所有用户的命令,可以在命令行上调用组建一个镜像。使用docker build命令的用户可以读取docker file中的连续指令,自动构建一个镜像。

一,构建nginx镜像

创建目录存放相关文件

1. mkdir nginxdockerfile
2. cd nginxdockerfile
3. echo "docker nginx build successful" > index.html

创建dockerfile文件

1. vi Dockerfile
2. FROM centos:7
3. LABEL version="nginx v1"
4. LABEL "emill"="243254384@qq.com"
5. RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
6. WORKDIR /usr/local/src
7. ENV NG_VERSION=nginx-1.25.1
8. RUN yum -y install epel-release
9. RUN yum -y install wget
10. RUN wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz 
11. RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
12. RUN yum clean all 
13. RUN useradd -M -s /sbin/nologin nginx 
14. WORKDIR /usr/local/src/$NG_VERSION
15. RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
16. ADD index.html /usr/local/nginx/html 
17. VOLUME /usr/local/nginx/html 
18. ENV PATH /usr/local/nginx/sbin:$PATH
19. EXPOSE 80/tcp 
20. ENTRYPOINT ["nginx"]
21. CMD ["-g","daemon off;"]

构建镜像

docker build -t centos7:nginx .

运行容器

docker run -d --name nginx -p 8080:80 centos7:nginx

访问即可

http://IP:8080

二,详细介绍使用的模块

1. #基准镜像
2. FROM centos:7
3. #作者信息
4. LABEL version="nginx v1"
5. LABEL "emill"="243254384@qq.com"
6. #调整系统时间差
7. RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
8. #工作目录
9. WORKDIR /usr/local/src/ 
10. #定义环境变量
11. ENV NG_VERSION nginx-1.21.0 
12. #安装epel仓库
13. RUN yum -y install epel-release 
14. #安装wget
15. RUN yum -y install wget 
16. #下载nginx文件并解压
17. RUN wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz 
18. #安装编译依赖包
19. RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
20. #清理仓库
21. RUN yum clean all 
22. #创建nginx用户
23. RUN useradd -M -s /sbin/nologin nginx 
24. #切换工作目录
25. WORKDIR /usr/local/src/$NG_VERSION
26. #编译安装nginx
27. RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
28. #复制测试页面到容器中
29. ADD index.html /usr/local/nginx/html 
30. #设置容器中要挂在到宿主机的目录
31. VOLUME /usr/local/nginx/html 
32. #设置sbin环境变量
33. ENV PATH /usr/local/nginx/sbin:$PATH
34. #暴露80端口
35. EXPOSE 80/tcp 
36. ENTRYPOINT ["nginx"]
37. CMD ["-g","daemon off;"]
38. #当ENTRYPOINT和CMD连用时,CMD的命令是ENTRYPOINT命令的参数,两者连用相当于nginx -g "daemon off;"而当一起连用的时候命令格式最好一致(这里选择的都是json格式的是成功的,如果都是sh模式可以试一下)
1.FROM

功能为指定基础镜像,并且必须是第一条指令。 如果不以任何镜像为基础,那么写法为:FROM scratch。 同 时意味着接下来所写的指令将作为镜像的第一层开始

2.RUN

功能为运行指定的命令

注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多 少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 RUN书写时的换行 符是\

3.CMD

功能为容器启动时要运行的命令

注意:补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。 原因是参数传递后,docker解析的是一个JSON array

4.RUN和CMD的区别

不要把RUN和CMD搞混了。 RUN是构件容器时就运行的命令以及提交运行结果 CMD是容器启动时执行的命 令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子

5.LABEL

功能是为镜像指定标签,为镜像写一些注释信息

但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号 如下:

注意:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖

6.EXPOSE

功能为暴漏容器运行时的监听端口给外部 但是EXPOSE并不会vim 使容器访问主机的端口 如果想使得容器与主 机的端口有映射关系,必须在容器启动的时候加上 -P参数

注意:如果在端口号后面加/tcp,默认为tcp协议,如果需要UDP端口需要添加/udp

7.ENV

功能为设置环境变量

8.ADD

一个复制命令,把文件复制到镜象中。 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似 于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。

注意:尽量不要把写成一个文件夹,如果是一个文件夹了,复制整个目录的内容,包括文件系统元数据

9.WORKDIR

设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次

10.VOLUME

可实现挂载功能,可以将内部文件夹挂载到外部

11.ENTRYPOINT

该命令与CMD类似,用于执行命令使用,还可以与CMD命令一起拼合使用

它与CMD的区别:  相同点:只能写一条,如果写多条,那么只有最后一条生效

不同点:CMD在创建容器时,在后面添加其他的CMD指令,CMD会被覆盖,但是ENTRYPOINT不会被覆盖,如果两个同时使用,CMD会变成ENTRYPOINT的参数

目录
相关文章
|
3月前
|
Unix 应用服务中间件 Linux
1-Nginx介绍及安装(源码安装)
1-Nginx介绍及安装(源码安装)
44 4
|
3月前
|
缓存 应用服务中间件 nginx
Docker六脉神剑 (三) 编写Dockerfile构建nginx镜像并推送到远程仓库给其他人使用
Docker六脉神剑 (三) 编写Dockerfile构建nginx镜像并推送到远程仓库给其他人使用
31 0
|
8月前
|
缓存 负载均衡 算法
nginx源码安装和基础配置
nginx: 世界最大web服务器软件,以高并发、低消耗著称,源自于俄罗斯,创建者 Igor(伊戈尔),2004年开源,最早以代理服务器的身份出现,2015成立nginx公司, 2019年以6.7亿被F5 Networks公司收购。
105 0
nginx源码安装和基础配置
|
8月前
|
缓存 负载均衡 算法
nginx源码安装和基础配置
nginx源码安装和基础配置
90 0
|
8月前
|
应用服务中间件 Linux nginx
docker实战之通过nginx镜像来部署静态页
docker实战之通过nginx镜像来部署静态页
255 0
|
8月前
|
应用服务中间件 nginx
Nginx的源码安装
Nginx的源码安装
91 0
|
8月前
|
tengine 安全 应用服务中间件
源码安装----Tengine(nginx的进阶版)
源码安装----Tengine(nginx的进阶版)
259 1
|
9月前
|
缓存 前端开发 应用服务中间件
Docker六脉神剑 (三) 编写Dockerfile构建nginx镜像并推送到远程仓库给其他人使用
Docker六脉神剑 (三) 编写Dockerfile构建nginx镜像并推送到远程仓库给其他人使用
220 0
Docker六脉神剑 (三) 编写Dockerfile构建nginx镜像并推送到远程仓库给其他人使用
|
26天前
|
运维 前端开发 应用服务中间件
LNMP详解(八)——Nginx动静分离实战配置
LNMP详解(八)——Nginx动静分离实战配置
28 0