Docker 的前世今生

Container 是一个新兴的技术吗?

其实不是。

Docker 脱胎于 Linux Container,对其进行发扬光大。

今天我们来简单学习下 linux container。

Linux Container

是什么

Linux®容器是与系统其余部分隔离的一组一个或多个进程。

运行它们所需的所有文件均从一个不同的映像提供,这意味着Linux容器在从开发,测试到最终到生产的过程中都是可移植且一致的。

这使它们比依赖复制传统测试环境的开发管道快得多。

由于它们的普及性和易用性,容器也是IT安全的重要组成部分。

为什么使用

假设您正在开发应用程序。

您在笔记本电脑上进行工作,并且您的环境具有特定的配置。

其他开发人员的配置可能略有不同。 您正在开发的应用程序依赖于该配置,并且依赖于特定的库,依赖项和文件。

同时,您的企业具有开发和生产环境,这些环境已通过其自己的配置和他们自己的支持文件集进行了标准化。

您希望在本地尽可能模拟这些环境,但是没有重新创建服务器环境的所有开销。

因此,如何使您的应用程序在这些环境中正常工作,通过质量保证并在没有大的麻烦,重写和中断修复的情况下部署应用程序?

答案:容器。

容器有什么

保存您的应用程序的容器具有必要的库,依赖项和文件,因此您可以在生产过程中移动它,而不会产生所有讨厌的副作用。

实际上,容器映像的内容可以视为Linux发行版的安装,因为它附带RPM软件包,配置文件等。但是,容器映像发行比安装操作系统的新副本容易得多。

避免了危机-每个人都很高兴。

重点是什么

这是一个常见的例子,但是Linux容器可以通过多种方式应用于问题,这些方式需要最终的可移植性,可配置性和隔离性。

Linux容器的重点是更快地开发并满足它们出现时的业务需求。

在某些情况下,例如使用Apache Kafka进行实时数据流传输,容器是必不可少的,因为它们是提供应用程序所需的可伸缩性的唯一方法。

无论是内部部署,云计算还是两者的混合,容器都可以满足需求。

当然,选择正确的容器平台与容器本身同样重要。

这不只是虚拟化吗?

不完全是。

可以将它们更多地看作是彼此的补充。

这是考虑两者的一种简单方法:

虚拟化可让您的操作系统(Windows或Linux)在单个硬件系统上同时运行。

容器共享相同的操作系统内核,并将应用程序进程与系统的其余部分隔离。

例如:ARM Linux系统运行ARM Linux容器,x86 Linux系统运行x86 Linux容器,x86 Windows系统运行x86 Windows容器。

Linux容器具有极高的可移植性,但是它们必须与基础系统兼容。

虚拟化 vs 容器

这是什么意思?

首先,虚拟化使用虚拟机管理程序来仿真硬件,该硬件允许多个操作系统并行运行。

这不像使用容器那样轻巧。

当您拥有具有有限功能的有限资源时,就需要可以密集部署的轻量级应用程序。

Linux容器本机运行在操作系统上,可在所有容器中共享,因此您的应用程序和服务保持轻量级且可快速并行运行。

Linux容器是我们开发,部署和管理应用程序的另一种进化飞跃。

Linux容器映像提供了可移植性和版本控制,有助于确保开发人员的便携式计算机上的内容也可以在生产环境中使用。

与虚拟机相比,运行中的Linux容器占用的资源较少,具有标准接口(启动,停止,环境变量等),可以保持应用程序隔离,并且可以作为大型应用程序(多个容器)的一部分进行管理,此外,这些多容器应用程序可以跨多个云进行编排。

linuxcontainers

集装箱项目的基础设施。

linuxcontainers.org 是LXC,LXD和LXCFS的总体项目。

目的是为Linux容器技术的开发提供一个发行商和供应商无关的环境。

我们的主要重点是系统容器。

也就是说,容器提供的环境与您从VM获得的环境尽可能接近,但没有运行单独的内核并模拟所有硬件所带来的开销。

LXC

LXC是众所周知的工具,模板,库和语言绑定集。

它的级别很低,非常灵活,几乎涵盖了上游内核支持的每个遏制功能。

LXC已发布LTS,并已提供5年的安全性和错误修正更新,现已投入生产。

LXD

LXD是新的LXC体验。

它使用一个命令行工具来管理容器,从而提供了全新的直观用户体验。

