Docker 里的基础术语
1、镜像
镜像是一个只读模板,包含创建 Docker 容器的说明。通常,一个镜像基于另一个镜像附带一些额外的配置。例如,可以构建一个基于 Ubuntu 镜像的镜像,但在里面安装 Apache Web 服务器和应用程序,以及一些确保网站可以详细运行的应用配置(如开放 80 端口)。
用户可以创建自己的镜像,或者使用其他人发布在注册中心的公开镜像。当创建自己的镜像时需要用特定的语法创建一个 Dockerfile,每一个 Dockerfile 描述都会创建一个层级在你的镜像里,当改变 Dockerfile 重建镜像时,只有对应的层级会被改变。这样可使镜像轻量化,效率高,灵活性强。
通常使用 docker container run 和 docker service create 命令从某个镜像启动一个或多个容器。
一旦容器从镜像启动后,二者之间就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。尝试删除镜像而不停止或销毁使用它的容器,会导致出错。
镜像通常比较小,容器的目的就是运行应用或者服务,这意味着容器的镜像中必须包含应用服务运行所必需的操作系统和应用文件。
但是,容器又追求快速和小巧,这意味着构建镜像时通常需要裁剪掉不必要的部分,保持较小的体积。例如,Docker 镜像通常不会包含 6 个不同的 Shell 让用户选择——通常 Docker 镜像中只有一个精简的 Shell,甚至没有 Shell。镜像中还不包含内核——容器都是共享所在 Docker 主机的内核。所以,有时会说容器仅包含必要的操作系统(通常只有操作系统文件和文件系统对象)。
在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永远不会变的。
由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不可写,所以镜像是无状态的。
由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不可写,所以镜像是无状态的。
父镜像
每一个镜像都可能依赖于由一个或多个下层而组成的另一个镜像。可以说,下层镜像是上层镜像的父镜像。
基础镜像
一个没有任何父镜像的镜像,称为基础镜像。
镜像 ID
所有镜像都是通过一个 64 位十六进制字符串(内部是一个 256 bit 的值)来标识的。为简化使用,前 12 个字符可以组成一个短 ID,可以在命令行中使用。短 ID 有一定的碰撞几率,所以服务器总是返回长 ID
2、容器
容器是镜像的可运行实例。用户可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器,还可以将容器连接到一个或多个网络,为其附加存储,甚至可以根据其当前状态创建新映像。
默认情况下,容器与其他容器及其主机相对隔离。用户可以控制容器的网络、存储或其他底层子系统与其他容器或主机之间的隔离程度。容器由其映像及在创建或启动它时提供给它的任何配置选项定义。当容器被移除时,未存储在持久存储中的对其状态的任何更改都会消失。
3、数据卷
Docker 的镜像是由多个只读的文件系统叠加在一起形成的。启动一个容器时,Docker 会加载这些只读层,并在这些只读层的上面(栈顶)增加一个读写层。此时,如果修改正在运行的容器中已有的文件,那么这个文件将会从只读层复制到读写层。该文件的只读版本还在,只是被上面读写层的该文件的副本隐藏。当删除 Docker 或者重新启动时,之前的更改将会消失。在 Docker 中,只读层及在顶部的读写层的组合被称为 Union File System(联合文件系统)。
4、仓库
镜像仓库(Docker Repository)用于存储具体的 Docker 镜像,起到仓库存储的作用,比如 Tomcat 下面有很多版本的镜像,它们共同组成了 Tomcat 的 Repository,通过 tag 来区分镜像版本,Registry 上有很多 Repositor。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/0bc49c0b817f245e050d8d603】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论