1.我在B站学云原生之Docker容器技术基础知识介绍
全栈工程师修炼指南
2022年02月09日 12:49
收录于文集
共39篇

本章目录

0x00 Docker 快速入门

  • 0.开源容器技术选型

  • 1.Docker 基础介绍

  • 2.Docker 架构

  • 3.Docker 资源隔离

  • 4.Docker 容器文件系统


0.开源容器技术选型

在学习Docker容器技术前我们先简单了解一下开源的容器技术有哪些,你如何选择那种容器技术应用于你的企业之中。

下面我们来比较 Docker-Swarm、Kubernetes 和 Mesos 容器技术,虽然所有这三种技术都使得使用容器来部署、管理和伸缩应用成为可能,但实际上它们各自解决了不同的问题,并且根植于迥异的上下文环境中,事实上这三种被广泛采用的工具链都是有差别的;

让我们重新审视每个项目的原始任务、技术架构,以及它们是如何相互补充和交互的,而不是纠结于比较这些快速迭代的技术之间重叠的特性。

当人们将 Docker 和 Kubernetes 与 Mesos 进行比较时,他们实际上是将 Kubernetes 和 Docker Swarm 与在 Mesos 上运行的 Marathon 进行比较(即容器编排技术)。

Q: 什么是容器编排技术? 答:应用一般由单独容器化的组件(通常称为微服务)组成,且必须按顺序在网络级别进行组织,以使其能够按照计划运行。以这种方法对多个容器进行组织的流程即称为容器编排。

Q: 容器编排定义?

答:在现代开发当中,整体式的应用早已成为过去时,如今的应用由数十乃至数百个松散结合的容器式组件构成,而这些组件需要通过相互间的协同合作,才能使既定的应用按照设计运作。容器编排是指对单独组件和应用层的工作进行组织的流程。

容器编排的工作原理是什么? 答:虽然诸如 Apache Mesos、Google Kubernetes 以及 Docker Swarm 等平台均有其特定的容器管理方法,但所有的容器编排引擎均可让用户控制容器启动和停止的时间、将其分组合到群集中,以及协调应用组合的流程。容器编排工具允许用户指导容器部署与自动更新、运行状况监控以及故障转移等步骤。

1. Docker技术

Docker 公司始于名为 dotCloud 的平台即服务(PaaS)供应商: Docker 文件格式成为行业标准,领先的容器技术供应商(包括 Docker、Google、Pivotal、Mesosphere 等) 组建了 云计算基金会Cloud Native Computing Foundation(CNCF)[9] 和 开放容器推进联盟Open Container Initiative (OCI)[10]。 如今CNCF 和 OCI 旨在确保容器技术之间的互操性和标准化接口,并确保使用任何工具构建的任何 Docker 容器都可以在任何运行时或基础架构上运行;

Docker它提供了如下功能:

  • 将应用程序和依赖库封装在一个软件包(即 Docker 镜像)

  • 提供类似 Git 的语义进行版本和层layer的管控

  • 定义 Docker 镜像为不可变的层,支持不可变的基础设施

  • 通过实例化不可变的镜像和读写层来运行 Docker 容器,读写层可以临时地存储运行时变更,从而轻松部署和扩展应用程序的多个实例。

随着 Docker 开始商业化其开源的文件格式(LCTT 译注:指 Docker 镜像的 dockerfile 文件格式),该公司还开始引入工具来完善其核心的 Docker 文件格式和运行时引擎,包括:

  • 为公开存储 Docker 镜像的而生的 Docker hub;

  • 存储私有镜像的 Docker 仓库(Docker registry);

  • Docker cloud,用于构建和运行容器的管理性服务;

  • Docker 数据中心作为一种商业产品体现了许多 Docker 技术;

  • 容器编排技术:为了跨多个机器之间协调这些容器出现的Docker Swarm 它如今是Docker引擎的一部分;

2. Kubernetes技术

Google 很早就认识到了 Docker 的潜力,并试图在 Google Cloud Platform (GCP)上提供容器编排“即服务”。 Google 在容器方面拥有丰富的经验(是他们在 Linux 中引入了 cgroups),但现有的内部容器和 Borg 等分布式计算工具直接与其基础架构相耦合,所以Google 没有使用原有系统的任何代码,而是从头开始设计 Kubernetes (K8S)来编排 Docker 容器;

