与虚拟机相比,LXC隔离性方面有所不足,这就意味着在实现可移植部署会遇到一些困难 。这时候,我们就需要Docker来提供一个抽象层,并提供一个管理机制 。
Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 。Docker可以自动化打包和部署任何应用、创建一个轻量级私有PaaS云、搭建开发测试环境、部署可扩展的Web应用等 。构建出Docker的Container是一个很有意思的过程 。在这一个过程中,首先我们需要一个base images,这个基础镜像不仅包含了一个基础系统,如Ubuntu、Debian 。他还包含了一系列的模块,如初始化进程、SSH服务、syslog-ng等等的一些工具 。由上面原内容构建了一个基础镜像,随后的修改都将于这个镜像,我们可以用它生成新的镜像,一层层的往上叠加 。而用户的进程运行在writeable的layer中 。
![程序员必知的六种隔离技术](http://img.jiangsulong.com/220405/09222K114-3.jpg)
文章插图
从上图中我们还可以发现一点: Docker容器是建立在Aufs基础上的 。AUFS是一种Union File System,它可以不同的目录挂载到同一个虚拟文件系统下 。它的目的就是为了实现上图的增量递增的过程,同时又不会影响原有的目录 。即如下的流程如下:
![程序员必知的六种隔离技术](http://img.jiangsulong.com/220405/09222G524-4.jpg)
文章插图
image
其增量的过程和我们使用Git的过程中有点像,除了在最开始的时候会有一个镜像层 。随后我们的修改都可以保存下来,并且当下次我们提交修改的时候,我们也可以在旧有的提交上运行 。
因此,Docker与LXC的差距就如下如图所示:
![程序员必知的六种隔离技术](http://img.jiangsulong.com/220405/09222LB2-5.jpg)
文章插图
【程序员必知的六种隔离技术】
LXC时每个虚拟机只能是一个虚拟机,而Docker则是一系列的虚拟机 。
3、隔离底层(Servlet容器)
在上面的例子里我们已经隔离开了操作系统的因素,接着我们还需要解决操作系统、开发环境引起的差异 。早期开发Web应用时,人们使用CGI技术,它可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据 。并且CGI程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行 。而这样的脚本语言在多数情况下是依赖于系统环境的,特别是针对于C++这一类的编译语言来说,在不同的操作系统中都需要重新编译 。
而JAVA的Servlet则是另外一种有趣的存在,它是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面 。
Tomcat
在开发Java Web应用的过程中,我们在开始环境使用Jetty来运行我们的服务,而在生产环境使用Tomcat来运行 。他们都是Servlet容器,可以在其上面运行着同一个Servlet应用 。Servlet是指由Java编写的服务器端程序,它们是为响应Web应用程序上下文中的HTTP请求而设计的 。它是应用服务器中位于组件和平台之间的接口集合 。
Tomcat服务器是一个免费的开放源代码的Web应用服务器 。它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能 。除此,它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式 。其架构如下图所示:
![程序员必知的六种隔离技术](http://img.jiangsulong.com/220405/09222K5N-6.jpg)
文章插图
Servlet被部署在应用服务器中,并由容器来控制其生命周期 。在运行时由Web服务器软件处理一般请求,并把Servlet调用传递给“容器”来处理 。并且Tomcat也会负责对一些静态资源的处理 。
4、隔离依赖版本(虚拟环境)
对于Java这一类的编译语言来说,不存在太多语言运行带来的问题 。而对于动态语言来说就存在这样的问题,如Ruby、Python、Node.js等等,这一个问题主要集中于开发环境 。当然如果你在一个服务器上运行着几个不同的应用来说,也会存在这样的问题 。这一类的工具在Python里有VirtualEnv,在Ruby里有RVM、Rbenv,在Node.js里有NVM 。
下图是使用VirtualEnv时的不同几个应用的架构图:
![程序员必知的六种隔离技术](http://img.jiangsulong.com/220405/09222G457-7.jpg)
文章插图
如下所示,在不同的虚拟环境里,我们可以使用不同的依赖库 。在这上面构建不同的应用,也可以使用不同的Python版本来构建系统 。通常来说,这一类的工具主要用于本地的开发环境 。
推荐阅读
- Redis数据结构和通用命令
- 了解交换机、路由器、网关的概念
- 世界最高最危险的滑梯 世界最长滑梯
- 路由器的隐藏功能,你知道几个?
- 梦见不认识的老人是什么意思 梦见很多不认识的老人
- 玉蝴蝶茶的功效
- 紫阳富硒茶怎么喝减肥
- 求职|高校“非升即走”政策:被和尚念歪了的“正经”
- 白毫银针与云南白毫的区别
- 7年白毫银针的功效价值