目前 OCI 主要有三个规范:运行时规范 runtime-spec ,镜像规范 image-spec 以及不常见的镜像仓库规范 distribution-spec
- 操作标准化:容器的标准化操作包括使用标准容器创建、启动、停止容器,使用标准文件系统工具复制和创建容器快照,使用标准化网络工具进行下载和上传。
- 内容无关:内容无关指不管针对的具体容器内容是什么,容器标准操作执行后都能产生同样的效果。如容器可以用同样的方式上传、启动,不管是PHP应用还是MySQL数据库服务。
- 基础设施无关:无论是个人的笔记本电脑还是AWS S3,亦或是OpenStack,或者其它基础设施,都应该对支持容器的各项操作。
- 为自动化量身定制:制定容器统一标准,是的操作内容无关化、平台无关化的根本目的之一,就是为了可以使容器操作全平台自动化。
- 工业级交付:制定容器标准一大目标,就是使软件分发可以达到工业级交付成为现实
image-spec
- Image Manifest - a document describing the components that make up a container image
- Image Index - an annotated index of image manifests
- Image Layout - a filesystem layout representing the contents of an image
- Filesystem Layer - a changeset that describes a container’s filesystem
- Image Configuration - a document determining layer ordering and configuration of the image suitable for translation into a runtime bundle
- Conversion - a document describing how this translation should occur
- Descriptor - a reference that describes the type, metadata and content address of referenced content
layer: 以 layer (镜像层)保存的文件系统,每个 layer 保存了和上层之间变化的部分,layer 应该保存哪些文件,怎么表示增加、修改和删除的文件等
docker inspect
manifest文件,指明跨平台的基础支持,
使用项目默认的 Dockerfile 进行构建的话,镜像大小接近 500MB 😂,而经过一些的优化,将所有的 RUN 指令合并为一条,最终构建出来的镜像大小为 30MB,合并RUN有利于减小镜像大小
docker 在 1.10 以后,只有 RUN、COPY 和 ADD
指令会创建层,其他指令会创建临时的中间镜像,但是不会直接增加构建的镜像大小了。
;
和&&
二者有本质的区别,比如 COMMAND 1;COMMAND 2 ,当 COMMAND 1 运行失败时会继续运行 COMMAND2 ,并不会退出。而 COMMAND 1&& COMMAND 2,时 COMMAND 1 运行成功时才接着运行 COMMAND 2 ,COMMAND 1 运行失败会退出。
docker build 构建镜像的流程大概就是:
- 执行
docker build -t <imageName:Tag> .
,可以使用-f
参数来指定 Dockerfile 文件; - docker 客户端会将构建命令后面指定的路径(
.
)下的所有文件打包成一个 tar 包,发送给 Docker 服务端; - docker 服务端收到客户端发送的 tar 包,然后解压,接下来根据 Dockerfile 里面的指令进行镜像的分层构建;
- docker 下载 FROM 语句中指定的基础镜像,然后将基础镜像的 layer 联合挂载为一层,并在上面创建一个空目录;
- 接着启动一个临时的容器并在 chroot 中启动一个 bash,运行
RUN
语句中的命令:RUN: chroot . /bin/bash -c "apt get update……"
; - 一条
RUN
命令结束后,会把上层目录压缩,形成新镜像中的新的一层; - 如果 Dockerfile 中包含其它命令,就以之前构建的层次为基础,从第二步开始重复创建新层,直到完成所有语句后退出;
- 构建完成之后为该镜像打上 tag;
因为在 Dockerfile 中的 ADD 指令 src 文件如果是个 tar 包,在构建的时候 docker 会帮我们把 tar 包解开到指定目录,使用 copy 指令则不会解开 tar 包。另外一点区别就是 ADD 指令是添加一个文件,这个文件可以是构建上下文环境中的文件,也可以是个 URL,而 COPY 则只能添加构建上下文中的文件,所谓的构建上下文就是我们构建镜像的时候最后一个参数啦。