前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从“集装箱运输”了解容器技术

从“集装箱运输”了解容器技术

作者头像
达观数据
发布2018-07-31 10:20:34
1.4K0
发布2018-07-31 10:20:34
举报
文章被收录于专栏:达观数据

容器技术的火爆和日益普及已经成为不争的事实,众多公有云平台纷纷支持Docker,AWS、Google、Azure、阿里云以及国内的各大公有云厂商都推出了容器云业务,国内也有不少创业公司通过构建容器Paas平台帮助企业实现微服务架构改造。

达观数据作为领先的人工智能企业,在容器技术领域也积累了比较多的实践经验。达观提供的文本挖掘、智能推荐、垂直搜索,无论是公有云服务,或者私有化部署,主要是基于容器云实现,从而保证部署的高效率、服务的稳定性、快速可扩展性和应用的隔离性,为我们的客户提供了持续升级的长久稳定服务。

为什么使用容器?

发布一个应用的经典过程一般是这样:首先要在测试服务器上进行开发,配置环境依赖并测通;再到生产环境中,为一台台服务器配置环境依赖并部署应用。即使现在已经进入云计算时代,整个发布过程依然没有太大变化。当我们有大量架构迥异的应用服务,需要发布到多种环境,如本地环境、虚拟机环境、公有云环境等等,底层使用的又是各种不同类型的硬件,稍有不慎就会导致发布失败。

图 1 异构应用部署到多样硬件的问题

从下面的矩阵图可以更直观的感受到我们面对的困难之大,矩阵的列代表不同的硬件环境,行代表各种应用/服务。矩阵列出了一个应用的发布或者重构所要考虑的复杂情况,不管是应用的开发人员,还是系统运维人员,都必须从一开始就要考虑复杂环境带来的问题,以保证发布和升级的顺利。

图 2 异构应用和多样硬件矩阵

解决这个问题的思路非常有意思。Docker公司给出了非常形象的比喻:集装箱运输。1960年之前的全球化运输过程如下图所示,不同的货物和不同的运输方式也构成了一个庞大的矩阵。托运货物的人,和搬运工会担心不同类型的货物放在一起会造成相互碰撞、挤压导致损坏。

然而将不同货物分类进行运输是一种非常高成本、低效率的解决方式,货物在运输途中可能需要在某个港口卸货,与来自其他地方的同类型货物一起装车,再运到下一个目的地。整个运输过程导致大量的货物被损坏,或者被盗。

图 3 1960年以前的货物运输

全球化运输现在已经不是问题,各个港口整齐堆放的集装箱就是完美的解决方案。各种类型的货物,小到奶粉、化妆品,大到特斯拉跑车,都可以被装箱到一个标准的集装箱内。托运货物的人只需要保证货物在集装箱内的密封和固定,而无需关心集装箱如何被摆放和运输。

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

图 4 标准化集装箱解决运输问题

将Docker比喻为代码方面的集装箱综合运输系统,确实非常形象而恰当。Docker将任何类型的应用(货物)和它的依赖打包成为一个标准的,轻量级的,便携的,独立的集装箱,让各类应用都支持一套标准的运作模式,只要安装了Docker程序的服务器都可以运行。

开发者在笔记本上开发和测试完成的Docker容器,可以无差别的运行在测试环境、生产环境,无论服务器是物理机、虚拟机、公有云服务器上,或者是以上各种类型服务器的组合。应用开发过程只需执行一次,即可保证应用在任何环境上运行的一致性。对于运维人员,则只需要配置一次不同环境的服务器,即可运行任何Docker容器,不管容器是web服务还是api系统,规避了传统部署方式中开发、测试、生产和其他环境的不一致性问题。

图 5 标准化的Docker技术解决代码“运输”问题

Docker主要特性

Docker技术的有多重特点和优势,我们基于实践经验进行简单总结,其在实际应用中体现出的主要特性有以下三个方面:

1

环境标准化和持续部署

前面已经提到,传统的开发和部署的生命周期中,常常因为不同环境的细微差异导致应用运行失败,例如依赖的缺失或者版本不匹配。Docker的出现很好的解决了这一问题,保证了从开发、测试到部署的环境一致性。Docker将应用和所需的配置和依赖一起打包到镜像中,在不同环境中只要使用同一个镜像,即可保证应用的正常运行,无需其他人工干预,这也是Docker对开发和运维人员都有巨大吸引力的原因。

2

隔离性

Docker不同容器志坚是相互隔离的,每个容器使用自己的环境和资源。使用不同堆栈的应用程序基于Docker可以运行在同一个宿主机上,相互之间不会产生影响,也就不会产生使用源码部署常常会遇到的依赖相互冲突的问题。使用源码部署的另一个问题,是当从宿主机上删除应用的时候,删除依赖的时候就需要考虑是否有别的应用也在使用,经常导致误删依赖影响其他应用,或者忘记删除无用的依赖。基于Docker则不会有此类问题,当我们不再需要某个应用的时候,可以简单的通过删除容器,则应用的代码和依赖会作为一个整体一并删除,同时也不影响其他应用。

3

版本控制

Docker另一个重要功能,是提供了类似git仓库一样的镜像仓库Docker hub,支持开发人员将镜像的变更提交到Docker hub仓库,并通过版本号进行管理。发布变更的时候也只需要修改镜像版本号并重启容器,假设发布的变更引入了一个bug,也可以非常快速的回滚到前一个版本。相比虚拟机,Docker的启动和停止非常快速,如同运行一个进程一般,整个变更的过程往往只需几分钟时间。

