当前位置: 首页 > 网络功能虚拟化 > 正文

Linux下的轻量级虚拟化:应用容器Docker

不经意间Docker就火了(可能自己以前太孤陋寡闻了吧),既然有了KVM,Xen,Qemu为啥还要Docker,让我等不停地追,却怎么样也追不上。

废话少说,不管用不用,还是先了解一下什么是Docker吧,免得被人鄙视:)

Docker的官方定义

Docker的官网http://www.docker.com/ 上的定义如下:

Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications. Consisting of Docker Engine, a portable, lightweight runtime and packaging tool, and Docker Hub, a cloud service for sharing applications and automating workflows, Docker enables apps to be quickly assembled from components and eliminates the friction between development, QA, and production environments. As a result, IT can ship faster and run the same app, unchanged, on laptops, data center VMs, and any cloud.

不过长话短说的话,可以把它堪称成一个用了一种新颖方式实现的超轻量虚拟机。当然在实现的原理和应用上还是和Virtual Machine有巨大差别,其专业一点的叫法是应用容器(Application Container)。

为啥要用容器?

那么应用容器长什么样子呢,一个做好的应用容器长得就好像一个装好了一组特定应用的虚拟机一样。比如我现在想用Mysql那我就找个装好Mysql的容器,运行起来,那么我就可以使用 Mysql 了。

那么为何不直接安装个Mysql呢,其实安装Mysql的话可能要再装一堆依赖库,根据的操作系统平台和版本进行设置,如果从源代码编译的话还会报出一堆莫名其妙的错误,很繁琐的。

但是有了容器,就相当于有了一个可以运行起来的虚拟机,只要能运行容器,Mysql的配置就全省了。而且一旦想更换机器,直接把这个容器拷贝另一台机器就OK了。硬件、操作系统、运行环境什么的都不需要考虑。

在公司中的一个很大的用途就是可以保证线下的开发环境、测试环境和线上的生产环境一致。利用容器,开发直接在容器里完成,测试的时候把整个容器提交给测试人员,测试完毕在容器里直接修改后再上线就。通过容器,整个开发、测试和生产环境可以保持高度的一致。

此外容器也和Virtual Machine一样具有着一定的隔离性,各个容器之间的数据和内存空间相互隔离,可以保证一定的安全性。

为啥不用Virtual Machine?

容器 与 Virtual Machine这么类似,为什么不直接用 Virtual Machine呢,其实,Docker 传统的虚拟机有以下几个优点:

  1. 启动速度快,容器通常在一秒内可以启动,而虚拟机所花的时间要长很多。
  2. 资源利用率高,一台普通 PC 可以跑上千个容器,你跑上千个虚拟机试试:)
  3. 性能开销小,虚拟机通常需要额外的CPU和内存来完成操作系统的功能,这一部分占据了额外的资源

为啥相似的功能在性能上会有如此巨大的差距呢,其实这和他们的设计的理念是相关的。 VM 的设计图如下:

vm

虚拟机的Hypervisor需要实现对硬件的虚拟化,并且还要搭载自己的操作系统,自然在启动速度和资源利用率以及性能上有比较大的开销。而 Docker 的设计图是这样的:

docker

Docker 几乎就没有什么虚拟化的东西,并且直接复用了 Host 主机的 OS,在 Docker Engine 层面实现了调度和隔离重量一下子就降低了好几个档次。 Docker 的容器利用了 LXC,管理利用了 namespaces 来做权限的控制和隔离, cgroups 来进行资源的配置,并且还通过 aufs 来进一步提高文件系统的资源利用率。

其中的 aufs 是个很有意思的东西,是 UnionFS 的一种。他的思想和 git 有些类似,可以把对文件系统的改动当成一次 commit 一层层的叠加。这样的话多个容器之间就可以共享他们的文件系统层次,每个容器下面都是共享的文件系统层次,上面再是各自对文件系统改动的层次,这样的话极大的节省了对存储的需求,并且也能加速容器的启动。

Docker 是用Go语言编写的,源代码托管在 github 而且居然只有 1W 行就完成了这些功能。如果想尝试一下的话可以看官方介绍了,应该上手会容易一些了。

本文固定链接: http://sdnhub.cn/index.php/introduction-docker/ | 软件定义网络SDN

该日志由 sdnhub 于2014年07月08日发表在 网络功能虚拟化 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Linux下的轻量级虚拟化:应用容器Docker | 软件定义网络SDN
关键字:

Linux下的轻量级虚拟化:应用容器Docker:等您坐沙发呢!

发表评论

*

快捷键:Ctrl+Enter