Docker 简介

Docker 已经火了有差不多2年了,自己的部分项目也都通过 Docker 的方式进行部署,觉得还是值得简单分享一下自己的学习笔记的,下面会尽可能通俗地进行解释,但由于经验和知识水平所限,难免会有理解上的偏差或者错误,详细请以 Docker 官方网站的介绍为准。

Docker 解决了什么问题

Docker 和虚拟主机(VM)要解决的问题是非常类似的:

  1. 在同一台主机上运行不同的程序,而这些不同的程序之间有可能存在依赖冲突的情况;
  2. 即使依赖冲突能在同一台主机上解决,但随着运行的程序的数量互相交织,维护的成本也将会成指数上升;
  3. 程序开发过程中,由于硬件、操作系统的细微差别,在多人共同开发和部署到生产环境上后,可能会出现难以被排查出来的问题;
  4. 分布式/集群环境的程序分发和环境配置问题;
  5. 硬件资源的利用率;

Docker 和 VM 之间的区别

因为这样,以致于很多人认为 Docker 也是一种虚拟化技术,实际上我更倾向于称其为容器化/沙盒化技术。

借用以下两张图来对比说明 docker-intro-01 docker-intro-02

=== 从硬件资源利用情况看 ===

虚拟机(VM)实际上利用了虚拟化的技术,获取了主机上实际的硬件资源(内存、CPU),通过获取到的硬件资源重新构建一个接近于真实的机器,而这部分被分配过的硬件资源(比如 512MB 内存)在虚拟机启动了以后,不管是否真的有使用到了,对于主机来说就真的少了这部分的资源了( 可用内存 = 物理内存 - 512MB);

而 Docker 利用的是 Linux 主机上的内核技术,当一个容器在运行的时候,实际上是“映射”成主机上的一批进程,这些进程相互独立,共享主机的硬件资源,假设容器1运行 MySQL 占用了 100MB 内存,容器2运行 nginx 占用 50MB 内存,在理论上(不计算容器本身的损耗的话)主机当前剩余可用内存 = 物理内存 - 100MB - 50MB;

=== 从程序运行归属情况看 ===

VM中的程序,是在隔离于主机的一个独立的操作系统(GuestOS)中运行的,程序运行的前提是 GuestOS 处于启动的状态,而程序运行后对于主机来说是完全透明的,主机无法看到VM中运行了什么进程;

而在 Docker 容器中运行的程序,只是隔离了程序的依赖关系(Bins/Libs),程序的执行者还是属于主机的,对主机来说所有容器在执行的程序都是主机的进程,不存在 GuestOS 所以也不存在需要启动 GuestOS;

=== 从对主机操作系统的依赖看 ===

VM依赖的是虚拟化技术(Hypervisor),当具体使用的技术是在对应的平台下能运行的话,该操作系统平台就可以创建VM并运行;

而 Docker 的运行原理是基于 LXC,这是基于 Linux 内核版本 2.6.24+ 以上才有的技术,所以依赖于 Linux,在其它平台上(Windows、OSX)无法直接使用(但可通过VM创建一个Linux系统来使用);

=== Docker Logo 的解读 ===

其实 Docker 的 Logo 很形象的说明了它自身的概念

docker-intro-03

鲸鱼通过身上的集装箱(Container)来将不同种类的货物进行隔离;而不是通过生出很多小鲸鱼(Guest OS)来承运不同种类的货物。

Loading Disqus comments...
Table of Contents