Kubernetes 于 2015 年 2 月发布,在2016 年 3 月Google 将 Kubernetes 捐赠给了CNCF,并且直到今天仍然是该项目的主要贡献者(其次是Redhat,CoreOS 等)。 K8S其目标和考虑如下:

  • 为应用程序开发人员提供编排 Docker 容器的强大工具,而无需与底层基础设施交互;

  • 提供标准部署接口和原语,以实现云端一致的应用部署体验和 API;

  • 基于模块化 API 核心,允许供应商围绕 Kubernetes 的核心技术集成其系统。

Kubernetes 的优势:

  • 减轻了对基础架构和运营团队的依赖程度,所以对应用程序开发人员非常有吸引力

  • 为应用程序开发人员提供了用于编排无状态 Docker 容器的强大工具

Kubernets 与 docker Swarm比较? 答:Kubernetes 也是有吸引力的,因为它是 CNCF 旗下的开源项目与 Docker Swarm 相反尽管它是开源的,但是被 Docker 公司紧紧地掌控着。

3. Apache Mesos技术

Apache Mesos 始于加州大学伯克利分校UC Berkeley的下一代容器集群管理器项目,并应用了从云计算级别的分布式基础架构(如 Google 的 Borg 和 Facebook 的 Tupperware [具有单一架构])中习得的经验和教训。

Mesos 推出了一种模块化架构一种开源的开发方法,旨在完全独立于基础架构。Mesos 迅速被 Twitter[14]、apple(Siri 中)[15]、Yelp[16]、Uber[17]、Netflix[18] 和许多领先的技术公司采用,支持从微服务、大数据和实时分析到弹性扩展的一切。

Mesos 作为集群管理器被设计用来解决一系列不同的挑战:

  • 将数据中心资源抽象为单个池来简化资源分配,同时在私有云或公有云中提供一致的应用和运维体验;

  • 在相同的基础架构上协调多个工作负载,如分析、无状态微服务、分布式数据服务和传统应用程序,以提高利用率,降低成本和台面空间;

  • 为应用程序特定的任务(如部署、自我修复、扩展和升级),自动执行第二天的操作,提供高度可用的容错基础设施;

  • 提供持久的可扩展性来运行新的应用程序和技术,而无需修改集群管理器或其上构建的任何现有应用程序;

  • 弹性扩展可以将应用程序和底层基础设施从少量扩展到数十到数万个节点。

Mesos技术特点:

  • Mesos 独有的独立管理各种工作负载的能力

    • 包括 Java 这样的传统应用程序、无状态 Docker 微服务、批处理作业、实时分析和有状态的分布式数据服务

  • Mesos 广泛的工作负载覆盖来自于其两级架构,从而实现了“应用感知”调度

    • 允许每个工作负载都有自己的专门构建的应用程序调度程序,可以了解其部署、扩展和升级的特定操作要求

  • Mesos 拥有高度可扩展(extension)的能力

    • 应用程序调度程序也是独立开发、管理和更新的,支持新的工作负载或随着时间的推移而增加更多的操作功能。

Mesos 以每一个工作负载所需的特定方式管理各种工作负载,使得许多公司将 Mesos 作为一个统一的平台,将微服务和数据服务结合在一起。数据密集型应用程序的通用参考架构是 “SMACK 家族”(LCTT 译注:SMACK 即 Spark、Mesos、Akka、Cassandra、Kafka)

实际案例:举一个团队如何管理应用软件升级的例子。 无状态应用程序可以从“蓝/绿”[19]部署方案中受益;当新版本的应用运行起来时,原先旧版本的软件依然还正常运转着,然后当旧应用被销毁时流量将会切换到新的应用上。但是升级数据工作负载例如 HDFS 或者 Cassandra 要求节点停机一次,此时需要持久化本地数据卷以防止数据丢失,并且按照特定的顺序执行原位升级,在升级之前和升级完成之后,都要在每一个节点类型上执行特定的检查和命令。 由于任何这些步骤都是应用程序或服务特定的,甚至可能是版本特定的,这让使用常规容器编排调度程序来管理数据服务变得非常困难;

Mesos 甚至可以运行 Kubernetes 或者其他的容器编排工具,Mesos 可以在共享的基础设施上弹性地为 Java 应用服务器提供集群服务、Docker 容器编排、Jenkins 持续集成任务、Apache Spark 分析、Apache Kafka 流,以及更多其他的服务。

4. 技术选型

总而言之,所有这三种技术都与 Docker 容器有关,可以让你在容器编排上实现应用程序的可移植性和扩展性。

  • 更有效地利用服务器资源的工具

  • 简化应用程序的可移植性

  • 并提高开发人员的敏捷性

那么你在它们之间如何选择呢?

  • 如果您是一个应用开发人员,正在寻找现代化的方式来构建和打包你的应用程序,或者想加速你的微服务计划,Docker 容器和开发工具就是最好的选择。

  • 如果你们是一个开发人员或者 DevOps 的团队,并希望构建一个专门用于 Docker 容器编排的系统,而且愿意花时间折腾集成解决方案与底层基础设施(或依靠公共云基础架构,如 Google 容器引擎(GCE)或 Azure 容器服务(ACS)),Kubernetes 是一个可以考虑的好技术。

  • 如果你们想要建立一个运行多个关键任务工作负载的可靠平台,包括 Docker 容器、传统应用程序(例如 Java)和分布式数据服务(例如 Spark、Kafka、Cassandra、Elastic),并希望所有这些可依移植到云端提供商或者数据中心,那么 Mesos(或我们自己的 Mesos 发行版,Mesosphere DC/OS)更适合你们的需求。

回归正题,Kubernetes 将在后续章节进行讲解,本专栏系列将从Docker容器入门学习到Kubernetes容器编排企业实践,希望大家持续关注。


1.Docker 基础介绍

描述:Docker [ˈdɑ:kə(r)] 是一个基于Go语言开发实现的遵循Apache 2.0协议开源项目,目标是实现轻量级的操作系统虚拟化解决方案; ,诞生于2013年初最初发起者是dotCloud公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,后续由于docker的发展后来也改名为Docker Inc,它是仅次于OpenStack最受欢迎的云计算开源项目;Docker 从 17.03版本之后分为 CE(Community Edition) 和 EE(Enterprise Edition)

Docker 的目标是"",通过对应用组件的封装等生命周期进行管理,达到应用级别""; 例如:它可以独立运行一个Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器;

Apache 2.0 授权 Github 项目开源 : https://github.com/docker/docker

Docker与OpenStack的区别?

  • 部署难度:Docker非常简单;OpenStack组件多部署繁琐

  • 启动速度:秒级;分钟级

  • 执行性能:和物理机几乎是一致;VM会占用一些资源

  • 镜像体积:镜像是MB级别的;虚拟机镜像是GB级别的

  • 管理效率:关键简单;组件相互依赖且管理复杂

  • 隔离性:隔离性高;彻底隔离

  • 可管理性:单进程;完整的系统管理

  • 网络连接:比较弱;借助于Neutron可以灵活组件各类网络架构

完整的Docker由以下几部分构成:

  • (1) 守护进程(Daemon):Docker守护进程(dockerd)侦听Docker API请求并管理Docker对象,,如图像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理Docker服务。

  • (2) REST API: 主要与Docker Daemon进行交互,比如Docker Cli或者直接调用REST API;

  • (3) 客户端(Docker Client): 它是与Docker交互的主要方式通过命令行接口(CLI)客户端(docker命令),客户机将命令通过REST API发送给并执行其命令;()

  • (4) Register Repository 镜像仓库: Docker注册表存储Docker镜像,可以采用Docker Hub是公共注册仓库,或者采用企业内部自建的Harbor私有仓库;

  • (5) Image 镜像: 映像是一个只读模板,带有创建Docker容器的指令。映像通常基于另一个映像,还需要进行一些额外的定制,你可以通过Docker Hub公共镜像仓库进行拉取对应的系统或者应用镜像;

  • (6) Container 容器: 容器是映像的可运行实例。您可以使用Docker API或CLI创建、启动、停止、移动或删除容器。您可以将一个容器连接到一个或多个网络,将存储附加到它,甚至根据它的当前状态创建一个新映像。

  • (7) Services : Docker引擎支持集群模式服务允许您跨多个Docker守护进程()扩展管理容器,服务允许您定义所需的状态,例如在任何给定时间必须可用的服务副本的数量。默认情况下,服务在所有工作节点之间进行负载平衡。对于使用者来说Docker服务看起来是一个单独的应用程序;

Linux容器基础之LXC技术介绍:

描述:Docker引擎的基础是Linux容器(Linux Containers,LXC)技术,容器有效的将各个操作系统管理的资源划分到孤立的组,以便更好的在孤立的组之间平衡有冲突的资源使用需求。 容器可以在核心CPU本地运行指令,并不需要任何专门的解释机制;最早的容器技术可以追溯到1982年Unix系列操作系统上的chroot工具;用户操作容器就像操作一个轻量级虚拟机那样简单,也可以将容器比作为一种沙盒(Sandbox);

Docker 优势:

  • 1.更高效的利用系统资源:Docker容器不需要进行硬件虚拟以及运行完整操作系统等额外开销(资源远远小于虚拟机);

  • 2.更快速的启动时间:直接运行于宿主内核无需启动完整的操作系统,可以做到秒级、甚至毫秒级的启动时间;

  • 3.更快速的交付和部署:实现持续集成(Continuous Integration)、持续交付、自动部署(Continuous Delivery/Deployment),大量节约开发,测试,部署的时间;

  • 4.更高效的资源利用:不需要额外的虚拟化管理程序VMM以及Hypervisor的支持;

  • 5.更容易学习、迁移和扩展:一致的运行环境Docker 可以在很多平台上运行无论是物理机、虚拟机、公有云、私有云

  • 6.更简单的更新管理:使用Dockerfile只需要小小的配置修改,可以快速创建和删除容器,Docker hub 提供镜像平台方便共享镜像;

  • 7.基于 Docker 的 CI 持续集成和 CD 持续支付

  • 8.基于 Kubernetes, Docker Swarm 的集群弹性扩容和缩容

什么是虚拟化技术? 虚拟化技术是一个通用的概念,在不同的领域有不同的理解;在计算机领域一般指的是计算机虚拟化(Computer Virtualization)或者说是服务器虚拟化;虚拟化的核心是对资源进行抽象和管理,目标往往是为了在同一个主机上运行多个系统或者应用,从而提高系统资源的利用率,同时带来降低成本,方便管理和容错和容灾等好处;

  • 硬件虚拟化:真正意义上的基于它的技术不多见,少数网卡中的单根多IO虚拟化等技术;

  • 软件虚拟化(Virtualization)

    • 1.应用虚拟化

    • 2.平台虚拟化:细分

    • 2.1 完全虚拟化

    • 2.2 硬件辅助虚拟化:利用硬件CPU辅助支持虚拟化技术Intel-VT和AND-V处理铭感指令来实现完全虚拟化的功能;

    • 2.3 部分虚拟化:只对部分硬件资源进行虚拟化,客户端系统需要进行修改;

    • 2.4 准虚拟化(Paravirtualization):如xen

    • 2.5 操作系统级虚拟化:内核通过创建多个虚拟化的操作系统实例内核和库来隔离不同的进程,dokcer以及其他容器都在这个范畴之内;

传统虚拟机的比较:

传统虚拟化方式与Docker虚拟化方式

  • 传统虚拟化方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层,然后在该系统上运行业务所需程序;

  • Docker虚拟化方式是在宿主系统层面上实现虚拟化,直接复用本地主机的操作系统与内核,容器内没有自己的内核,所以容器内的应用进程实际运行于宿主机内核,因此更加轻量级;

  • 虚拟机是为提供系统环境而生,容器是为了提供应用环境而生的;

物理机-虚拟机-Docker容器容易理解的对比

  • 一栋楼一户人家,独立地基独立花园(别墅)

  • 一栋楼包含多套房,一套房一户人家,共享地基、共享花园、独立卫生间、厨房和宽度(二室一厅)

  • 一套房隔成多个小隔间,每个小隔间住一位租户(胶囊式公寓)

