容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
一、Docker
docker是一种开源的应用容器引擎,可以将应用程序和依赖打包成一个可移植的镜像,然后发布到任何支持docker的平台上,也可以实现虚拟化。docker的核心概念有三个:镜像(image)、容器(container)和仓库(repository)。镜像是一个特殊的文件系统,包含了运行容器所需的程序、库、资源、配置等文件。容器是镜像的一个实例,是一个运行时的概念,可以启动、停止、删除等。仓库是存放镜像的地方,可以是公开的或私有的,可以从仓库中拉取或推送镜像。
镜像(Image):镜像是Docker中的基本构建块,它是一个轻量级、独立的可执行软件包,其中包含运行应用程序所需的所有内容,包括代码、运行时、库、环境变量和配置文件等。镜像是只读的,意味着一旦构建完成,其内容不可更改。开发者可以使用Dockerfile来定义镜像的构建规则,然后通过Docker命令将镜像构建出来。镜像可以用于创建Docker容器。
容器(Container):容器是基于镜像创建的运行实例。它是一个隔离的运行环境,可以在其中运行应用程序。容器包含了镜像的副本,但它可以在镜像的基础上进行读写操作,因此容器是可变的。容器在运行时与宿主机操作系统隔离,但与宿主机共享内核。这使得容器能够快速启动、轻量级、可移植,同时提供了高度的隔离性和安全性。
仓库(Repository):仓库是用于存储Docker镜像的地方,它类似于代码库。仓库可以分为两种类型:公共仓库和私有仓库。公共仓库如Docker Hub,是供公众使用的,开发者可以将自己构建的镜像推送到公共仓库,也可以从公共仓库拉取其他开发者共享的镜像。私有仓库通常是企业内部使用的,用于存储私有镜像,保护公司的知识产权和应用程序代码。开发者可以通过Docker命令将镜像推送到私有仓库,并从私有仓库拉取镜像到自己的环境中使用。
1、什么是容器?
简而言之,容器是计算机上的沙盒进程,与主机上的所有其他进程隔离。这种隔离利用内核命名空间和cgroups, 在 Linux 中已经存在很长时间的功能。Docker一直致力于使这些功能变得平易近人且易于使用。总而言之,容器:
是图像的可运行实例。您可以使用 DockerAPI 或 CLI 创建、启动、停止、移动或删除容器。
可以在本地计算机、虚拟机上运行或部署到云中。
是可移植的(可以在任何操作系统上运行)。
与其他容器隔离,并运行自己的软件、二进制文件和配置。
2、Docker架构
Docker 使用客户端-服务器架构。Docker 客户端与 Docker 守护进程,它负责构建、运行和 分发您的 Docker 容器。Docker 客户端和守护程序可以在同一系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护 进程。Docker 客户端和守护程序使用 REST API 通过 UNIX 进行通信 套接字或网络接口。另一个 Docker 客户端是 Docker Compose, 这使您可以处理由一组容器组成的应用程序。
3、Docker成就
开发者数量:Docker社区吸引了大约18万以上的活跃开发者。这些开发者在Docker的发展和改进中发挥着重要的作用。
应用数量:Docker容器技术为开发者提供了灵活、轻量级的部署方案,因此已经有大约7万个以上的应用程序使用了Docker容器。
镜像下载量:Docker Hub是最流行的Docker镜像仓库之一,作为Docker社区共享和存储镜像的平台,它每月的镜像下载量已超过13亿次。这反映了Docker在开发者和用户中的广泛应用程度。
二、K8S
k8s是一种开源的容器集群管理系统,可以实现容器集群的自动化部署、扩展、维护等功能。k8s的核心概念有四个:节点(node)、pod、服务(service)和控制器(controller)。节点是运行容器的主机,可以是物理机或虚拟机。pod是k8s中最小的调度单位,包含了一个或多个紧密相关的容器,共享网络和存储空间。服务是一种抽象层,定义了一组pod的访问方式,通常通过负载均衡来实现。控制器是一种管理pod和服务的机制,可以实现自动化地创建、更新、删除等操作。
Kubernetes提供了一组丰富的功能,包括:
自动化部署:Kubernetes可以自动部署容器化应用程序,根据定义的配置文件在集群中创建和运行容器。
负载均衡:Kubernetes支持自动进行服务的负载均衡,确保应用程序可以高效地处理流量。
自动扩展:Kubernetes可以根据资源使用情况自动扩展应用程序,以满足流量的增加需求。
自愈能力:Kubernetes具有自愈能力,可以自动检测并替换不健康的容器,确保应用程序的高可用性。
存储编排:Kubernetes可以管理存储系统,并为应用程序提供持久化存储的解决方案。
配置和密钥管理:Kubernetes支持管理应用程序的配置和密钥,确保安全性和灵活性。
水平扩展:Kubernetes可以根据应用程序的需求动态地调整副本数量,实现水平扩展。
1、容器技术演变
传统部署时代:
早期,各个组织是在物理服务器上运行应用程序。由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程序资源利用率不高时,剩余资源无法被分配给其他应用程序, 而且维护许多物理服务器的成本很高。
虚拟化部署时代:
因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。通过虚拟化,你可以将一组物理资源呈现为可丢弃的虚拟机集群。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
容器部署时代:
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
2、为什么需要 Kubernetes,它能做什么?
容器是打包和运行应用程序的好方式。在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。例如,如果一个容器发生故障,则你需要启动另一个容器。如果此行为交由给系统处理,是不是会更容易一些?
这就是 Kubernetes 要来做的事情!Kubernetes 为你提供了一个可弹性运行分布式系统的框架。Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。例如,Kubernetes 可以轻松管理系统的 Canary (金丝雀) 部署。
Kubernetes 为你提供:
服务发现和负载均衡Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
存储编排Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
自动部署和回滚你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
自动完成装箱计算你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
自我修复Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
密钥与配置管理Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
三、Docker vs K8s
容器引擎 vs. 容器编排器:
Docker是一个容器引擎,负责在单个主机上创建、运行和管理容器。它允许开发者将应用程序和其依赖项打包为一个轻量级、可移植的容器,从而实现应用程序的快速部署和运行。
Kubernetes是一个容器编排器,用于管理跨多个主机的容器集群。它的主要目标是自动化容器化应用程序的部署、扩展和运维,帮助开发者处理复杂的应用程序部署和管理任务。
支持的镜像类型:
Docker主要支持Docker镜像。Docker镜像是由Dockerfile定义的,其中包含了应用程序和其依赖项的打包信息。
Kubernetes不限制使用特定类型的容器镜像,它可以支持多种类型的容器镜像,包括Docker镜像、containerd镜像等。这使得Kubernetes可以与不同的容器运行时集成。
镜像定义方式:
Docker使用Dockerfile来定义镜像的构建规则,Dockerfile中包含了构建镜像所需的步骤和依赖项。
Kubernetes使用YAML或JSON文件来定义资源对象,其中包括Pod、Service、Deployment等。资源对象中通常包含容器镜像的信息,用于定义容器的运行方式和配置。
四、Docker Swarm vs K8s
k8s和Docker Swarm都是流行的容器编排工具,但它们有不同的特点和优势。
● k8s是一个独立于docker的项目,由Google创建并由云原生计算基金会(CNCF)管理。它支持多种容器运行时,如docker、rkt、containerd等。Docker Swarm是docker公司的容器编排系统,使用标准的docker API接口,与docker深度绑定。
● k8s提供了更多的功能和灵活性,如服务发现、健康检查、自动伸缩、更新升级、资源管理等。它还支持应用模板配置、标签选择器、服务要求等,可以实现复杂的调度策略。docker swarm相对简单直接,主要侧重于容器的部署和扩展。
● k8s有一个更大更活跃的社区,有很多开源项目和企业支持。它已经成为容器编排领域的事实标准。docker swarm相对较小较新,社区活跃度不高。
● k8s的学习曲线比较陡峭,需要掌握很多概念和命令。它的安装和配置也比较复杂。docker swarm使用简单方便,容易集成到现有系统。它的安装和配置也比较简单。
五、K8s弃用Docker?
k8s官方对于去掉docker的原因有以下几点解释:
k8s去掉的其实是dockershim,这是一个在kubelet和docker之间的适配器,用来将docker的接口转换为k8s所需的CRI(容器运行时接口)。这样做是为了简化k8s的架构,提高性能和安全性,以及支持更多的容器运行时。
k8s并没有完全弃用docker,而是弃用了docker作为容器运行时的支持。这意味着k8s将不再使用docker来创建和运行容器,而是使用其他符合CRI标准的运行时,如containerd或CRI-O123。这样做的原因是docker不符合CRI标准,而且需要一个叫做dockershim的中间层来适配k8s的API。
k8s去掉docker并不意味着docker就没有用了,或者你不能或者不应该用docker作为开发工具。docker仍然是构建容器镜像的非常有用的工具,而且它生成的镜像是符合OCI(开放容器倡议)标准的。这意味着任何用docker构建的镜像都可以在k8s中与其他容器运行时正常工作。所以你不需要担心你的docker镜像会失效或者不兼容。
链接:https://blog.csdn.net/citywu123/article/details/134132506?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169924036316800222829969%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=169924036316800222829969&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~times_rank-13-134132506-null-null.142^v96^pc_search_result_base9&utm_term=%E4%BA%91%E5%8E%9F%E7%94%9F&spm=1018.2226.3001.4187
(版权归原作者所有,侵删)
微信扫码关注该文公众号作者