本系列笔记是作为一个新手小白,从了解 Docker 是什么、Docker 技术包含哪些概念到上手使用、安装以及发布 Docker 镜像的整个过程。小白在学习过程中遵循简介、入门、上手到深入的顺序,根据个人学习实践过程进行书写与记录。
一、 Docker 简介
Docker是DotCloud开源的、可以将任何应用包装在Linux container中运行的工具。Docker是供开发人员和系统管理员:使用容器构建,运行和共享应用程序的平台。使用容器来部署应用程序称为容器化。容器不是新的技术,但用于轻松部署应用程序的Docker却是新的未来。
1. 容器的概念
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
Docker
将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器
里运行,就好像在真实的物理机上运行一样。有了 Docker
,就不用担心环境问题。
Docker
利用 Linux 核心中的资源分脱机制,例如 cgroups
,以及 Linux 核心名字空间(name space),来创建独立的软件容器(containers
),属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docker
在容器的基础上进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得其比虚拟机技术更为轻便、快捷。Docker
可以在单一 Linux 实体下运作,避免因为创建一个虚拟机而造成的额外负担。
容器化越来越受欢迎,因为容器具有一下有点:
- 灵活:即使最复杂的也可以容器化。
- 轻量级:容器利用并共享主机内核,在系统资源方面比虚拟机效率更高。
- 可移植性:您可以在本地构建,部署到云并在任何地方运行。
- 松散耦合:容器是高度自给自足并封装的容器,使您可以在不破坏其他容器的情况下更换或升级它们。
- 可扩展:您可以在数据中心内增加并自动分布容器副本。
- 安全:容器将积极的约束和隔离应用于流程,而无需用户方面的任何配置。
2. 容器和虚拟机
容器在Linux上本地运行,并与其他容器共享主机的内核。它运行一个离散进程,不占用任何其他可执行文件更多的内存,从而使其轻巧。由于容器是进程级别的,相比虚拟机有很多优势
相比之下,虚拟机(VM)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。并通过虚拟机管理程序对主机资源进行虚拟访问。通常,VM会产生大量开销,超出了应用程序逻辑所消耗的开销。
1) 容器技术
容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。容器内没有自己的内核,也没有进行硬件虚拟。
2) 虚拟机
对于虚拟机技术来说,传统虚拟机如 VMware , VisualBox 之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。
容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。通过上面这幅图我们可以很直观的反映出这两者的区别所在。
具体来说与虚拟机技术对比,Docker 容器存在以下几个特点:
1. 更快的启动速度: 因为 Docker 直接运行于宿主内核,无需启动完整的操作系统,因此启动速度属于秒级别,而虚拟机通常需要几分钟去启动。
2. 更高效的资源利用率:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。
3. 更高的系统支持量:Docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高。
4. 持续交付与部署:对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至进行自动部署。
5. 更轻松的迁移:由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
6. 更轻松的维护与扩展:Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
7. 更弱的隔离性:Docker 属于进程之间的隔离,虚拟机可实现系统级别隔离。
8. 更弱的安全性:Docker 的租户 root 和宿主机 root 等同,一旦容器内的用户从普通用户权限提升为 root 权限,它就直接具备了宿主机的 root 权限,进而可进行无限制的操作。虚拟机租户 root 权限和宿主机的 root 虚拟机权限是分离的,并且利用硬件隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击。
3. Docker的用途
Docker
的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
4. 容器编排
Docker
平台以及周边生态系统包含很多工具来管理容器的生命周期。
例如,Docker Command Line Interface(CLI)支持下面的容器活动:
- 从注册表中拉取仓库。
- 运行容器并可选的附加一个终端给它。
- 将容器提交新镜像。
- 上传镜像到注册中心。
- 终止运行中的容器。
Docker Command Line Interface(CLI) 满足在单个主机上管理容器的需求,但是面对部署在多个主机上的容器时就无所适从了。为了超越单个容器管理,我们必须转向编排工具。容器编排工具
将生命周期管理能力扩展到部署在大量机器集群上部署的复杂的、多容器工作负载。通过抽象主机基础结构, 编排工具允许用户将整个集群视为单个部署目标。
容器编排工具 提供调度和集群的技术,提供用于基于容器应用可扩展性的基本机制。这些工具使用容器服务,并编排他们以决定容器之间如何进行交互。此外,编排允许容器可以存在并执行在集群上,这使得他们能够扩展来适应增加的处理负荷。
典型的容器编排工具有助于虚拟化一组机器并将它们作为单个集群管理。容器编排工具也有助于将机器上的工作负载或容器移动到消费者透明的位置。很多工具目前既支持基于DOCKER的容器,也支持非容器化二进制文件部署,例如独立的Spring Boot应用程序。这些容器编排工具的基本功能是从应用程序中抽象出实际的服务器实例。
容器编排工具 为开发人员和基础设施团队提供了一个抽象层来处理大规模的容器化部署。
容器编排工具
提供的特征在众多提供者之间有所不同,然而常见的公共特征包含准备、发现、资源管理、监视和部署。
容器编排工具的一些关键能力概括如下:
- 集群管理:将虚拟机和物理机器的集群管理为一台大型机器。这些机器在资源能力方面可能有些差异,但大体上都是以Linux作为操作系统的机器。这些虚拟集群可以建立在云上、本地或两者的混合。
- 部署:能处理有大量机器的应用程序和容器的自动部署。支持多个版本的应用程序容器,并且还支持跨越大量集群机器的滚动升级。这些工具还能够处理故障回滚。
- 可伸缩性:支持应用实例的自动和手动伸缩,以性能优化为主要目标。
- 健康:它管理集群、节点和应用程序的健康。可以从集群中移除异常的机器和应用程序实例。
- 基础结构抽象化:开发人员不必担心机器、容量等问题。完全是容器编排工具来决定如何调度和运行应用程序。这些工具也抽象化机器的细节、能力、使用和位置。对于应用程序所有者来说,它们相当于一个容量几乎无限的大型机器。
- 资源优化:这些工具以有效的方式在一组可用机器上分配容器工作负载,从而降低成本,通过从简单的到复杂的算法可有效地提高利用率。
- 资源分配:基于应用程序开发人员设置的资源可用性和约束来分配服务器。资源分配将基于约束、规则、端口要求、应用依赖性、健康等等。
- 服务可用性:确保服务在集群中正常运行。在机器故障的情况下,容器编排会自动通过在集群中的其他机器上重新启动这些服务来处理故障。
- 敏捷性:敏捷性工具能够快速分配工作负载到可用资源,或者在资源需求发生变化时跨机器移动工作量。此外,可以根据业务临界性、业务优先级等来设置约束重新调整资源。
- 隔离:一些工具提供了资源隔离。因此,即使应用程序不是容器化的,也可以实现资源隔离。
5. 编排工具
1) Kubernetes
Kubernetes是一个开源的,开箱即用的容器集群管理器和业务流程。它具有出色的构建 调度器 和资源管理器,用于以更有效和高度可用的方式部署容器。Kubernetes已成为许多组织事实上的容器编排工具。kubernetes项目由google与世界各地的贡献者维护。它提供了本机Docker工具不提供的许多功能。而且,使用kubernetes很容易上手。
2) OpenShift
Openshift建立在kubernetes之上。Openshift项目由Redhat维护。它同时具有开源(openshift orgin)和企业版(openshift容器平台)。连同核心的Kubernetes功能,它提供了用于容器管理和编排的开箱即用组件。
3) Docker Swarm
Docker生态系统包括从开发到生产部署框架的工具。在该列表中,docker swarm适用于集群管理。可以使用docker-compose,swarm,overlay网络和良好的服务发现工具(例如etcd或consul)的组合来管理Docker容器集群。
与其他开源容器集群管理工具相比,Docker swarm在功能方面仍日趋成熟。考虑到庞大的Docker贡献者,Docker swarm拥有其他工具拥有的所有最佳功能不会太久。Docker记录了在生产中使用docker swarm 的良好生产计划。
4) Mesos
Mesos是另一个可以非常有效地管理容器编排的群集管理工具。它是由Twitter为其基础架构创建的,然后获得了开源。它已被eBay,Airbnb等公司使用。Mesos并不是用于容器的专用工具,
Mesos不是用于容器的专用工具,相反,您可以将其用于VM或物理机群集,以运行容器以外的工作负载(大数据等)。它具有一个称为Marathon的有效框架,用于在Mesos群集上部署和管理容器。
6. 服务网格
容器和容器编排技术的兴起使得新的基础架构成为了可能,使我们能够摆脱服务发现/负载平衡/断路器框架的束缚。 这个新的基础设施就是“服务网格”,那服务网格是什么呢?
服务网格 是一个
基础架构层
- 主要是一个代理集合,每个逻辑服务都有一个代理 - 与Docker Swarm或Kubernetes等容器编排解决方案集成,并提供服务发现,负载平衡,断路器,故障注入,安全,监控,跟踪以及更多以非侵入性的方式提供的开箱即用功能。
由于服务网格在容器级别运行,它并不关心使用什么技术或编程语言来编写微服务。 你可以将微服务使用Java,C ++,Rust,Go,NodeJS来编写简单HTTP服务器,这些都已不再重要。
可以将服务网格有效地视为分布式容器化应用基础架构级的面向切面编程。 服务网格中的代理就像AOP中的一个切面。 它们包裹了一个容器化的微服务,就像AspectJ切面可以包裹和测试java方法一样,通过分离横切关注点来简化系统。
在服务网格中,请求将通过所在基础架构层中的代理在微服务之间路由。正因如此,构成服务网格的各个代理有时也被称为“sidecar”(边车),这是因为它们与每个服务并行运行,而非在内部运行。总之,这些“sidecar”代理(与每项服务分离)构成了网格式网络。
服务网格是如何实现的呢?它通常会为每个服务实例提供一个称为边车(sidecar)的代理实例。这些边车会处理服务间的通信,监控和安全相关的问题, 以及任何可以从各个服务中抽象出来的东西。这样,开发人员就可以专注于服务中应用程序代码的开发,支持和维护,而运维团队可以负责维护服务网格以及运行应用程序。
服务网格应用中管理实例之间的网络流量的的部分称为数据平面。另外有一个独立的控制平面负责生成和部署数据平面的配置(这个配置可以控制数据平面的行为)。控制平面通常包含(或被设计为连接到)一个API,命令行界面和用于管理App的图形用户界面。
Sidecar 设计模式已经越来越受欢迎,并在社区内得到更广泛的采用。构建具有高度可扩展性、弹性、安全性和可观察性的微服务架构具有挑战性。Service Mesh 架构的发展已经改变了游戏规则。它降低了与微服务架构相关的复杂性,并提供了许多功能,如负载平衡、服务发现、流量管理、熔断、遥测、故障注入等。