一:什么是Container?Container的作用?

容器是一个标准的软件单元,它将代码及其所有依赖关系打包,以便应用程序从一个计算环境快速可靠地运行到另一个计算环境.container的主要作用是将软件打包成标准化单元用于开发,装运和部署。下面以当下比较受欢迎的Docker容器为例说明container的作用构成以及和虚拟软件的区别。

Container所处的位置:

Container可以运行在不同的操作系统之上

容器与虚拟机的区别

容器和虚拟机具有类似的资源隔离和分配优势,但功能不同,因为容器虚拟化操作系统而不是硬件。容器更便携,更高效。

container:

容器是应用层的抽象,它将代码和依赖关系打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。容器占用的空间比VM少(容器映像的大小通常为几十MB),可以处理更多的应用程序,并且需要更少的VM和操作系统

VM:

虚拟机(VM)是物理硬件的抽象,将一台服务器转变为多台服务器。管理程序允许多台VM在单台机器上运行。每个VM都包含操作系统的完整副本,应用程序,必要的二进制文件和库 - 占用数十GB。虚拟机也可能很慢启动。

Container的历史:

1979年:Unix V7     

在1979年Unix V7 的开发过程中,引入了chroot系统调用,将进程的根目录及其子进程更改为文件系统中的新位置。这一进步是开始的进程隔离:隔离每个进程的文件访问。Chroot 于1982年加入BSD

2000:FreeBSD Jails

FreeBSD Jails允许管理员将FreeBSD计算机系统划分为几个独立的小型系统 - 称为“jails” - 能够为每个系统和配置分配IP地址

2001:Linux VServer

与FreeBSD Jails一样,Linux VServer是一种可以对计算机系统上的资源(文件系统,网络地址,内存)进行分区的监狱机制

2004年:Solaris Containers

2004年,第一个公开测试版 Solaris容器  被释放 吨ħ 在  联合机系统的资源控制,并通过区域,这是能够利用像从ZFS快照和克隆特征提供边界分离

2005年:Open VZ(Open Virtuzzo)

这是Linux 的操作系统级虚拟化技术,它使用修补的Linux内核进行虚拟化,隔离,资源管理和检查点.

2006年:流程容器

Process Containers(由Google于2006年推出)旨在限制,计算和隔离一组进程的资源使用(CPU,内存,磁盘I / O,网络)。一年后它被重命名为“控制组(cgroups)”,最终合并到Linux内核2.6.24。

2008年:LXC

LXC(LinuX容器)是Linux容器管理器的第一个,最完整的实现。它是在2008年使用cgroups和Linux命名空间实现的,它可以在单个Linux内核上运行,无需任何补丁。

2013年:LMCTFY

(LMCTFY)在2013年开始作为谷歌容器堆栈的开源版本,提供Linux应用程序容器。应用程序可以“容器识别”,创建和管理自己的子容器。在谷歌开始向libcontainer(现在是Open Container Foundation的一部分)提供核心LMCTFY概念后,LMCTFY的积极部署于2015年停止。

2013年:Docker 

当Docker于2013年问世时,容器爆炸式增长。Docker和容器使用的增长并非巧合,这并非巧合  。 正如Warden所做的那样,Docker在其初始阶段也使用了LXC,后来用自己的库libcontainer替换了该容器管理器。但毫无疑问,Docker通过为集装箱管理提供整个生态系统而脱颖而出

二:Injection/Dependency injection

软件工程中依赖注入是一种技术,其中一个对象(或静态方法)提供另一个对象的依赖关系。依赖项是可以使用的对象(服务)。注入是将依赖项传递给将使用它的依赖对象(客户端)。该服务是客户所在端的一部分。将服务传递给客户端,而不是允许客户端构建或找到服务,是模式的基本要求。

依赖注入的目的是对象解耦到不需要更改客户端代码的程度,因为它所依赖的对象需要更改为不同的对象。这允许遵循开放/封闭原则

依赖注入是更广泛的控制反转技术的一种形式。与其他形式的控制反转一样,依赖注入支持依赖性反转原则。客户端将其依赖关系的责任委托给外部代码(注入器)。客户端不允许调用注入器代码; [2]它是构建服务并调用客户端注入它们的注入代码。这意味着客户端代码不需要知道注入代码,如何构建服务,甚至不知道它正在使用哪些实际服务; 客户端只需要知道服务的内在接口,因为它们定义了客户端如何使用服务。这分离了使用和构造的责任。

客户端接受依赖注入有三种常用方法:setter - ,interface - 和基于构造函数的注入。Setter和构造函数注入主要取决于它们何时可以使用。接口注入的不同之处在于依赖关系有机会控制其自身的注入。每个都要求单独的构造代码(注入器)负责将客户端及其依赖关系引入彼此。

为什么要使用依赖注入:

  • 依赖注入允许客户端灵活地进行配置。只修改了客户端的行为。客户端可以对支持客户期望的内部接口的任何事情采取行动。
  • 依赖注入可用于将系统的配置详细信息外部化为配置文件,从而允许在不重新编译的情况下重新配置系统。可以针对需要不同组件实现的不同情况编写单独的配置。这包括但不限于测试。
  • 因为依赖注入不需要对代码行为进行任何更改,所以它可以作为重构应用于遗留代码。结果是客户端更加独立,并且使用存根模拟对象模拟其他未测试的对象,更容易单独进行单元测试。这种易测性通常是使用依赖注入时注意到的第一个好处。
  • 依赖注入允许客户端删除它需要使用的具体实现的所有知识。这有助于将客户端与设计更改和缺陷的影响隔离开来。它提高了可重用性,可测试性和可维护性。
  • 减少应用程序对象中的样板代码,因为初始化或设置依赖项的所有工作都由提供程序组件处理。
  • 依赖注入允许并发或独立开发。两个开发人员可以独立开发彼此使用的,而只需要知道类将通过的接口。插件通常由第三方商店开发,甚至从不与创建使用插件的产品的开发人员交谈。
  • 依赖注入减少了类与其依赖关系之间的耦合。

