为什么容器对 OpenStack 来说很重要?

本文主要介绍了容器的发展、容器技术、容器类型、Docker、Open Container Initiative、微服务以及OpenStack中容器的应用。

容器现在正经历着一次重生,部分原因是由于云计算的发展。

容器化不是一个革命性想法——容器技术已经存在很多年并且被大量应用程序所使用,但现在,容器几乎不考虑系统体结构。

今天,相信很多人都听说过Docker。一年多以来,很多公司都在评估Docker,也有很多公司想要使用Docker,但是很少公司真正把Docker应用在生产环境中。那这一年发生了什么变化呢?

Docker让容器化变得更加简单

在Docker出现之前,运行容器需要成群的骇客,需要对整个系统有深入的理解,还需要一定的勇气。进程隔离或者网络堆栈是存在已久的一些技术,想想FreeBSD中的Jails或者其他类似的工具。但现在有了Docker,只需要使用(docker)命令就能在几秒钟内让一些东西运行起来。

即时满足感不是Docker成功的唯一原因。大量免费应用程序的镜像能够吸引很多想要快速部署微服务以达到更大体系架构的人,但这些人不希望每次都重新部署虚拟化堆栈。

事实上,避免了虚拟化堆栈,相对于虚拟机几分钟的启动时间,容器能够在数秒之内启动,这加快了整个基础设施的部署。

当然,容器也不是完全没有问题,例如安全性和其他一些不够成熟技术带来的问题。在关键系统上运行容器之前这些问题都需要被解决,但容器化对于所有人来说都是一种期待。

容器是什么,容器的结构是什么,它们和虚拟机的关系是什么

很多人将容器比作虚拟化,但是容器并不能运行所有的东西。例如,你不能在一个容器中设置iptables的防火墙规则;因为容器共享了宿主机的内核,它们不像虚拟机一样抽象化了硬件层。由于缺乏经验,在你开始使用容器之前,将容器看成一种“简单虚拟化”工具会给你的业务层埋下潜在的危险。

显然我们需要花时间更好地理解容器,那他们是什么?

容器是一种技术,这种技术让开发者下载一些基础镜像,载入他们的应用程序,拆分成几个组件,在持续集成系统上一一部署和测试,然后将这些组件注册到仓库中,让系统工程师在现存的基础设施上进行部署,然后发布给外界使用。

一个容器是操作系统层虚拟化特征的一种抽象。通过开拓这些特征,容器系统能够将进程和网络隔离成类似于系统沙盒的东西,因此将一个应用程序载入一个容器就好像把它从操作系统上隔离出来一样:在容器中的进程是独立的;它们看到的是自己的文件系统,也能够与外界进行通信等等。很多能够跑在虚拟机里的应用程序也能够跑在容器里面。

容器和虚拟机的不同在于解耦了虚拟化堆栈;虚拟机将内核到用户空间二进制文件与库文件再到应用程序本身的一切都压入了堆栈中进行隔离和独立存放。而容器管理程序则让容器使用相同的内核,共享相同的用户空间二进制文件,共享其他的库文件,然后让应用程序直接运行在这些层上。

一个镜像可以作为其他镜像的Base。在Docker中,在一个镜像之上构建新镜像来获得功能结果非常正常。你也许会在一个Ubuntu镜像上添加Apache 2.4 web服务器来构建一个基于Web的微服务,然后生成新的镜像。

镜像是容器运行的基础,你需要在镜像(building block)上启动一个容器(runtime)。镜像中包括了容器的应用程序,类似于一个快照但是还具备两个额外的特征。首先,它们在用户空间文件系统之上进行构建,能够进行堆叠和共享一些内容。其次,它们可移植。这就允许用户在不同的系统上使用相同的镜像,重新利用这些镜像或者通过公共仓库提供给其他用户使用,并且能够轻松地更新这些镜像,然后存放到任何地方。

容器类型

最开始的时候是chroot。Chroot()是*NIX操作系统内核的一个系统调用,用来改变当前运行进程的root目录。进程运行在chroot jail(环境名称)上并不知道真实文件系统的root目录,但知道user choice的表层root目录。

这个函数能够让你隔离应用程序,让进程将其他目录视为根目录,例如将 /mnt/root 视为 / 。这就意味着应用程序只能看到 /mnt/root 上的文件,因此构建一个完整的环境来运行这个应用程序需要 /mnt/root 目录下构建软件完整目录树的操作权。包括存放二进制文件的 /bin 目录,存放用户空间程序与库文件的 /usr 目录,存放配置的 /etc 目录等等。这些操作没那么容易,特别是对于更加复杂的应用程序来说,就更难了。