什么是容器

Linux® 容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

容器,可以想象成一个箱子,这个箱子里有格子,有套网,有刷子等等工具,你可以往里放衣服,放鞋子,放你要用的东西。你的衣服,鞋子放在自己的旅行箱正合适,但是放在另一个箱子可能就会弄褶皱。这里衣服就好比应用程序,箱子就是容器。如果没有容器,直接将程序安装到电脑上(简单说就是操作系统中),很可能会出现不兼容,缺少依赖,某个功能莫名失效的问题。而如果把应用程序安装在容器中,再将容器复制到新的系统中,则完美运行。

更加详细地来说,假定你在开发一个应用。你使用的是一台笔记本电脑,而且你的开发环境具有特定的配置。其他开发人员身处的环境配置可能稍有不同。你正在开发的应用依赖于你当前的配置,还要依赖于某些特定文件。与此同时,你的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。你希望尽可能多在本地模拟这些环境,而不产生重新创建服务器环境的开销。因此,你要如何确保应用能够在这些环境中运行和通过质量检测,并且在部署过程中不出现令人头疼的问题,也无需重新编写代码和进行故障修复?答案就是使用容器。容器可以确保你的应用拥有必需的配置和文件,使得这些应用能够在从开发到测试、再到生产的整个流程中顺利运行,而不出现任何不良问题。这样可以避免危机,做到皆大欢喜。

容器不就是虚拟化吗?

是,但不完全是。

虚拟化是让多个操作系统安装在一台机器上运行。容器则可以共享同一个操作系统,将应用进程与系统其他部分隔离开。虚拟化将注意力放在操作系统上,容器将注意力放在应用上,更轻量化。

cgroup(control groups)

控制组 (cgroups) 是一项内核功能,能够控制和限制一个进程或多组进程的资源使用。而 systemd 初始化系统可设置用户空间,并且管理它们的进程,cgroups 使用该系统来更严密地控制这些隔离进程。这两种技术在增加对 Linux 的整体控制的同时,也成为了保持环境隔离的重要框架。

systemd(system daemon,系统守护进程)

systemd是Linux中的一套基础构建模块。提供一个system和服务管理器,服务管理器PID为1,然后启动剩下的服务。systemd提供了积极的并行机制,使用socket和D-Bus激活服务,提供按需启动的进程,通过cgroups,保持挂载和自动挂载来监控进程。

User namespaces progress

用户名称空间的改进推动了容器的进一步发展。用户名称空间“使得用户和组 ID 可以按名称空间进行映射。对于容器而言,这意味着用户和组可以在容器内部拥有执行某些操作的特权,而在容器外部则没有这种特权。” 这类似于 Jail 概念,但它实现了进一步的进程隔离,从而增加了安全性,而不再是 Jail 的修改环境的概念。

容器是操作系统层虚拟化特征的一种抽象

Linux 容器是我们开发、部署和管理应用方式的又一次飞跃。Linux 容器镜像提供了可移植性和版本控制,确保能够在开发人员的笔记本电脑上运行的应用,同样也能在生产环境中正常运行。

运行 Linux 容器消耗的资源少于虚拟机,但在很大程度上保持了应用隔离,而且它作为大型应用的一部分更加易于管理。

Linux 容器的价值在于它能加速开发并满足新出现的业务需求,而并非用于完成这些工作的软件。不要认为容器只限于运行单个应用:您可以使用容器来运行应用或服务的多个部分。而且,您可以使用其他技术(如 Kubernetes)让容器化应用实现自动化并对这些应用进行编排。由于容器托管了应用逻辑、运行时和依赖项,因此您的容器可以包括所有这一切,或者也可以构建一个应用,其中包含多个用作微服务的容器。

Share