Docker:独具魅力的开源容器引擎
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
Docker 是一个开源的应用容器引擎让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中然后发布到任何流行的 Linux 或 Windows操作系统的机器上也可以实现虚拟化。容器是完全使用沙箱机制相互之间不会有任何接口更重要的是容器性能开销极低。
本篇内容主要介绍了Docker 技术介绍、Docker 的基本概念与组成以及部署技术发展史。
文章目录
一、Docker 技术介绍
1、Docker 简介
Docker 是一个开源的应用容器引擎让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中然后发布到任何流行的 Linux 或 Windows操作系统的机器上也可以实现虚拟化。容器是完全使用沙箱机制相互之间不会有任何接口更重要的是容器性能开销极低。
Docker 的开源项目诞生于 2013 年初最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会遵从了 Apache 2.0 协议项目代码在 GitHub 上进行维护。Docker 自开源后受到广泛的关注和讨论以至于 dotCloud 公司后来都改名为 Docker Inc 。
2、虚拟化技术
在计算机技术中虚拟化Virtualization是一种资源管理技术是将计算机的各种实体资源如服务器、网络、内存及存储等予以抽象、转换后呈现出来打破实体结构间的不可切割的障碍使用户可以用比原本的组态更好的方式来应用这些资源。
3、Docker 优势
作为一种新兴的虚拟化方式Docker 跟传统的虚拟化方式相比具有众多的优势。首先Docker 容器的启动可以在秒级实现这相比传统的虚拟机方式要快得多。 其次Docker 对系统资源的利用率很高一台主机上可以同时运行数千个 Docker 容器。
容器除了运行其中应用外基本不消耗额外的系统资源使得应用的性能很高同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机而Docker 只需要启动 10 个隔离的应用即可。
具体说来Docker 在如下几个方面具有较大的优势
- 更快速的交付和部署 Docker 可以快速创建容器快速迭代应用程序并让整个过程全程可见使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快容器的启动时间是秒级的大量地节约开发、测试、部署的时间
- 更高效的虚拟化Docker 容器的运行不需要额外的 hypervisor 支持它是内核级的虚拟化因此可以实现更高的性能和效率
- 更轻松的迁移和扩展Docker 容器几乎可以在任意的平台上运行包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个
- 更简单的管理使用 Docker只需要小小的修改就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新从而实现自动化并且高效的管理。
二、Docker 的基本概念
1、Docker 组成部分
Docker 的架构图
一个完整的 Docker 主要由以下几部分构成
组成部分 | ||
---|---|---|
1 | Docker 主机 | Docker 主机Host是可以是一个物理机或者虚拟机用于运行 Docker 服务进程和容器 |
2 | Docker 服务端 | Docker 服务端Server也叫 Docker Daemon 其实就是 Docker 的服务端。它负责监听 Docker API 请求如 Docker Client并管理 Docker 对象Docker Objects如镜像、容器、网络、数据卷等 |
3 | Docker 客户端 | Docker 客户端Client是用户与 Docker 进行交互的最主要方式。当在终端输入 Docker 命令时对应的就会在服务端产生对应的作用并把结果返回给客户端。Docker Client 除了连接本地服务端通过更改或指定 DOCKER_HOST 连接远程服务端 |
4 | Docker 镜像 | Docker 镜像Images可以理解为是是用于创建 Docker 容器的模板 |
5 | Docker 容器 | Docker 容器Container是独立运行的一个或一组应用是镜像运行时的实体 |
6 | Docker 仓库 | Docker 仓库Registry是保存镜像的仓库类似于 git 和 svn 这样的版本控制系统 |
2、Docker 镜像
Linux 操作系统包括 Linux 内核和用户空间两部分当 Linux 系统启动后会挂载 root 文件系统为其提供用户空间支持。Docker 镜像就类似于这样一个 root 文件系统Docker 镜像中含有启动容器所需要的文件系统及所需内容因此镜像主要用于创建并启动 Docker 容器。
Docker 镜像里包含一层层的文件系统叫做 Union File SystemUnion FS联合文件系统。联合文件系统可以将多个目录挂载到一起从而形成一整个虚拟文件系统该虚拟文件系统的目录结构就像是普通的 Linux 目录结构一样。Docker 通过这些文件系统再加上宿主机的内核就构成了一个 Linux 的虚拟环境。
在联合文件系统中每一层文件系统我们叫做一层 layer联合文件系统可以对每一层文件系统设置只读readonly、读写readwrite和写出writeout-able三种权限。
但是 Docker 镜像中每一层的文件系统都是只读的构建镜像的时候从一个最基本的操作系统开始每个构建的操作都相当于做了一层的修改增加了一层文件系统这样一层一层的网上叠加上层的修改会覆盖底层该位置的可见性。当我们使用镜像的时候只会看到一个完整的整体而不知道也无需知道里面有几层文件系统。
3、Docker 容器
Docker 容器就相当于从模板复制过来运行时的实例Docker 容器可以被创建、复制、暂停和删除等。每一个 Docker 容器在运行时都是以镜像为基础层并在镜像的基础上创建当前容器的存储层容器存储层的生存周期与容器是一致的因此当某一个容器删除后该容器存储层的数据也会随之被删除掉。
4、Docker仓库
Docker 仓库是一个集中存储、分发 Docker 镜像的仓库客户端的 docker pull 和 docker push 命令都是直接与 Docker 仓库发生交互的。
一个 Docker 仓库可以包含多个仓库每个仓库可以包含多个标签这些标签对应每一个镜像。一般情况下一个仓库可能会包含同一个软件的不同版本例如 Nginx 1.18 和 1.20 版本等镜像标签就类似于该软件的不容版本客户端可以通过 <仓库名>:<标签>
的格式来指定具体版本的软件镜像如不指定默认会以 latest
作为标签。
按照镜像是否公开Docker 仓库可分为公共仓库和私有仓库两种。Docker hub 作为 Docker 官方的公共仓库已经保存了大量的常用镜像可以方便用户直接使用如果不想使用公共仓库也可使用 Image registry 这一 Docker 官方提供的私有仓库部署工具。
三、部署技术发展史
1、物理机时代
在虚拟机出现于业务环境中以前应用往往部署在物理机器上但是 无论是 Windows 服务器还是 Linux 服务器都缺乏相应的技术手段保证一台服务器上可以稳定且安全的同时运行多个应用因此这样的部署方式存在弊端就是空闲资源难以得到复用部署异构系统时需要重新采购物理资源大量中小容量的机器使得运维成本提升。
在这样的情况下如何降低基础设施的管理成本便成为急切的需求。
2、VMware 时代
为解决上述问题VMware 推出了他们的产品————虚拟机虚拟机的出现使得用户在一台物理机上能够独立运行多个相互隔离的系统通过对资源的抽象化使得主机资源能够被有效复用这对于企业IT管理十分有益。
然而虚拟机同样也会带来一些问题
- 大量独立系统的运行会占用许多额外开销消耗宿主机器资源资源竞争时可能会严重影响系统响应
- 此外每运行新的虚拟机都需要重新配置一遍环境和在物理机上的情况基本无异重复的环境配置操作则会消耗开发和运维人员的工作时间。
此时需求便关注到如何减少虚拟化时的资源损耗同时还能保证隔离性以及使应用的上线周期更短这便引导了容器技术的发展。
3、容器化时代
现代的容器技术起源于 Linux 其是很多人长期的、持续的贡献产物自 2000 年开始各家类 Unix操 作系统厂商开始陆续推出容器相关的项目。
2008 年 Google 的 Cgroups 贡献给 Linux kernel 2.6.24 后创造了LXC Linux Containers实现了多个独立的 Linux 环境容器可运行在同一个内核。对于一个完整独立运行环境来说需要包含三个关键环境隔离、资源控制和文件系统。在 LXC 中则分别通过 Namespace、Cgroups、rootfs 来实现相应的能力
- Namespace — 环境隔离LXC 将内核全局资源封装每个 Namespace 都有一份独立的资源使得不同的进程在各自 Namespace 内对同一种资源的使用互不干扰不会影响其他 Namespace 下的资源实现了进程隔离
- Cgroups - 资源控制LXC 通过 Cgroups 对资源进行控制限制和隔离一组进程对系统资源的使用。在 Cgroups 出现之前 OS 只能对一个进程做资源限制而 Cgroups 可以对进程进行任意分组如何分组由用户自定义借此实现对于一个 Namespace 的资源调度管理
- rootfs - 文件系统rootfs 挂载在容器根目录上用来为容器进程提供隔离后执行环境的文件系统。rootfs 包含一个操作系统所涉及的文件、配置和目录在 Linux 操作系统内核启动时内核会先挂载一个只读的 rootfs当系统检测其完整性之后决定是否将其切换到读写模式。
在通过 LXC 构建容器后一台宿主机能够实现多个相互隔离应用的运行。同时共享内核使得每个容器又很轻量解决了运行大量隔离应用时虚拟机资源消耗过重的弊端。
然而LXC 虽解决了应用隔离的问题但却只是轻量的容器技术没有解决各平台软件交付标准不统一的问题如不同的软件交付工具、应用运行规范不统一、环境依赖复杂等带来的配置开销。这些问题使容器技术的推广依然比较有限直到 Docker 的出现。
4、Docker 时代
早期 Docker 是基于 LXC 开发因此 Docker 容器也有着和 LXC 相似的特性仅需要较少资源便可以启动。但不同于 LXCDocker除了容器运行还是一个打包、分发和运行应用程序的平台。Docker 允许将应用和其依赖的运行环境打包在一起打包好的 “集装箱“镜像能够被分发到任何节点上执行无需再进行配置环境的部署。这样使得 Docker 解决了开发和部署应用时环境配置的问题规范化了应用交付和部署降低了部署测试的复杂度以及开发运维的耦合度极大提升了容器移植的便利性便于构建自动化的部署交付流程。
Docker 和虚拟机都是资源虚拟化发展的产物但二者在架构上又有区别
- 虚拟机通过 Hypervisor 虚拟化主机硬件资源然后构建客户机操作系统由宿主机的管理程序管理
- Docker 直接运行于主机内核应用在主操作系统的用户空间上执行独立任务不需要从操作系统开始构建环境赋予了应用从交付到部署再到运维的独立性。
虚拟机的启动时间可能是分钟级的而 Docker 容器创建是秒级别。对于硬盘的使用 Docker 一般为 MB 级别远小于包含操作系统的虚拟机 GB 级磁盘使用量。对于操作系统来说能支持运行的 Docker 容器数量远多于虚拟机。
Docker 容器技术在快速部署、环境标准化、隔离性方面的优势得到了开发人员普遍认可但是如果以一个完整 PaaS 平台为标准来衡量这些还不够。首先Docker 提供了名为 “容器” 的隔离环境但是面对多容器间有拓扑有关联的场景Docker还难以应对其次虽然容器解决了应用交付规范问题但难以实现完全应用托管另外随着基础设施规模的扩大开发中心必将分布式化调度问题就需要解决。
2014 年 7 月 Docker 宣布收购单机容器编排软件 Fig后来命名为 Docker Compose并在同年 12 月推出了自己的容器集群编排项目 Docker Swarm。Docker Swarm 成功打造了两方面能力
- 多容器编排能力支持通过 YAML 文件声明多容器应用并定义容器之间的关系
- 分布式调度能力允许跨集群节点调度容器。
Docker Compose 和 Dockers Swarm 可以基本满足开发人员对于 PaaS 平台的需求对于Docker向平台化发展的规划具有基石一般的意义。至此Docker未来的发展似乎很乐观但是随着Google加入容器市场的局面发生了重大改变。
5、Kubernetes
2014 年 Google 开源了名为 Kubernetes简称K8S的项目它是由 Google 内部 Borg 项目而开源出来的容器集群管理系统。Kubernetes 继承了 Google 丰富的大规模集群运维的经验和基因能够提供复杂的、大规模的容器编排管理服务。2015 年 Google 发布了 Kubernetes 第一个商业版本代表 Kubernetes 进军生产级容器规模管理也意味着开始与 Docker 竞争 PaaS 平台的未来版图。
Kubernetes 集群由两类节点构成Master Node 和 Worker Node。Kubernetes 采用声明式的设计任何操作指令都通过声明式 API 与 Master 通信。Master Node 可响应 API 声明进行集群管理和容器调度。容器则运行在 Worker NodeWorker 负责响应 Master 指令执行容器启停等维护操作。
除了紧密的容器关系一个面向生产的编排系统必然应当支持更多的容器关系所以 Kubernetes 还提供了 Deployment 无状态多副本关系、StatefulSet 有状态多副本关系、Job 一次性长任务等许多对象以满足多样的编排需求。这些对象的基础调度单元还是 Pod由控制器 Controller 控制 Pod 对象的状态来实现声明的编排关系。
Kubernetes 使开发人员和工程师拥有了快速处理大型项目所需的管理工具和基础架构。从负载测试或创建过渡环境到将业务和在线应用程序移至生产环境Kubernetes 集群都可以对其进行管理。