其实在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的参数