Dockerfile创建镜像,分层设计
1. Dockerfile的特点
Dockerfile有自己的书写方式和支持的命令,Docker程序读取Dockerfile并根据指令生成Docker镜像,相比手动制作镜像的方式,Dockerfile能更直观的展示镜像时如何产生的。
2.Dockerfile命令
(1)FROM:用于指定父镜像,如centos:7.6.1810,除了注释行,FROM要放在Dockerfile文件的第一行;
(2)ADD:用于添加宿主机的文件、目录等资源到镜像中,会自动解压tar.gz格式压缩包,不会自动解压zip压缩包;
(3)COPY:类似于ADD,也是用于添加宿主机的文件、目录等资源到镜像中,但不会自动解压任何压缩包;
(4)MAINTAINER:标注镜像的作者信息;
(5)LABEL:设置镜像的属性标签;
(6)ENV:用于设置容器的环境变量;
(7)USER:指定运行操作的用户;
(8)RUN:执行shell命令,但必须是非交互式的,例如yum/apt install安装服务一定要加上-y;
(9)VOLUME:用于定义卷,例如将宿主机的某个目录挂载到容器中;
(10)WORKDIR:用于定义工作目录;
(11)EXPOSE:声明要把容器的哪些端口映射到宿主机;
(12)CMD:指定镜像启动为容器时的默认命令或脚本;
(13)ENTRYPOINT:也可以指定容器启动时的命令或脚本,如果和CMD同时使用,会将CMD的命令当做参数传递给ENTRYPOINT后面的脚本。
3.Docker镜像分层
生产中,如果是直接将官方镜像构建成业务镜像,往往会出现两个比较严重的弊端:
(1)工程量大:构建业务镜像时涉及到的操作非常多;
(2)镜像变动需重建镜像:一旦后期镜像发生了变动,需要重新开始一步步构建镜像,所耗费的时间成本比较大。
镜像分层的优势表现为:
(1)最明显的优势在于实现了资源共享,由于多个镜像可能都是在同一个基础镜像上构建而来,宿主机上只需保留一份基础镜像即可,极大地节省了磁盘空间。同时,内存只需加载一份基础镜像,就能为所有使用该基础镜像的容器提供服务;
(2)提高了上传和下载的速度,由于采用了分层,基础镜像如果已经存在相同的内容则不会重复进行上传或下载操作,这也为后期镜像的变动需进行的重建提供了极大的便利。
镜像分层说明:
(1)在制作镜像时,我们的宿主机通过Docker官方或其它途径获取centos、ubuntu或alpine等镜像来启动容器,并进行一些必要的初始化工作,完成后生成基础镜像;
(2)在已完成初始化工作的基础镜像上,我们可能会需要通过源码编译等方式来部署业务所需的容器运行环境,构成基础镜像之上的第二层、第三层镜像;
(3)通过一层层镜像的叠加,最终形成符合企业要求的业务基础镜像,最上面的一层镜像只需添加具体业务要使用的代码即可。
3.使用Dockerfile创建镜像
练习一:创建nginx镜像
(1)规划目录
为了后期能更加方便地对各种类型的业务或系统进行管理,建议提前规划好Dockerfile的目录,以便后期镜像较多时能进行合理分类。
root@docker:/opt#mkdir opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -pv

解析:利用mkdir {目录1{子目录1,子目录2,子目录3},目录2{子目录1,子目录2,子目录3}} -pv创建多级目录,-p为递归创建,-v为显示创建目录的过程。
(2)生成镜像时会在执行命令所处的目录寻找Dockerfile文件,因此要进入到对应的目录中创建Dockerfile文件,并且Dockerfile文件名只能写为Dockerfile或者dockerfile,加其他字符会无法识别。
Dockerfile文件内容如下图所示,安装vim及gcc工具。利用Dockerfile生成镜像时需要用到docker build命令,使用-t选项可以设置标签等信息,后期可能会在此基础上修改并生成新的镜像,因此可以将构建镜像的命令写到脚本中。
编辑Dockerfile文件及centos7-build-comand.sh

安装过程

安装结束

登录容器,检查是否安装了vim及gcc
docker run -it --rm 192.168.3.107/registry/centos7.9-base:v1.0 bash

待续!下一篇制作nginx层镜像。




