1. Docker是什么?
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
- 菜鸟教程的解释:
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
- 《Docker开发实践》:
《Docker开发实践》中讲了个故事:20世纪60年代以前的海运,货物都放置在一起,很容易挤压受损。同时,不同的运输方式之间的转运也很麻烦,例如从码头和火车汽车转运卸货时。不同货物和不同交通工具之间的组合是一个巨大的二维矩阵。海运界最后达成了一致,制定了国际标准集装箱来解决这个棘手的问题。所有货物都打包进集装箱互相隔离,所有交通工具都通过集装箱转运,极大地提供了运输的安全性和效率。
在软件开发中我们也经常碰到同样的问题,使用了各种各样技术框架的应用程序,从前端静态网站到后端数据库,从PHP到Java,以及多种多样的部署环境,从测试服务器到线上环境,从虚拟机到公有云等等。Docker,正是这个集装箱,而Docker的logo也的确是个集装箱。
2. Docker与容器和虚拟机
很自然地我们会问,Docker跟虚拟机有什么区别啊?这个问题可以拆成两部分。因为Docker并不是什么完全独创的技术,而是属于很早便有了的容器技术,所以第一个问题就是容器与虚拟机的区别?同属于容器技术,Docker的兄弟姐妹还有Solaris Zones、BSD jails、LXC等。但Docker现在这么火,自然有它的独到之处,所以第二个问题就是Docker与其他容器的区别?
关于第一个问题比较简单,容器是一种轻量级的虚拟技术。它不像虚拟机那样具有一套完整的CPU、内存和磁盘,对操作系统有绝对的权限。容器和宿主主机共享内核,所有容器共享操作系统,在一台物理机上可以运行成百上千的容器。第二个问题稍麻烦一些,与LXC相比,Docker对配置进行了抽象,使应用在任何平台上的运行环境都一致。同时提供了版本控制、镜像托管等类似Git的现代化设施和生态圈。
总体来看,Docker的应用场景有:
- 加速本地开发:快速搭建好开发环境和运行环境。
- 自动打包和部署应用。(web应用的自动化打包和发布)
- 创建轻量级的私有PaaS环境。
- 自动化测试和持续集成、发布。
- 创建安全沙盒。
3.docker的实际使用场景
我们(AVOS Cloud)是做 BaaS,场景非常适合使用 Docker,抛出来大家一起聊下。 在我们的平台上,一台 16 核 32G 内存的虚拟机上,需要跑 500+ 个用户的应用(每个应用的功能可以认为是一个网站 + 一系列的 RESTful API),有两个事情很重要:
- 资源隔离:比如限制应用最大内存使用量,或者资源加载隔离等。
- 低消耗:虚拟化本身带来的损耗需要尽量的低。
我们不可能在一台机器上开 500 个虚拟机,虽然可以在资源隔离方面做的很好,但这种虚拟化本身带来的资源消耗太严重。 另一个方面,我们可以考虑使用语言级别沙箱,虽然这种「虚拟化」本身的消耗可以低到忽略不计,但是资源隔离方面绝对是噩梦,比如你打算在一个 JVM 里隔离内存的使用。
而 Docker 很好的权衡了两者,即拥有不错的资源隔离能力,又有很低的虚拟化开销。