目录
1、什么是 Docker?
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
什么是LXC
在这里解释一个名词,LXC,是Linux Container缩写。LXC是一种内核虚拟化技术,可以提供轻量级的虚拟化,一遍隔离进程和资源。例如Docker。
2、为什么是Docker?
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
-
首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。
-
其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
-
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
具体说来,Docker 在如下几个方面具有较大的优势。
更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
这一点在微服务时代非常重要,持续集成也是DevOps的目标。
更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
3、虚拟化和容器化对比
什么是容器化
容器为应用程序提供了隔离的运行空间
:每个容器内都包含一个独享的完整用户环境空间,并且一个容器内的变动不会影响其他容器的运行环境。为了能达到这种效果,容器技术使用了一系列的系统级别的机制诸如利用Linux namespaces来进行空间隔离,通过文件系统的挂载点来决定容器可以访问哪些文件,通过cgroups来确定每个容器可以利用多少资源。
此外容器之间共享同一个系统内核,这样当同一个库被多个容器使用时,内存的使用效率会得到提升。
什么是虚拟化
对于系统虚拟化技术来说,虚拟层为用户提供了一个完整的虚拟机
:包括内核在内的一个完整的系统镜像。CPU虚拟化技术可以为每个用户提供一个独享且和其他用户隔离的系统环境,虚拟层可以为每个用户分配虚拟化后的CPU、内存和IO设备资源。
容器化和虚拟化对比
对比而言容器化优势(虚拟机劣势)
:
-
快速部署(秒级),启动一个容器只需要派生一个进程并完成OS启动的用户态部分,而启动一个虚拟机需要执行额外的 BIOS 和内核代码。
-
容器几乎没有额外的 IO 性能开销。如果没有完善的硬件虚拟化支持,虚拟机会引入显著的 IO 性能开销
-
容器的内存开销较小: 启动一个没有任何负载的容器仅需要几十 MB 的内存,而虚拟机由于包含完整的内核,内存开销要大得多。另外如果使用 Union FS 来构造容器的文件系统,能减少 page cache 带来的内存开销
-
较小的磁盘空间占用: 构造容器的文件系统时,静态文件可以使用 bind-mount 或者Union FS 方式从宿主机加载,可以节省大量磁盘空间
容器化劣势(虚拟机优势)
:
-
资源隔离效果逊于虚拟机。对于虚拟机技术,由于有 Hypervisor 的存在,资源的隔离实现非常完整。 而容器技术还处于开发阶段,资源隔离的效果要逊于虚拟机。
-
内核的修改会影响所有的容器,虚拟机因为 Hypervisor 的存在,内核的更新只会影响一个应用。
-
缺少动态迁移的支持,目前 OpenVZ 的 CRIU 项目提供了初步的 checkpointing 和 restore支持,但完整的动态迁移仍需时日。虚拟机的动态迁移方案相对比较完整
那么该如何选择呢?
通常来说,这取决于你的需求。如果你只是希望将应用运行的实例进行隔离,那么对于管理应用运行环境、启动应用实例以及控制资源开销方面容器将是一个极为高效的工具。像Docker这一类的容器,其设计原则就是为了解决这种应用环境的修改以及应用部署的问题,并且这十分符合DevOps理念。
如果你从服务器虚拟化的角度来寻找最好的环境隔离方案,那么系统级的虚拟化是更好的方案:和容器相比,邻居租户(Noisy neighbours )对系统的影响在虚拟化的方案下将不是一个问题。尽管现在很多容器都在专注于提高其隔离能力,但是虚拟机的隔离还是要优于容器。从物理服务器过渡到虚拟服务器是一个很自然的过程,并且现在针对虚拟服务器的管理的生态系统也很完善。
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |