Docker 和 K8s 到底有啥关系


Docker 和 Kubernetes 的关系

  学了和用了一段时间 Docker 和 K8s,虽然学的不深、用的很浅,但是真真真感觉两者联系紧密。为了满足自己的好奇心,搜集了写资料,汇总一下。

  感觉自己的初高中时代,计算机领域真的风云突变啊,有点春秋百家争鸣的感觉。

观点

  • Docker 和 K8s 不是“非此即彼”的竞争对手,而是两种相辅相成的技术。
  • Docker 是一家提供一系列工具的公司,这些工具用于构建和共享容器镜像,以及运行小规模和大规模的容器。
  • K8s 是一个管理(“协调”)在服务器集群上运行的基于容器的应用程序的工具。

官方定义——简要介绍:

  1. Docker 是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的 Linux 机器上,也可实现虚拟化。
  2. K8s 是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

什么是 Docker?

它是一个公司,是一套工具,也是个命令……

Docker 公司的“枭雄”故事,可自行百度;

后边的内容,把 Docker 看作是开源的技术。

“分割应用,使之容器化,便于交付”,这是我对 Docker 的理解。

那么,Docker到底做了什么,这里借用 Dirk Merkel 的话:

  Docker promises the ability to package applications and their dependencies into lightweight containers that move easily between different distros, start up quickly and are isolated from each other.
(Docker 承诺将应用程序及其依赖性打包到轻量级容器中,轻量级容器可以在不同发行版之间轻松移动、快速启动并彼此隔离。)

费话一点来说,使用 Docker:

  开发者可以轻松地打包任何应用以及依赖包到一个轻量级的、可移植的、自给自足的容器中。然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

  开发者把编译测试通过的容器可以批量地在生产环境中部署,包括 VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

  容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker 生态流程:

docker流程

一个完整的Docker有以下几个部分组成:

  • Docker Client 客户端
  • Docker Daemon 守护进程
  • Docker Image 镜像
  • Docker Container 容器

Docker通常用于如下场景:

  • web应用的自动化打包和发布
  • 自动化测试和持续集成、发布
  • 在服务型环境中部署和调整数据库或其他的后台应用
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的PaaS环境

  虽然 Docker 提供了一种高效方式来打包和发布容器化应用,但仅依靠 Docker 来实现大规模部署和管理容器仍面临挑战。跨多个服务器/集群协调和调度容器,在零停机的前提下升级或部署应用,以及监控容器的运行状况,这些使用姿势还有待优化。

  为解决这些问题以及其他问题,容器编排解决方案以 Kubernetes、Docker Swarm、Mesos、HashiCorp Nomad 等形式陆续诞生,它们可让组织管理大量容器和用户、高效平衡负载、提供身份验证和安全性,以及开展多平台部署等等。

什么是 Kubernetes?

  如果 docker run 是在笔记本电脑上运行容器的方式,那么 K8s 就像一个机器人,在几十个或几百个服务器上运行 docker run。

  Kubernetes(常简称为K8s)是用于自动部署、扩展和管理“容器化应用程序”的开源系统。它目标是让部署容器化应用更简单高效,旨在提供一个“跨主机集群的自动部署、扩展以及运行应用程序容器”的平台。它支持一系列容器类工具,可以跨越网络资源集群来编排容器运行时系统。不论有无 Docker,均可使用 K8s。

K8s 架构图:

K8s架构

  在 K8s 中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

K8s 特点

  • 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
  • 可扩展: 模块化, 插件化, 可挂载, 可组合
  • 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

K8s 与 Docker

K8s与docker对比图

  Docker 是一个容器运行环境,K8s 则是一个运行和管理容器的平台。K8s 支持众多容器运行环境,例如 Docker、containerd、CRI-O 以及 K8s CRI(容器运行时接口)。做个恰当比喻,如果 K8s 是“操作系统”,那么 Docker 容器就是您安装在“操作系统”上的“应用”。

  就其本身而言,Docker 对现代应用开发助益良多。它解决了“在我的机器上工作”的典型问题,但并未涉足其他地方。容器编排工具 Docker Swarm 能够应付部署有少许容器的生产容器工作负载。当系统扩大并需要添加许多彼此联网的容器时,单纯使用 Docker 可能会遭遇一些不断加剧的难题,而 K8s 则可帮助解决这些问题。

  若要比较二者,最好是将 K8s 与 Docker Swarm 进行比较。Docker Swarm 是一种类似于 K8s 的容器编排工具,这意味着它允许管理在运行 Docker 服务器的多个主机上部署的多个容器。默认情况下,Swarm 模式处于禁用状态,需要由 DevOps 团队进行设置和配置。

  K8s 编排计算机集群以协同工作,并根据可用的资源安排容器在这些机器上运行。通过声明式定义,将多个容器组合成容器集 (Pod),后者是 K8s 的基本单元。K8s 自动管理诸如服务发现、负载平衡、资源分配、隔离以及垂直或水平扩展容器集一类的操作。如今它已被开源社区采纳,成为云原生计算基金会的一部分。Amazon、Microsoft 和 Google 均在自己的云计算平台上提供托管 K8s 服务,从而大大减轻了运行和维护 K8s 集群及其容器化工作负载的运营负担。

参考:

  1. Kubernetes 和 Docker 之间的主要区别,以及它们与容器化有何关系
  2. Kubernetes 和 Docker 到底有啥关系?
  3. Kubernetes and Docker: What’s the difference?
  4. 容器应用

文章作者: pudding
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 pudding !
  目录