容器和虚拟机的区别

传统的虚拟机通过硬件虚拟化创造一个虚拟的系统,每个虚拟机都有自己的内存、硬盘和操作系统,预分配的资源会被虚拟机完全占用。使用虚拟机来隔离应用会造成比较大的资源浪费,一个应用加上依赖只有几十到几百M的大小,而操作系统往往还需要消耗10G左右容量。

图 6 容器技术和虚拟机的对比

上图展示了容器技术和虚拟机的区别。容器包含了应用和所需的依赖,但不需要独占资源,没有一个虚拟系统,而是和宿主机共享硬件资源和操作系统,和其他容器共享内核,从而实现资源的动态分配。多个容器在同一个宿主机操作系统中的用户空间以独立的进程运行。因此,容器相比虚拟机要轻量许多,在一个主机上可以同时启动近百个容器,一个应用要在数量上横向扩展非常便捷,而虚拟机则几乎不可能启动同样多的数量。对于重启操作,容器近似于重启一个进程,而虚拟机则相当于重启操作系统。

微服务和容器集群管理

随着容器技术的日益成熟,微服务架构也有了越来越多的实践落地。传统集中式架构开发的大型应用,比如CRM、ERP等系统,在今天看来已经显得过于庞大复杂,缺乏灵活性,随着新需求的不断出现,对集中式架构的升级和调整变得日益困难,比如修改原有系统以适配移动设备。技术层面上,现在已经有大量的轻量级开源技术,包括容器技术,在互联网、云计算、人工智能领域被大量运用,催生了微服务架构的出现。下图展示了服务架构的演变。

图 7 软件系统架构演变

微服务架构是指一个较为复杂的应用由多个相对“微小”的服务组成,每个微服务只负责完成一个特定的任务,可以被独立部署,支持快速的横向扩展。各个微服务之间以松耦合的方式相互配合,不同的服务可以部署在不同的服务器上。每个微服务将相关的业务逻辑和数据放在一起,可以看作是整个应用的组件,可以被独立升级甚至替换。这样做的好处是保证各个微服务相互独立,从而实现快速交付和迭代升级。

Docker容器技术的特性使其天然地适用于微服务的落地实现,一个容器实现一个微服务,在服务器集群上运行各个微服务容器,来构建一套完整的应用。为了支持多租户,甚至可以部署多套完全相同的应用,每套应用服务一个或一部分租户,应用之间相互隔离,应用的资源也按照租户的使用量来分配。

容器编排技术

当容器和服务器的数量达到一定规模的时候,就会碰到管理的问题,即如何有效管理大量的服务器和容器,保证应用的稳定运行、方便升级和故障的快速解决。容器编排工具提供图形化界面或者命令行来管理容器和服务器集群,提供容器配置、任务发布、服务发现、负载均衡、系统监控和故障恢复、声明式系统配置以及有关容器部署和性能的规则和约束定义机制等。

从最新趋势来看,Google开发的Kubernetes从众多编排工具中脱颖而出,赢下了容器编排工具大战。基于达观自身的容器实践经验,Kubernetes是所有编排工具中稳定性最高的,尤其是在管理较大规模的容器集群时,这和业界同行的实践经验基本吻合。Kubernetes针对pods进行调度,pod是最小的基本单位。一个pod封装一个或多个容器、存储资源、一个独立的网络IP以及管理控制容器运行的策略。Pod封装的多个容器一定是紧耦合的,它们之间能共享资源。

相比Kubernetes,Docker原生编排工具Swarm在集群搭建和使用上要相对简单一些,学习和部署成本相对低一些。较新版本的Docker已经集成了Swarm。Swarm支持跨多个主机进行编排,管理较小规模的容器集群也绰绰有余,对于初学者也可以很快的部署和运行。

结语

容器技术为软件开发和系统运维带来了颠覆性的突破,在达观的客户中,不管是新晋的互联网企业,还是久居行业重心的传统企业,都纷纷拥抱容器技术,开启了系统架构的容器化升级和微服务转型。如此大规模的不分行业的普及,足以预示容器技术无可限量的发展前景,而随着容器技术的普及,系统开发和管理的效率必将上升到一个新的台阶,为企业带来效益的提升。

参考文献

  • https://github.com/DeanXu/Docker-introduce/blob/master/README.md
  • https://www.weave.works/blog/comparing-container-orchestration
  • http://docs.kubernetes.org.cn
  • https://docs.docker-cn.com/

关于作者

纪传俊,达观数据联合创始人,承担公司重大紧急项目的架构设计和研发管理工作。复旦大学计算机专业硕士,曾任职于盛大创新院推荐组负责起点中文网和酷六视频的相关推荐,后任职于盛大文学数据中心全面负责大数据挖掘任务调度系统,智能审核系统和反作弊系统。对大数据挖掘技术,机器学习算法,分布式集群搭建和任务调度有较深入的理解和实践经验。

相关阅读

  • 达观数据Docker 集群部署实例
  • 搜索那点事儿:Lucene文件存储和读取技术详解
  • 达观数据提升 Web服务端性能的技术经验
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 达观数据 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档