什么是docker,经常看到长篇大论的描述和形容docker来让人理解它的功能和作用,其实官网首页第一句话就很清晰的描述了它的作用:

Docker provides a way to run applications securely isolated in a container, packaged with all its dependencies and libraries.

翻译过来就是:Docker提供了一种在容器中运行安全隔离的应用程序的方法,它与所有依赖项和库打包在一起。我们来提炼其中重要的2点:

  • 应用程序安全运行在隔离的容器中:你的应用程序会运行在一个安全的、被隔离的沙箱环境中,不容易受到宿主机等外界因素的干扰和影响。
  • 依赖项和库均被打包在容器中:你的应用程序所需的依赖,均被打包到容器中,因为容器镜像便携特性,可以被运行到任意支持docker容器的系统和平台上,且能保证你的应用程序如你所期望一样正常的运行。

传统部署和容器化的区别

应用普通部署和容器部署对比

传统方式 部署应用程序的方式,一般是使用操作系统自带的包管理器在主机上安装应用依赖,之后再安装应用程序。这无疑将应用程序的可执行文件、应用的配置、应用依赖库和应用的生命周期与宿主机操作系统进行了紧耦合。在此情境下,可以通过构建不可改变的虚拟机镜像版本,通过镜像版本实现可预测的发布和回滚,但是虚拟机实在是太重量级了,且镜像体积太庞大,便捷性差。

容器方式 是基于操作系统级虚拟化而不是硬件级虚拟化方法来部署容器。容器之间彼此隔离并与主机隔离:它们具有自己的文件系统,不能看到彼此的进程,并且它们所使用的计算资源是可以被限制的。它们比虚拟机更容易构建,并且因为它们与底层基础架构和主机文件系统隔离,所以它们可以跨云和操作系统快速分发。

由于容器体积小且启动快,因此可以在每个容器镜像中打包一个应用程序。这种一对一的应用镜像关系拥有很多好处。使用容器,不需要与外部的基础架构环境绑定, 因为每一个应用程序都不需要外部依赖,更不需要与外部的基础架构环境依赖。完美解决了从开发到生产环境的一致性问题。

容器同样比虚拟机更加透明,这有助于监测和管理。尤其是容器进程的生命周期由基础设施管理,而不是由容器内的进程对外隐藏时更是如此。最后,每个应用程序用容器封装,管理容器部署就等同于管理应用程序部署。

容器主要优点总结如下:

  • 敏捷的应用程序创建和部署: 与虚拟机镜像相比,容器镜像更容易创建,提升了硬件的使用效率。
  • 持续开发、集成和部署: 提供可靠与频繁的容器镜像构建和部署,可以很方便及快速的回滚 (由于镜像不可变性).
  • 关注开发与运维的分离: 在构建/发布时创建应用程序容器镜像,从而将应用程序与基础架构分离。
  • 开发、测试和生产环境的一致性: 在笔记本电脑上运行与云中一样。
  • 云和操作系统的可移植性: 可运行在 Ubuntu, RHEL, CoreOS, 内部部署, Google 容器引擎和其他任何地方。
  • 以应用为中心的管理: 提升了操作系统的抽象级别,以便在使用逻辑资源的操作系统上运行应用程序。
  • 松耦合、分布式、弹性伸缩 微服务: 应用程序被分成更小,更独立的部分,可以动态部署和管理 - 而不是巨型单体应用运行在专用的大型机上。
  • 资源隔离: 通过对应用进行资源隔离,可以很容易的预测应用程序性能。
  • 资源利用: 高效率和高密度

Docker是容器中的一种,也是现今使用最广泛的开源容器技术。由于docker轻量的特性,性能开销极低,而应用的docker化大大的提高了部署效率和服务的稳定性,并节省了资源开支,所以现在越来越多的服务在慢慢向docker微服务化迁移。