总结:由于container可以很好的解决程序在不同环境下的移植很运行所以container在以后会发展的越来越全面,功能也会越来越全面,使用会更加普及。

参考链接:

https://en.wikipedia.org/wiki/Dependency_injection

https://www.docker.com/resources/what-container

https://blog.aquasec.com/a-brief-history-of-containers-from-1970s-chroot-to-docker-2016

container/injection简介以及发展历史的更多相关文章

  1. 为什么会出现container、injection技术?发展历史及未来发展趋势

    container 原因: 随着软件开发的发展,相比于早期的集中式应用部署方式,现在的应用基本都是采用分布式的部署方式,一个应用可能包含多种服务或多个模块,因此多种服务可能部署在多种环境中,如虚拟服务 ...

  2. (第一篇)linux简介与发展历史以及软件的安装

    1.Linux操作系统基本结构介绍: 操作系统: 英文名称Operating System,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统 ...

  3. C/C++语言简介之发展历史

    C语言之所以命名为C,是因为 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言. 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BC ...

  4. Hadoop发展历史简介

    简介 本篇文章主要介绍了Hadoop系统的发展历史以及商业化现状, 科普文. 如果你喜欢本博客,请点此查看本博客所有文章:http://www.cnblogs.com/xuanku/p/index.h ...

  5. Update(stage3):第1节 redis组件:1 - 3、web发展历史以及redis简介

    Redis课程教案 1. NoSQL数据库的发展历史简介 1.web系统的变迁历史 web1.0时代简介 基本上就是一些简单的静态页面的渲染,不会涉及到太多的复杂业务逻辑,功能简单单一,基本上服务器性 ...

  6. ArcGIS(ESRI)的发展历史和版本历史(简介)

    作者:fenghuayoushi 来源:CSDN 原文:https://blog.csdn.net/fenghuayoushi/article/details/6677360   ESRI公司介绍   ...

  7. Web开发技术发展历史

    Web开发技术发展历史   来自:天码营 原文:http://www.tianmaying.com/tutorial/web-history Web的诞生 提到Web,不得不提一个词就是"互 ...

  8. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  9. .net版本发展历史

    最近装上了VS2013,发现好多新特性.新功能,公司办公还在使用VS2005.VS2008,不过用着也很顺手,在最新版Visual Studio中,微软加入了git源码管理工具,和之前的TFS大体上类 ...

随机推荐

  1. 【网易官方】极客战记(codecombat)攻略-森林-盐碱地salted-earth

    保卫森林定居点开始. 简介 这个关卡引入了布尔 “or” 的概念. 在两个布尔值之间放置一个 or 将返回一个布尔值,就像 + 需要 2 个数字并且吐出另一个数字一样. 如果前或后的值为 true,则 ...

  2. 题解 P4171 【[JSOI2010]满汉全席】

    什么,tarjan?那是什么? 码量太大,我选择放弃 为什么不用dfs写2-sat呢?他会伤心的说 这题2-sat的过程大佬们已经讲得非常清楚了,我就略微提一下,主要讲dfs的原理 2_sat原理 我 ...

  3. deque & list

    deque 双向队列 它也是采用动态数组的方式来管理的提供了随机数组 和vector的区别 1.deque头尾两端可以开放,能够进行快速的插入和删除(vector只能在尾部进行快速的插入和删除) 2. ...

  4. ZJNU 1213 - 取水——高级

    某个村庄i可以打一口井取水花费费用Wi,也可以与有水的村庄连接取水 又因为不可能没有一个村庄不打井(即至少有一个村庄打井,其余村庄连向它) 实际上就可以理解为,将水井看作第N+1个村庄,需要有村庄与这 ...

  5. python字典常用方法

    字典(Dictionary) 字典是一个无序.可变和有索引的集合.在 Python 中,字典用花括号编写,拥有键和值. 实例 创建并打印字典: thisdict = { "brand&quo ...

  6. UI Automation技术获取cmd或Powershell命令提示符窗口的实时内容

    事先打开的Powershell或cmd窗口中的文本,用其他方式难以拿到.但是用UI Automation可以轻松获取.本工具在窗体上加入了一个Timer控件,每秒钟都查找桌面上是否有Powershel ...

  7. 远程调用shell脚本文件和远程复制文件

    1.安装sshpass yum install sshpass 2.本地调用远程服务器的shell脚本文件: sshpass -p sa ssh root@192.168.56.105 -C &quo ...

  8. mysql group_concat和find_in_set的使用

    原先sql获取角色对应的权限信息: select a.*, group_concat(b.auth_name) as auth_name from sh_role a left join sh_aut ...

  9. 时间API

    1. 时间API 我们的时间在java里是long类型的整数,这个整数称之为时间戳(也叫格林威治时间),即从1970-01-01到现在为止所经过的毫秒数,单有这个时间戳是不能准确表达世界各地的时间,还 ...

  10. Matlab高级教程_第一篇:Matlab基础知识提炼_01

    第一篇:Matlab基础知识提炼: 这一篇主要用系统和提炼性的语言对Matlab基础知识进行总结,主要适用于有语言基础的学习者.尽量不讲废话. 第一部分:Matlab是什么? 1 Matlab是Mat ...