优势

  • 更高效的利用系统资源

    • 由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
  • 更快的启动时间

    • 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
  • 一致的运行环境

    • 开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这项目在我机器上没问题啊」 这类问题。
  • 持续交付和部署

    • 对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用 Dockerfile 定制应用镜像来实现持续集成、持续交付、部署。而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
  • 更轻松的维护和扩展

    • Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
  • 多云平台

    • Docker 最大的好处之一就是可移植性。在过去的几年里,所有主流的云计算提供商,包括亚马逊 AWS 和谷歌的 GCP,都将 Docke r融入到他们的平台并增加了各自的支持。Docker 容器能运行在亚马逊的 EC2 实例、谷歌的 GCP 实例、Rackspace 服务器或者 VirtualBox 这些提供主机操作系统的平台上。举例来说,如果运行在亚马逊 EC2 实例上的 Docker 容器能够很容易地移植到其他几个平台上,比如说 VirtualBox,并且达到类似的一致性和功能性,那这将允许你从基础设施层中抽象出来。除了 AWS 和 GCP,Docker 在其他不同的 IaaS 提供商也运行的非常好,例如微软的 Azure、OpenStack 和可以被具有不同配置的管理者所使用的 Chef、Puppet、Ansible 等。
  • 隔离性

    • Docke r能够确保每个容器都拥有自己的资源,并且和其他容器是隔离的。你可以用不同的容器来运行使用不同堆栈的应用程序。除此之外,如果你想在服务器上直接删除一些应用程序是比较困难的,因为这样可能引发依赖关系冲突。而 Docker 可以帮你确保应用程序被完全清除,因为不同的应用程序运行在不同的容器上,如果你不在需要一款应用程序,那你可以简单地通过删除容器来删除这个应用程序,并且在你的宿主机操作系统上不会留下任何的临时文件或者配置文件。

    • Docker 还能确保每个应用程序只使用分配给它的资源(包括 CPU、内存和磁盘空间)。一个特殊的软件将不会使用你全部的可用资源,要不然这将导致性能降低,甚至让其他应用程序完全停止工作。

  • 安全性

    • 从安全角度来看,Docker 确保运行在容器中的应用程序和其他容器中的应用程序是完全分隔与隔离的,在通信流量和管理上赋予你完全的控制权。Docker 容器不能窥视运行在其他容器中的进程。从体系结构角度来看,每个容器只使用着自己的资源(从进程到网络堆栈)。

    • 作为紧固安全的一种手段,Docker 将宿主机操作系统上的敏感挂载点(例如/proc和/sys)作为只读挂载点,并且使用一种写时复制系统来确保容器不能读取其他容器的数据。Docker 也限制了宿主机操作系统上的一些系统调用,并且和 SELinux 与 AppArmor 一起运行的很好。此外,在 Docker Hub 上可以使用的 Docker 镜像都通过数字签名来确保其可靠性。

缺点

  • 隔离性

    • 基于 hypervisor 的虚拟技术,在隔离性上比容器技术要好,它们的系统硬件资源完全上虚拟化的,当一台虚拟机出现系统级别的问题,往往不会蔓延到同一宿主机上的其它虚拟机上,但是容器就不一样了,容器之间共享同一个操作系统内核及其它组件,所以在受到诸如黑客攻击这种情况的时候,很容易通过底层操作系统影响的其它容器,甚至逐个击破,产生连锁反应,当然,这个问题可以通过部署容器来解决,但随之又会产生新的问题,比如成本增加以及性能问题。
  • 性能

    • 不管是虚拟机还是容器,都是运用不同的技术对应用本身进行了一定程度的封装与隔离,在降低应用和应用之间以及应用和环境之间的耦合性上做了很多努力,但是随之而来的,就会产生更过的网络连接转发和数据交互,这在低并发系统上虽然不会很明显,但是当同一虚拟机或者服务器下面的容器需要更高并发量支撑的时候,也就是并发问题成为系统瓶颈的时候,容器会将这个问题放大,所以,并不是所有的场景都适合容器技术。
  • 存储方案

    • 容器的诞生并不是为 OS 抽象服务的,这是它和虚拟机最大的区别,这样的基因意味着容器天生是为应用环境做更多的努力,容器的伸缩也是基于容器的这一特性,而与之相对的,需要持久化存储方案恰恰相反,在数据存储这一点上 Docker 容器提供的解决方案是利用 volume 接口(存储卷)形成数据的映射和转移,以实现数据持久化的目的。但是这样同样也会造成一部分资源的浪费和更多的交互,不管是映射到宿主机上还是网络磁盘,都是退而求其次的解决方案。