zl程序教程

您现在的位置是:首页 >  工具

当前栏目

探寻容器的本质

容器 探寻 本质
2023-06-13 09:11:15 时间

什么是容器技术

云原生的基础就是容器化。可以说正是容器技术的快速发展,才推动了云原生的时代浪潮。

要想理解容器的本质,我们先来聊聊是容器技术。广义上来说:容器技术 = 动态的容器 + 静态的镜像 + 远端的仓库。容器、镜像和仓库构成了容器技术的三要素,其中最核心的概念就是容器。简单来说,镜像就是把应用程序运行所依赖的环境、配置等打包成的一个文件;而仓库则是保存和管理这些镜像的地方。这两个概念我们后面的章节会详细展开,本节就先来说一下容器。

容器的本质

那么到底什么是容器呢?我们结合 Docker 官方的图片来感性理解下:

 Docker 的 Logo 是一条小鲸鱼,其实它代表的是码头工人,上面运输的就是一个个标准化、可装卸、互相隔离的集装箱。有了集装箱之后,相比于原始的零散式运输有以下的优势:

  1. 标准规格:每个集装箱的尺寸、大小都是完全相同的,这就使得货物的存放可以十分紧凑,空间利用率高,且便于高效的运输和统计。
  2. 互相隔离:不同集装箱之间的货物不会互相影响,比如一个集装箱中的饮料洒了,并不会损坏另一个集装箱中的面包。

集装箱被发明了之后,远洋货物运输行业得到了蓬勃的发展,很大程度上促进了国际贸易的繁荣。

其实容器和集装箱做的是同样的事情。结合对集装箱的理解,我们尝试给容器下一个定义:

容器,英文 Container,本质就是对进程的封装。它创建了一个特殊的隔离环境,能够让进程只看到这个环境里的有限的信息,不能对外界环境施加影响。

为什么需要隔离

从上面的描述可以看出,容器的关键就在于隔离。那么为什么要隔离呢?不隔离会产生什么问题呢?

我们回想一下传统的应用部署方式:为了节省硬件资源,我们可能买了一台物理服务器,在上面部署了用户、商品、订单三个服务。大多数情况下可能系统运行良好,但是想象一下下面这两种情况:

  1. 运营上线了秒杀活动,订单交易量大增,订单服务很快就把物理机的内存占满了,这时用户和商品服务也会同时出现 OOM 异常,导致整个业务崩溃。
  2. 用户系统遭到了黑客攻击,被注入了恶意的脚本,把服务器根目录下的文件都删除了。这时我们不得不停机恢复,业务又不可用了。

可以看到,如果没有对进程的隔离,让进程可以不加限制地访问机器资源、操作文件系统,那么造成的后果可能是灾难性的。隔离的意义就在于:

  1. 系统安全:限制容器内的进程对操作系统资源的访问,避免出现安全风险。
  2. 资源配额管理:在系统里划分出一部分资源,只给予应用一定的使用配额。

这就是容器所解决的问题:可以让应用程序运行在一个有严密防护的“沙箱”(Sandbox)环境之内,它可以在这个环境里自由活动,但绝不允许“越界”,从而保证了容器外系统的安全。

如何实现隔离

实现容器技术的关键就在 Linux 内核当中。Linux Kernel 为资源隔离提供了三种技术:

  • namespace:2002 年从 Linux 2.4.19 开始出现,它可以创建出独立的文件系统、主机名、进程号、网络等资源空间,实现了系统全局资源和进程局部资源的隔离。
  • cgroup:2008 年从 Linux 2.6.24 开始出现,全称是 Linux Control Group,用来实现对进程的 CPU、内存等资源的优先级和配额限制。
  • chroot:早在 1979 年的 UNIX V7 就已经出现了,它可以更改进程的根目录,也就是限制访问文件系统。

有趣的是,这三种技术都是在很早之前就出现了,并且初衷也并不是为了实现容器,但结合在一起之后却催生出了影响计算机发展进程的容器技术。

我们先大概了解这三种技术可以用来实现资源隔离和配额管理就可以,具体的原理会在后面的章节里详细分析。

容器化 vs 虚拟机

既然说容器的核心是为了解决应用的隔离问题,那么虚拟化技术也可以实现这个目标,容器和虚拟机到底有什么区别呢?我们看下 Docker 官方提供的一张对比图:

左边是虚拟机,它的核心就是 Hypervisor 虚拟化技术。 简单来说,就是在底层物理机的基础上,再虚拟化出的是硬件资源,并且在上面创建操作系统。大家应该都有过使用虚拟机的经验,我们可以在电脑上安装 VMware 或者 Virtual Box,在里面创建几台虚拟机,可以安装任意一种操作系统。这种方式最大的优势就是隔离性好,不同的虚拟机之间是完全不受影响的。但是缺点也很明显,一方面是资源消耗较大,因为每台虚拟机都要再创建一个操作系统。另一个就是启动慢。自己搭建过虚拟机集群的小伙伴应该都有感受,虚拟机开多了之后电脑会卡到怀疑人生。

右边就是容器技术,它直接利用了底层的计算机硬件和操作系统,因为比虚拟机少了一层,所以自然就会节约 CPU 和内存,显得非常轻量级,能够更高效地利用硬件资源。不过,因为多个容器共用操作系统内核,应用程序的隔离程度就没有虚拟机那么高了。

我列了一张表格,对容器和虚拟机进行一下简单的对比:

实现方式

优势

劣势

虚拟机

虚拟化硬件(Hypervisor)

隔离性好

资源占用高 性能差

容器

直接使用底层宿主机的硬件资源

资源占用小 性能高

隔离性差

运行效率和资源利用率,是容器最大的优势。我们可以在一台普通的服务器上运行成百上千个容器,而且可以实现秒级启动,完全符合了现代互联网快速迭代和敏捷开发的模式,这也是为什么这几年容器越来越有一统天下的趋势。

但是,容器和虚拟机这两种技术并不是互斥的,很多场景下可以结合使用。比如我们可以在数据中心先创建多个虚拟机集群,用于实现资源隔离;再在每个虚拟机集群中部署多个应用容器。