镜像底层、联合文件系统
镜像
镜像是一种轻量级、可执行的独立软件包,包含运行某个软件所需要的所有内容,我们把应用程序和配置依赖打包成一个可以交付的运行环境,这个打包好的运行环境就叫做Image镜像
只有通过镜像文件才能生成docker容器实例
我们在使用pull的时候,在下载的时候可以看到docker的镜像好像是一层层的下载
==所以说镜像是分层的==
UnionFS(联合文件系统)
联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件的修改操作来为一次提交来一层层的叠加
Union文件系统是docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作出各种具体的应用镜像
特性:
一次性同时加载多个文件系统,但是从外面看起来,只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
所以docker启动非常快是有原因的,它是由一层层的文件系统组成的联合文件系统
bootfs(boot file system引导文件系统)主要包含bootloader和kernel,kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像最底层就是引导文件系统bootfs。
在bootfs之上,包含的就是典型的linux系统中的/dev./proc,/bin,/etc等标准文件和目录
rootfs就是各种不同的操作系统发行版
我们只是包含了最小的容量,所以内存小,只需要包含基本的命令和函数库,所以下载的Ubuntu很小,所以很多命令都没有
镜像分层的好处就是资源共享,方便复制迁移,就是为了==复用==
比如说有多个镜像从相同的base镜像构建而来,那么docker host只需要在磁盘中保存一份base镜像
同时内存中也只需要加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。
重点理解
1. docker镜像层是只读的,容器层是可以写的
2. 当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
Docker 架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |