Docker 最初在 Ubuntu 12.04 上开发,使用Go语言实现。
它基于 Linux 内核的 cgroup,namespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,简化了容器的创建和使用。
Docker 和传统虚拟化方式的不同:
Docker 优点:
Image
)Container
)Repository
)是Linux内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
Docker 镜像(Image)相当于一个根文件系统。它提供了容器运行时所需的程序、库、资源、配置,还有运行时的一些参数(如匿名卷、环境变量、用户等)。镜像的内容在构建后不可改变(改变只能重新打包一个镜像)
因为根文件系统往往很庞大,所以Docker采用了Union FS技术,讲文件系统设计为分层架构。
镜像的构建按层进行,后续层依赖于前面的层。一层构建完无法更改,因此在一层构建完之前,要将不必要的内容清理掉。
因为这种分层架构与层层间依赖的特征,镜像的复用、定制变得更容易,新的镜像可以通过在已有镜像上添加新层来构建。
容器是镜像运行的实体(镜像是静态定义),可以被创建、启动、停止、删除、暂停等。
容器运行于自己独立的命名空间,有自己的根文件系统、网络配置、进程空间、甚至用户 ID 空间。
容器的进程运行于一个独立于宿主系统的环境,这使得容器封装的应用更加安全。
容器的运行是以它的镜像为基础,在其上创建一个存储层,为容器的读写而准备,称为“容器存储层”。
“容器存储层”生命周期与容器一致,其中保存的数据随容器删除而丢失。
若要保留修改的数据,应该使用“数据卷”或绑定宿主目录,这些位置的读写是直接对宿主机读写,能够在容器删除后保存下来。
Docker Registry提供集中存储、分发镜像的服务,方便在其他服务器使用构建好的镜像。
一个 Docker Registry 中可以包含多个仓库(Repository
);每个仓库可以包含多个标签(Tag
);每个标签对应一个镜像。
若一个仓库包含一种软件,则标签就是软件的版本,<仓库名:标签> 确定了哪个软件的哪个版本,例如Ubuntu:18.04。若不给出标签,则默认为latest,如Ubuntu:latest。
仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy
,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。
是开放给用户使用、允许用户管理镜像的服务
允许用户免费上传、下载公开镜像,并提供收费服务供用户管理私有镜像
最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry
在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror
),这些镜像服务被称为加速器。常见的有 阿里云加速器、DaoCloud 加速器 等
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。
参考:
《docker 从入门到实践》