原创

[入门]容器

在上个世纪50年代前,当时物流远没有现代这么普及,集装箱在当时并不被认可,几乎所有货物都是通过零散方式运输。

以“勇士号”为例,在一次从布鲁克林到不来梅的运输中,货物装卸都是由普通的码头工人来完成的,它装载了5015英吨的货物,主要是食品、日用品、邮件、机器和车辆的零部件以及53辆车。这批货物的数量达到了惊人的194582件,而且大小和种类各不相同。

所有的货物都是码头工人一件一件放到货盘上,再把货盘降到船舱中一件一件搬下来堆好。他们装完这艘船总共用了6天时间;横跨大西洋的航行用了10天半的时间;在不来梅港,码头工人是昼夜不停地干活儿,他们卸船用了4天时间,这次航行有一半时间都花在码头上了。

为什么非要装载、卸载、转移和再装载那么多的散件货物?为什么不把货物装进大箱子里,然后就只装卸和搬运这些箱子?

集装箱便由此诞生了。

运输业大量采用集装箱后,由咖啡制造商发出的一只35吨的集装箱,可以在马来西亚离开工厂,装上一艘货轮,经过16天的航行到达9000营里之外的洛杉矶。一天之后,这个集装箱被一列火车运到芝加哥,并被随机转移到了一辆开往辛辛那提的卡车上。

从离开马来西亚的工厂到抵达俄亥俄州的仓库,这次11000营里的行程可能只需要花费22天的时间,其速度是每天500英里,而费用比一张单程的头等舱机票还低。另外,在这一路上,很可能没有人碰过集装箱里的东西,甚至根本没有人打开过它。同传统的货轮相比,集装箱船的装卸只需要大约1/6的时间和1/3的劳动力。

今天我们要讲的“容器技术”的思想正是来源于此。

在一艘大船上,各种类型的货物,小到奶粉、化妆品,大到机器设备、跑车,都可以被装箱到一个标准的集装箱内。托运货物的人只需要保证货物在集装箱内的密封和固定,而无需关心集装箱如何被摆放和运输。

负责运输的人则无需关心一个个集装箱内装的不同货物,只需把集装箱当做一个封闭、无差别的独立个体,进行装载、卸货、堆放、运输,整个过程中集装箱保持封闭状态直到被运送到目的地。从轮船到火车,再到卡车运输,都可以利用起重机(吊车)对集装箱进行操作,实现流程的自动化,从而以非常廉价的方式,有效解决了不同类型货物在长距离运输中的问题。那么我们如何将这种工作方式用在开发以及运维工作上呢?

解决方案-虚拟化

在很久以前,在线上服务器部署一个应用,首先需要购买一个物理服务器,在服务器安装操作系统,然后安装好应用所需要的各种依赖环境,可以进行应用的部署,而且一台服务器只能部署一个应用。

●部署应用非常慢

●需要花费的成本非常高

●而且容易造成资源的浪费,因为往往一个应用使用不了一个服务器的资源

●难于迁移和扩展

●迁移问题:要把应用进行迁移,又得重复部署应用的过程

●扩展问题:只能购买新的硬件来升级物理服务器,或者购买更高性能的服务器。

●可能会被限定硬件厂商,因为那时候有不同硬件平台

虚拟化技术出现后,虚拟化技术会在本地操作系统之上加多一层 Hypervisor层。Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可以虚拟化硬件资源,例如cpu、硬盘、内存资源等。用户可以基于通过虚拟化出来的资源之上安装操作系统,这也就是所谓的虚拟机。

通过Hypervisor层,我们可以创建不同的虚拟机,并且可以限定每个虚拟机的物理资源,并且每个虚拟机都是分离、独立的。例如A虚拟机给它使用2个cpu、8g内存、100g磁盘,B虚拟机给它使用4个cpu、16g内存、300g磁盘等。这样就可以实现物理资源利用率的最大化。如此一来,每台物理机就可以部署多个应用,每个应用都可以独立运行在一个虚拟机里。

虚拟化技术的优点:

●资源池——一个物理机的资源分配到了不同的虚拟机里

●很容易扩展——增加物理机或者虚拟机即可,因为虚拟机是可以复制的

●很容易云化——亚马孙AWS,阿里云,谷歌云等

然而,随着时间推移,用户发现hypervisor这种方式麻烦越来越多。

对于hypervisor环境来说,每个虚拟机都需要运行一个完整的操作系统以及其中安装好的大量应用程序。但实际生产开发环境里,我们更关注的是自己部署的应用程序,如果每次部署发布我都得搞一个完整操作系统和附带的依赖环境,那么这让任务和性能变得很重和很低下。

那么如何让用户更加的关注应用程序本身,底层多余的操作系统和环境可以共享和复用?用户可以不用再安装一套操作系统和依赖环境。这就像集装箱运载一样,把货物一辆兰博基尼跑车(好比开发好的应用APP),打包放到一容器集装箱里,它通过货轮可以轻而易举的从上海码头(CentOS7.2环境)运送到纽约码头(Ubuntu14.04环境)。而且运输期间,我的兰博基尼(APP)没有受到任何的损坏(文件没有丢失),在另外一个码头卸货后,依然可以完美风骚的赛跑(启动正常)。

Linux Container容器技术的诞生(2008年)就解决了IT世界里“集装箱运输”的问题。Linux Container(简称LXC)它是一种内核轻量级的操作系统层虚拟化技术。

