Docker是一个开源的引擎,能够轻松的为任何应用建立一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试经过的容器能够批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其余的基础应用平台。 git
简单得来讲,Docker是一个由GO语言写的程序运行的“容器”(Linux containers, LXCs); 目前云服务的基石是操做系统级别的隔离,在同一台物理服务器上虚拟出多个主机。Docker则实现了一种应用程序级别的隔离; 它改变咱们基本的开发、操做单元,由直接操做虚拟主机(VM),转换到操做程序运行的“容器”上来。web
Docker是为开发者和系统管理员设计的,用来发布和运行分布式应用程序的一个开放性平台。由两部分组成:docker
Docker 扩展了 Linux 容器(Linux Containers),或着说 LXC,经过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境。Docker 利用了 LXC, cgroups 和 Linux 本身的内核。和传统的虚拟机不一样的是,一个 Docker 容器并不包含一个单独的操做系统,而是基于已有的基础设施中操做系统提供的功能来运行的。这里有一个 Stackoverflow 的答案,里面很是详细清晰地描述了全部 Docker 不一样于纯粹的 LXC 的功能特性数据库
Docker 会像一个可移植的容器引擎那样工做。它把应用程序及全部程序的依赖环境打包到一个虚拟容器中,这个虚拟容器能够运行在任何一种 Linux 服务器上。这大大地提升了程序运行的灵活性和可移植性,不管需不须要许可、是在公共云仍是私密云、是否是裸机环境等等。npm
Docker 由下面这些组成:
1. Docker 服务器守护程序(server daemon),用于管理全部的容器。
2. Docker 命令行客户端,用于控制服务器守护程序。
3. Docker 镜像:查找和浏览 docker 容器镜像。它也访问这里获得:https://index.docker.io/服务器
Docker相对于VM虚拟机的优点十分明显,那就是轻量和高性能和便捷性, 如下部分摘自: KVM and Docker LXC Benchmarking with OpenStack框架
優勢:分布式
快性能
运行时的性能能够获取极大提高(经典的案例是提高97%)测试
管理操做(启动,中止,开始,重启等等) 都是以秒或毫秒为单位的。
敏捷
像虚拟机同样敏捷,并且会更便宜,在bare metal(裸机)上布署像点个按钮同样简单。
灵活
将应用和系统“容器化”,不添加额外的操做系统,
轻量
你会拥有足够的“操做系统”,仅需添加或减少镜像便可。在一台服务器上能够布署100~1000个Containers容器。
便宜
开源的,免费的,低成本的。由现代Linux内核支持并驱动。注* 轻量的Container一定能够在一个物理机上开启更多“容器”,注定比VMs要便宜。
生态系统
正在愈来愈受欢迎,只须要看一看Google的趋势就知道了, docker or LXC.
还有不可胜数的社区和第三方应用。
云支持
不可胜数的云服务提供建立和管理Linux容器框架。
有关Docker性能方面的优点,还可参考此IBM工程师对性能提高的评测,从各个方面比VMs(OS系统级别虚拟化)都有很是大的提高。
Performance Characteristics of VMs vs Docker Containers by Boden Russel (IBM)
Performance characteristics of traditional v ms vs docker containers
有争论的部分
任何项目都会有争论,就像Go,像NodeJS, 一样Docker也有一些。
可否完全隔离
在超复杂的业务系统中,单OS到底能不能实现完全隔离,一个程序的崩溃/内存溢出/高CPU占用到底会不会影响到其余容器或者整个系统?不少人对Docker可否在实际的多主机的生产环境中支持关键任务系统还有所怀疑。 注* 就像有人质疑Node.JS单线程快而不稳,没法在复杂场景中应用同样。
不过可喜的是,目前Linux内核已经针对Container作了不少改进,以支持更好的隔离。
GO语言尚未彻底成熟
Docker由Go语言开发,但GO语言对大多数开发者来讲比较陌生,并且还在不断改进,距离成熟还有一段时间。此半git、半包管理的方式让一些人产生不适。