什么是容器化,哪种工具适合我的企业?

容器将应用程序的代码、二进制文件和依赖项打包在一起。容器包含应用程序所需的一切。它可以在任何兼容的硬件上运行,无论是云服务器、专用服务器、混合虚拟服务器还是开发人员的笔记本电脑。容器简化了应用程序的开发和部署。


近年来,集装箱变得越来越流行。与虚拟机相比,企业组织更频繁地使用容器托管,并且像 Google 这样的公司在数以万计的容器上运行其整个基础架构。

但是容器是如何工作的呢?他们依赖什么软件?您的组织应该为其容器化基础设施考虑哪些工具?

什么是容器?
集装箱以运输集装箱命名。海运集装箱是标准尺寸的大箱子。航运中使用的所有设备——船舶、起重机、叉车和卡车——都是围绕集装箱的标准尺寸设计的。世界上每个港口都有处理集装箱的设备。标准化使运输更快、更便宜、更高效。

在计算中,容器的用途大致相同。容器是容纳软件的“盒子”。容器是标准化的,并与系统的其余部分隔离。它们包含应用程序的代码和二进制文件、实用软件以及该软件所依赖的任何外部库。

与虚拟机不同,容器不包含操作系统或操作系统附带的多余软件。这使得容器比虚拟机更小更快。它们消耗更少的存储空间和内存。容器的启动速度比虚拟机快得多——几秒钟而不是几十秒或几分钟。

深入容器抽象
在上一节中,我们对容器是什么进行了高级解释。您经常会发现容器被描述为“类似于虚拟机,但速度更快且资源消耗更少”。像所有高级抽象一样,这只是在一定程度上是准确的。

事实上,容器与虚拟机完全不同。

容器只是一组正在运行的进程,它们利用 Linux 内核的特性进行隔离和资源分配。这些功能是 cgroups 和命名空间。

Cgroups(或控制组)限制和隔离一组进程的资源使用。它们允许将进程“捆绑在一起”,并为每个捆绑包提供对网络、CPU、内存和其他系统资源的限制。

命名空间限制了进程(或进程组)可以访问的系统部分。例如,每个进程都在一个进程命名空间中。通常,操作系统是一棵大的进程树,但子树可以放在它自己的命名空间中。命名空间中的进程无法看到或访问命名空间之外的任何进程。系统的其他部分也有命名空间,例如文件系统和网络。

考虑一个可以启动子进程但与系统其余部分隔离的进程,它只能访问自己的根目录,其中包含它需要运行的所有库和其他软件,并且对服务器资源的访问权限有限——这就是 cgroups 和命名空间所提供的,这就是容器。

Docker 和其他容器系统围绕这些内核特性添加了基础设施和工具。

Docker 容器化的组件
我们已经了解了容器是什么,但是用于运行和管理容器的软件呢?

容器镜像——容器镜像是一个文件,其中包含将应用程序作为容器运行所需的组件,包括代码和库。实际上,它是容器的快照。一个容器的多个实例可以基于每个容器镜像运行。

容器引擎——容器引擎或运行时是运行容器的软件。它或相关工具接收来自用户的请求并创建正在运行的容器实例。使用最广泛的容器引擎是 Docker,但还有其他几个,包括 LXD 和 RKT。

注册表服务器——注册表服务器是托管容器存储库的文件服务器,出于实际目的,可以将其视为容器映像。容器引擎可以在运行之前从注册表服务器中拉取容器镜像。

构建配置文件——构建配置文件——例如与 Docker 一起使用的 Dockerfile——包含用于构建和配置映像的命令。这些命令可能会从注册表中提取图像、安装软件、设置网络以及在容器内执行命令。

假设您想在服务器上的容器中运行 WordPress。为此,您将运行如下命令:

docker pull wordpress:latestdocker 运行 wordpress

第一个命令从注册表服务器中提取最新的 Docker 映像。第二个命令将 WordPress 映像作为容器实例运行。

上面的例子被简化了。它缺少网络和其他配置细节。但最重要的是,它缺少 WordPress 所需的数据库。容器允许开发人员和 DevOps 专业人员将应用程序拆分为多个不同的容器。要运行 WordPress,您将运行一个 MySQL 容器和一个 WordPress 容器。

一个应用程序可以使用许多不同的容器。应用程序本身可能被划分为微服务。为了冗余或性能,可以复制容器。它很快变得复杂,运行成百上千个容器并不少见。需要运行和管理许多容器的组织使用编排软件。

使用 Docker 的编排工具
有几种容器格式,每种格式都有相关的编排软件。但我们将专注于两个最流行的 Docker 编排工具:Docker Swarm 和 Kubernetes。

什么是容器编排软件?
容器编排控制和自动化使用大型容器部署所需的许多功能。它处理供应和部署、扩展、冗余、资源分配、负载平衡、服务发现等。

手动管理具有一百个不同容器的复杂 Web 应用程序是不可能的。相反,DevOps 专业人员使用配置文件来描述部署、容器之间的连接、要使用的容器映像等。

然后,编排软件自动部署和管理容器集群,通常跨越许多不同的服务器。当您想要部署更多容器时,编排软件会在将容器部署到适当的主机之前查看服务器上可用的资源和其他约束。

为您的公司选择编排软件?
Kubernetes 是在开源之前由 Google 创建的。它是一个非常强大的编排平台,被企业组织广泛使用和信任。

Kubernetes 处理容器部署和管理的各个方面,例如自动扩展、容器自动重启、复制和负载分配。 Kubernetes 将容器部署划分为集群。每个集群都由一个集群主容器管理,该容器控制许多集群节点——工作容器。

Kubernetes 非常适合企业级部署,但也很复杂。对于较小的部署,Kubernetes 可能是矫枉过正。

由 Docker 容器系统背后的公司创建的 Docker Swarm 实现了许多与 Kubernetes 相同的功能。然而,Swarm 使用更简单,缺乏 Kubernetes 的一些可扩展性和多环境能力。

Swarm 将多个主机转换为一个虚拟主机——一个可以启动容器的资源池。 Swarm 在概念上类似于 Kubernetes。 swarm 类似于 Kubernetes 集群。管理节点类似于集群主节点。