在计算资源的领域,近年来的发展变化也很快。
从刚开始的单一服务器运作,发展到了后来基于XEN,KVM,VMware和Hyper-V为核心技术的虚拟化(包含了AWS的EC2实例),再到后来以Docker为代表的微服务技术,以及之后Lambda的这种无服务技术。
容器在这个发展进程中起到了很关键的作用,并且容器在DevOps的执行过程中非常重要,下面让我们先来了解一下什么是Docker吧!
什么是Docker
下面是Docker容器的Logo,大家可以从这个logo也能道出容器的大致概念了。
其实Docker的概念来自于集装箱,集装箱解决的问题就是把所有不规整的货物都用标准化大小的箱子存放起来,这样子不同尺寸不同大小的货物都能装到这些集装箱里面,方便封装和运输。集装箱与集装箱之间不会互相影响,我们可以用统一标准的集装箱来运送海鲜产品,运送木柴,运送钢铁……等等。
Docker就是这个集装箱,而运输集装箱的这个鲸鱼或者大货轮就是操作系统(Operating System),集装箱里面装有我们各种“奇形怪状”的需要交付的应用程序。它们可能是一款电商的网站,或者是一个交友类收集app。
那么Docker有什么特点呢?为什么这么多企业热衷于使用Docker?
- Docker可以缩短开发、测试或部署应用程序的时间;你可以在几秒内创建一个新的应用,或者在几秒内重启一个实例。
- Docker内可以建立标准化的容器(Container),其中容器包含了
- 应用程序代码
- 配置
- 环境依赖关系
- Docker很可靠,你不需要担心你的测试代码在部署到生产环境的时候出问题,不需要害怕因为Mysql,php的版本问题导致代码无法运行。因为Docker使用集装箱(容器),你的集装箱无论放到哪一条货轮上都可以很稳妥得放置并运输。
虚拟化和容器的区别
既然虚拟化已经在市面上流行了这么多年了,为什么容器现在更加流行了呢?
究其原因,让我们先来看看它们之间的一些区别吧。
如下图所示,使用传统的虚拟化技术,我们需要
- 底层的基础架构(服务器,云主机,个人电脑等)
- 宿主机操作系统(也可没有此层)
- 虚拟机管理系统(Hypervisor),例如Xen,Hyper-V,KVM等,或者VirtualBox和VMWare Workstation
- Hypervisor上可以安装我们的客户机操作系统
- 客户机操作系统之上会有我们不同的依赖环境和应用程序
总体来说,这样的架构很臃肿,导致每一层都有资源的开销。最终导致我们在一台物理机上能开启的虚拟机的数量有限。
相比来说,Docker就显得更加轻量化了。它的架构是:
- 底层的基础架构(服务器,云主机,个人电脑等)
- 操作系统,可以是所有主流的Linux发行版本
- Docker引擎(守护进程),负责管理Docker容器
- 各种依赖和应用程序
Docker引擎是可以和主操作系统直接进行通信的,因此相对于虚拟机启动的数分钟,Docker的启动可以在数毫秒内完成。
再举个通俗一点的例子,在上面的篇幅有介绍到Docker类似码头的集装箱,每一个集装箱都是标准化的,里面装了各种各样的货物。而虚拟化对比来说,就是码头上的不同仓库,仓库里面堆放了各种货物,同时还有电力系统,水力系统,工作区间等等标准的一套装置。
因此,运维和管理一个仓库会花费很多人力和物力,它们相当于是完全独立运作的实体;而Docker则是一个一个独立的集装箱,只能装上货轮才能发挥工作。但它们没有太多的人力和物力开销。
Docker的优点:
- 终于可以摆脱程序依赖带来的噩梦了,每个程序和依赖环境都在一个容器中,都能打包迁移
- 开发>测试>QA>生产环境的流程更加顺畅
- 应用程序的隔离,每个容器中的问题不会影响另一个容器
- 更好的代码迁移可能性
- 微服务,可以将原本一个应用程序细分成多个微型的服务,每个服务运行在一个Docker容器中
容器的组件
- Docker 镜像(Image):指将应用打包好后的存储方式,类似操作系统的IOS或IMG文件
- Docker 容器(Container):一个个正在运行的镜像
- DockerFile:构建一个镜像的描述文件
- Layers/Union File System:在Docker File中每一步都会产生一层Layer,当我们修改一个镜像的时候,就构建了一个新的层
- Docker Daemon/Engine:是Docker的守护进程,Docker Client通过命令行与Docker Damon通信,完成Docker相关操作
- Docker Registries/Docker Hub:托管Docker镜像的地方,当我们构建完一个镜像之后,我们可以将镜像推送到像Docker Hub这样的公共仓库或者自己的私有仓库中
- 容器调度平台:典型产品是Mesos和Kubernetes (K8S),为容器化应用提供了资源调试、部署、服务发现、扩展机制等功能
介绍了这么多关于容器的概念,可能大家已经晕菜了。没关系,作为解决方案架构师来说,不需要对Docker和容器有十分深入的了解,我们只需要知道它的用途,并且和AWS ECS (Elastic Container Service)的关系就可以了。