1. Docker
1.1 什么是Docker
Docker是开源的,基于Linux容器技术的引擎,统一了被隔离的应用程序访问系统核心的API。试图解决开发者的世纪难题在我的机器上可以跑。
前端同学可以视镜像为npm包,仓库为npm仓库。这样更方便理解。
1.2 为什么使用Docker
Docker是一种类似虚拟机技术的缩减版,由于虚拟机启动过程过于漫长与虚拟化之后的硬件在运行程序的时候,并不能很好的契合物理机,比较典型的例子就是移动端开发,启动虚拟系统的时候,过程十分的漫长。
我们经常开启一个虚拟机仅仅是需要隔离一个应用,但是虚拟机创建占用了一套完整的系统资源(guest os),存在着大材小用的问题,成本也息息相关。
而Docker随着Linux功能的更新出现了,Docker本质仅隔离应用程序,共享当前系统核心。
下图为虚拟机与Docker架构对比:
下图为容器虚拟机功能对比:
这样的话,Docker就可以进行秒启动,因为Docker跳过了系统初始化(kernel init),直接使用了当前系统核心。但是这个也是有弊病的,比如 虚拟机热迁移 这个功能,Docker就做的不是很好。
使用Docker可以快速的搭建配置应用环境,简化操作,确保运行环境一致性“一次编译 到处运行”,应用级隔离,弹性伸缩,快速拓展。
1.3 Docker基本概念
1.3.1 镜像
镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像利用(union file system)提供应用运行的只读模板,它可以只提供一个功能,也可以由多个镜像叠加创建多个功能服务。
1.3.2 容器
镜像仅仅是定义隔离应用运行所需要的东西,容器则是运行这些镜像的进程。在容器内部,提供了完整的 文件系统、网络、进程空间等等。完全隔离于外部环境,不会受到其他应用的侵扰。
容器的读写必须使用**Volume**,或者宿主的存储环境,容器在重启或者关闭之后,存在于运行容器内部的数据将会丢失,每次启动容器,都是通过镜像创建一个新的容器。
1.3.3 仓库
Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。实际上,一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签.。
仓库又可以分为两种形式:
- public(公有仓库)
- private(私有仓库)
1.3.4 Docker client
Docker client是一个泛称,用来向指定的Docker Engine发起请求,执行相应的容器管理操作.它既可以是Docker命令行工具,也可以是任何遵循了Docker API的客户端.目前, 社区中维护着的Docker client种类非常丰富,涵盖了包括