可以通过REST API以透明方式通过网络管理容器。

通过与OpenNebula和OpenStack等云平台集成,它还可以用于大规模部署。

LXCFS

用户空间(FUSE)文件系统提供两个主要功能:

  • cpuinfo,meminfo,stat和uptime的覆盖文件。

  • 一个cgroupfs兼容树,允许无特权写入。

它旨在通过导出与系统容器用户期望匹配的文件来解决procfs,sysfs和cgroupfs的缺点。

什么是LXC?

Linux容器项目(LXC)是一个开源容器平台,提供了一组工具,模板,库和语言绑定。

LXC具有简单的命令行界面,可改善启动容器时的用户体验。

LXC提供了可在许多基于Linux的系统上安装的操作系统级虚拟化环境。

您的Linux发行版可能会通过其软件包存储库提供它。

可以做什么

LXC可以在操作系统层次上为进程提供的虚拟的执行环境,一个虚拟的执行环境就是一个容器。

可以为容器绑定特定的cpu和memory节点,分配特定比例的cpu时间、IO时间,限制可以使用的内存大小(包括内存和是swap空间),提供device访问控制,提供独立的namespace(网络、pid、ipc、mnt、uts)

LXC 如何实现?

Sourceforge上有LXC这个开源项目,但是LXC项目本身只是一个为用户提供一个用户空间的工具集,用来使用和管理LXC容器。LXC真正的实现则是靠Linux内核的相关特性,LXC项目只是对此做了整合。基于容器的虚拟化技术起源于所谓的资源容器和安全容器。

LXC在资源管理方面依赖与Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。

LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在clone时加入相应的flag(NEWNS NEWPID等等)。

为什么要选择LXC?

LXC是所谓的操作系统层次的虚拟化技术,与传统的HAL(硬件抽象层)层次的虚拟化技术相比有以下优势:

更小的虚拟化开销(LXC的诸多特性基本由内核特供,而内核实现这些特性只有极少的花费,具体分析有时间再说)

快速部署。利用LXC来隔离特定应用,只需要安装LXC,即可使用LXC相关命令来创建并启动容器来为应用提供虚拟执行环境。传统的虚拟化技术则需要先创建虚拟机,然后安装系统,再部署应用。

LXC跟其他操作系统层次的虚拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁。

容器简史

我们现在称为容器技术的想法最早出现在2000年,当时是FreeBSD监狱,该技术可将FreeBSD系统划分为多个子系统或监狱。

Jails被开发为系统管理员可以与组织内部或外部的多个用户共享的安全环境。

2001年,通过JacquesGélinas的VServer项目,一种隔离环境的实现进入Linux。

一旦为Linux中的多个受控用户空间奠定了基础,各个部分就开始融合在一起,形成了当今的Linux容器。

很快,更多的技术组合起来使这种孤立的方法成为现实。

控制组(cgroups)是一项内核功能,用于控制和限制一个或多个进程组的资源使用。

cgroup使用systemd(一个初始化系统来设置用户空间并管理其进程)来对这些隔离的进程提供更好的控制。

这两种技术在增加对Linux的总体控制的同时,也是如何使环境成功保持分离的框架。

Docker 时代

在2008年,Docker以其同名的容器技术(通过dotCloud)出现在现场。

docker技术添加了许多新概念和工具-用于运行和构建新分层图像的简单命令行界面,服务器守护程序,预构建容器图像库以及注册表服务器的概念。

这些技术结合在一起,使用户可以快速构建新的分层容器并轻松与他人共享。

有3个主要标准可确保容器技术的互操作性-OCI映像,分发和运行时规范。

结合这些规范,社区项目,商业产品和云提供商可以构建可互操作的容器技术(请考虑将自定义构建的映像推送到云提供商的注册表服务器中-您需要它来工作)。

如今,红帽和Docker以及许多其他组织都是开放容器计划(OCI)的成员,它们正在实现容器技术的开放式行业标准化。

容器安全性如何?

容器很受欢迎,但是它们的安全性如何?

涉及到容器安全性的因素很多,您需要保护容器管线和应用程序;

部署环境和基础架构,则需要制定计划以与企业安全工具和策略集成。

参考资料

Windows Container 和 Docker:你需要知道的5件事

Linux Container

linuxcontainers

whats-a-linux-container

https://coreos.com/os/docs/latest/