容器的特点其实我们拿跟它跟硬件抽象层虚拟化hypervisor技术对比就清楚了,我们之前也提到过,传统的虚拟化(虚拟机)技术,创建环境和部署应用都很麻烦,而且应用的移植性也很繁琐,比如你要把vmware里的虚拟机迁移到KVM里就很繁琐(需要做镜像格式的转换)。那么有了容器技术就简单了,总结下容器技术主要有三个特点:

1. 极其轻量:只打包了必要的Bin/Lib;

2. 秒级部署:根据镜像的不同,容器的部署大概在毫秒与秒之间(比虚拟机强很多);

3. 易于移植:一次构建,随处部署;

4. 弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力。

容器技术的诞生其实主要解决了PAAS的层的技术实现。像OpenStack、Cloudstack这样的技术是解决IAAS层的问题。IAAS层和PAAS层之前我有写过,关于他们的区别和特性我这里不在描述。

那么容器技术主要应用在哪些场景呢?目前主流的有以下几种:

1. 容器化传统应用 容器不仅能提高现有应用的安全性和可移植性,还能节约成本。

每个企业的环境中都有一套较旧的应用来服务于客户或自动执行业务流程。即使是大规模的单体应用,通过容器隔离的增强安全性、以及可移植性特点,也能从 Docker 中获益,从而降低成本。一旦容器化之后,这些应用可以扩展额外的服务或者转变到微服务架构之上。

2. 持续集成和持续部署 (CI/CD) 通过 Docker 加速应用管道自动化和应用部署,交付速度提高至少 13 倍。

现代化开发流程快速、持续且具备自动执行能力,最终目标是开发出更加可靠的软件。通过持续集成(CI) 和持续部署 (CD),每次开发人员签入代码并顺利测试之后,IT 团队都能够集成新代码。作为开发运维方法的基础,CI/CD 创造了一种实时反馈回路机制,持续地传输小型迭代更改,从而加速更改,提高质量。CI 环境通常是完全自动化的,通过 git 推送命令触发测试,测试成功时自动构建新镜像,然后推送到 Docker 镜像库。通过后续的自动化和脚本,可以将新镜像的容器部署到预演环境,从而进行进一步测试。

3. 微服务加速应用架构现代化进程。

应用架构正在从采用瀑布模型开发法的单体代码库转变为独立开发和部署的松耦合服务。成千上万个这样的服务相互连接就形成了应用。Docker 允许开发人员选择最适合于每种服务的工具或技术栈,隔离服务以消除任何潜在的冲突,从而避免“地狱式的矩阵依赖”。这些容器可以独立于应用的其他服务组件,轻松地共享、部署、更新和瞬间扩展。Docker 的端到端安全功能让团队能够构建和运行最低权限的微服务模型,服务所需的资源(其他应用、涉密信息、计算资源等)会适时被创建并被访问。

4. IT 基础设施优化,充分利用基础设施,节省资金。

Docker 和容器有助于优化IT 基础设施的利用率和成本。优化不仅仅是指削减成本,还能确保在适当的时间有效地使用适当的资源。容器是一种轻量级的打包和隔离应用工作负载的方法,所以 Docker 允许在同一物理或虚拟服务器上毫不冲突地运行多项工作负载。企业可以整合数据中心,将并购而来的IT资源进行整合,从而获得向云端的可迁移性,同时减少操作系统和服务器的维护工作。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 集装箱数据中心:让你的数据中心动起来

    早在2005年开始,Google数据中心就采用标准的集装箱式设计,当时Google用45个集装箱搭建了一个奇怪的设施。每个集装箱可容纳1160台服务器,具有25...

    木禾wen
  • [入门]一道东北菜讲述什么是IaaS、PaaS和SaaS

    每次和从事信息化或IT专业人士聊天,总会从他们的嘴里蹦出如:云计算、大数据、雾计算、IaaS、PaaS和SaaS等相关名词。而你呢,只能“嗯嗯嗯、对、听说过,要...

    木禾wen
  • 什么是软件定义网络(SDN介绍)

    SDN字面意思是软件定义网络,其试图摆脱硬件对网络架构的限制,这样便可以像升级、安装软件一样对网络进行修改,便于更多的APP(应用程序)能够快速部署到网络上。

    木禾wen
  • Linux命令:ps

    Linux为代表的系统是Case sensitive大小写敏感, 这点需要尤为关注, 不同与 windows是Non Case sensitive大小写不敏感.

    louiezhou001
  • 数据分析之路—检验温差是否满足正态分布

    该方法是由 scipy.stats.kstest 改进而来的,可以做正态分布、指数分布、Logistic 分布、Gumbel 分布等多种分布检验。默认参数为 n...

    23号杂货铺
  • Docker 入门

    程序员同行者
  • Chris Richardson微服务翻译:微服务部署

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 ...

    butterfly100
  • 2761: [JLOI2011]不重复数字(哈希表)

    2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1770  So...

    HansBug
  • 欢迎体验 Android 10!

    经过一年多的开发和长达数月的早期使用者测试,Android 10 终于准备好和您见面了!

    Android 开发者
  • django源码分析 python ma

    如何分析django源码,笔者选择从django项目的启动方式开始 python manage.py runserver,本文主要分析了django项目的启动流...

    用户2398817

扫码关注云+社区

领取腾讯云代金券