【容器分层】
每个镜像都是基于一些已有的系统,资源等组合起来的,假设N个镜像都是基于centos7.0系统,如果是直接打包做镜像,就会需要打包N份centos7系统,这对磁盘存储和网络传输都是很大的浪费。容器镜像提供了一个思路,把重复的部分抽取出来,只存放一份centos7,然后N个镜像一起来共享它。这种技术的具体应用,就是分层,术语为layer。
容器镜像内部并不是一个平坦的结构,是由许多镜像层组成的,每层都是只读的,相同的层,可以在镜像之间共享,每个层最上面被封装了一层可输入层,多个层像积木一样搭建后,再使用“Union FS(联合文件系统)”技术把它们合并在一期,形成了最终看到的文件系统。具体的分层信息可以通过命令:docker inspect来查看(例:docker inspect nginx:alpine)。当使用docker pull,rmi这些操作的时候,有很多信息打印,其实就是检查分层,看看是否有重复的分层,重复就不需要重新下载,如果其他镜像在使用某个分层,也不允许删除,这样节约磁盘和网络成本。
【dockerfile】
dockerfile,就像是容器这个样板间的施工图纸,你想做成什么样的样板间,就根据dockerfile来创建。然后使用“docker build -f Dockerfile.busybox .”命令,来构建容器。有几个点要注意
1、这里最后有个“.”,叫构建上下文(build's context),可以理解为构建这个容器需要的相关资源的路径;
2、默认build出来只有image ID,没有名字,参数 -t ,可以指定标签,这样构建的镜像就是这个名字,注意名字要符合命名规范“名字:标签”;
3、-f 带指定的dockerfile,如果不写,默认就找当前目录下名字是dockerfile的文件
dockerfile有几个重要参数,不区分大小写,但是通常都都会大写。每个指令都会生成一个layer:
FROM:基于哪个镜像开始构建。dockerfile里,第一个指令必须是FROM;
RUN:运行shell命令,比如更新系统,安装应用等,命令之间用“&&”分割,每行末尾用续航符“\”。但是一个run下面带太多的具体shell命令,不美观,也不方便修改,可以把这些shell命令集合到一个文件里,然后用RUN来执行;
COPY:拷贝文件;
------------>
ARG:创建的变量,只在镜像构建过程中可见,容器运行时不可见;
ENV:创建的变量,不仅能够在构建镜像的过程中使用,在容器运行时也能够以环境变量形式被应用程序使用;
EXPOSE:声明容器对外接口,如443,53等
【dockerfile实例】
标签:容器,kubernetes,chrono,Dockerfile,分层,构建,镜像,docker,dockerfile From: https://www.cnblogs.com/1234roro/p/16847995.html