Docker 应用场景

  • 使用docker容器技术进行开发、测试、部署服务,实现自动化测试和持续集成、发布;

  • 在服务型环境中部署与扩展Webapp以及调整数据库或其他应用;

  • 统一、优化和加速本地开发和构建流程;创建隔离的运行环境,测试环境

  • 构建多用户的平台即服务(PaaS)基础设施

  • 提供软件即服务(SaaS)的应用程序

  • 高性能、超大规模的宿主机部署,web应用的自动化打包和发布

2.Docker 架构

描述:Docker对使用者来讲是一个C/S模式(使用客户机-服务器)的架构而Docker的后端是一个非常松耦合的架构,模块各司其职并有机组合支撑Docker的运行。

具体流程:

  • (1) 用户使用Docker客户机与Docker守护进程通信,后者负责构建、运行和分发Docker容器等繁重的工作。

  • (2) Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;

  • (3) Docker客户端和守护进程可以运行在同一个系统上,或者您可以将一个Docker客户端连接到一个远程Docker守护进程。

  • (4) Docker客户机和守护进程之间通过或网络接口

Docker 内部具体实现:

  • Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。

  • Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;

  • 当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;

  • 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。

  • libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。

3.Docker 资源隔离

Docker 本质是宿主机上的一个进程,docker通过namespace实现资源隔离以及轻量级虚拟化容器服务,通过cgroup实现了资源限制,通过写时复制技术(Copy-on-write)实现了高效的文件操作;

Docker通过由内核namespace提供实现的隔离,namespace的API包括还有在/proc下的部分文件

  • 进程隔离:每个容器都运行在自己的进程环境中

  • 网络隔离:容器间的虚拟网络接口和 IP 地址都是分开的

  • 文件系统隔离:每个容器都有自己的 root 文件系统

  • 资源隔离和分组:使用 cgroups 将 CPU 和内存之类的资源独立分配给每个 Docker 容器

即namespace的六项隔离()如下标所示:

cgroup的特点与功能:

  • cgroup的API以一个伪文件系统来实现的,用户态的程序通过文件操作实现cgroup的组织管理;

  • cgroup的组织管理操作单元可以细粒度级别,另外用户可以创建和销毁cgroup,从而实现资源再分配和利用;

  • 所有资源管理的功能都以子吸引的方式实现接口统一,子任务创建之初与其父任务处于同一cgroup的控制组;

  • cgroup四大功能:资源限制(资源总额进行限制),优先级分配(分配CPU时间片数量以及磁盘IO带宽大小),资源统计(CPU时长/内存用量),任务控制(执行挂起/恢复等操作);

4.Docker 容器文件系统

描述:从下面的图片可以看见出以下几点:

  • Docker 镜像代表了容器的文件系统里的内容,是容器的基础,镜像一般是通过 Dockerfile 生成的;

  • Docker 的镜像是分层的,所有的镜像(除了基础镜像)都是在之前镜像的基础上加上自己这层的内容生成的;

  • Docker 中每一层镜像的元数据都是存在 json 文件中的,除了静态的文件系统之外,还会包含动态的数据;

  • Docker 镜像生产容器后会在此基础之上加入挂载点到安装Docker宿主机文件系统之中,并提供一个读写层(Read-Write Layer),所以容器进程的所有操作都在读写层进行;

总结:

  • Docker通过为Linux容器技术提供更简洁的使用和管理方案、更高效的版本控制,Docker 让容器技术一下子变得灵活易用,随着云计算(Cloud Computing)的发展,它在Virtualization中的地位越来越重要.

  • 四大核心概念:

至此本节完毕,敬请期待下一小节内容。

原文链接: 网页链接​


欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】或者 个人公众号【WeiyiGeek】联系我。


更多文章来源于【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】 个人博客。

博客地址: https://weiyigeek.top 

努力的方向正确了,才会有好的结果。

专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏点个赞、投个币、收个藏、关个注,转个发,这将对我的肯定,谢谢!。