微服务之Docker
Docker的出现
2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。这家公司主要提供基于PaaS的云端计算技术服务。就是和LXC(Linux container)有关的容器技术。后来改名为——Docker

一款产品从开发到上线,从操作系统,到执行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的相容,对运维人员都是考验
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
Docker是开发人员和系统管理员 使用容器开发,部署和执行应用程序的平台。使用Linux容器部署应用程序称为容器化。容器不是新的,但它们用于轻松部署应用程序。
容器化越来越受欢迎,因为容器是:
灵活:即使是最复杂的应用也可以集装箱化。轻量级:容器利用并共享主机核心。可互换:您可以即时部署更新和升级。行动式:您可以在本地构建,部署到云,并在任何地方执行。可扩充套件:您可以增加并自动分发容器副本。可堆叠:您可以垂直和即时堆叠服务。 Docker的理念
Docker是基于Go语言实现的云开源专案。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用元件的封装、分发、部署、执行等生命周期的管理,使使用者的APP(可以是一个WEB应用或数据库应用等等)及其执行环境能够做到“一次封装,到处执行”。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用执行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
虚拟机器时代
虚拟机器(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面执行另一种操作系统,比如在Windows 系统里面执行Linux 系统。应用程序对此毫无感知,因为虚拟机器看上去跟真实系统一模一样,而对于底层系统来说,虚拟机器就是一个普通档案,不需要了就删掉,对其他部分毫无影响。这类虚拟机器完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
虚拟机器的缺点:
①.资源占用多 ②.冗余步骤多 ③.启动慢
容器新时代
由于前面虚拟机器存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对程序进行隔离。有了容器,就可以将软件执行所需的所有资源打包到一个隔离的容器中。容器与虚拟机器不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设定。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地执行。
比较了 Docker 和传统虚拟化方式的不同之处:
*传统虚拟机器技术是虚拟出一套硬件后,在其上执行一个完整操作系统,在该系统上再执行所需应用程序;
*而容器内的应用程序直接运行于宿主的核心,容器内没有自己的核心,而且也没有进行硬件虚拟。因此容器要比传统虚拟机器更为轻便。
*每个容器之间互相隔离,每个容器有自己的档案系统 ,容器之间程序不会相互影响,能区分计算资源。

相比之下,虚拟机器(VM)执行一个完整的“客户”操作系统,通过虚拟机器管理程式对主机资源进行虚拟访问。通常,VM提供的环境比大多数应用程序需要的资源更多。
对比传统虚拟机器总结

开发/运维一体化(DevOps)
更快速的应用交付和部署传统的应用开发完成后,需要提供一堆安装程式和配置说明文件,安装部署后需根据配置文件进行繁杂的配置才能正常执行。Docker化之后只需要交付少量容器映象档案,在正式生产环境载入映象并执行即可,应用安装配置在映象里已经内建好,大大节省部署配置和测试验证时间。
更轻松的迁移和扩充套件随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过映象执行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
更简单的系统运维应用容器化执行后,生产环境执行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程式异常时,也可以通过测试环境的相同容器进行快速定位和修复。
更高效的计算资源利用 Docker是核心级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支援,所以在一台物理机上可以执行很多个容器例项,可大大提升物理服务器的CPU和内存的利用率
