关于Docker的比喻

Docker的思想来自于集装箱,在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。

现在就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装好,就可以用一艘大船把他们都运走。docker就是类似的理念。现在都流行云计算,云计算就好比大货轮。docker就是集装箱。

  • 1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小。
  • 2.通常开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker就可以把开发环境直接封装转移给运维,运维直接部署给他的docker就可以了。
  • 3.在服务器负载方面,如果单独开一个虚拟机,那么虚拟机会占用空闲内存,用docker部署的话,这些内存就会利用起来。

从Container理解Docker

要解释清楚Docker,首先要解释清楚容器(Container)的概念。要解释容器,需要从操作系统(Operating System)说起。直接引用维基的说法,操作系统就是管理计算机的硬件软件资源,并且为软件运行提供通用服务的系统软件。

  • 硬件管理,包括分配CPU时间、内存,从网络、存储设备等IO设备读写数据。
  • 软件管理,就是各种软件的运行,线程、进程调度之类的工作。为软件提供运行环境,这个运行环境通常一部分由操作系统内核(Kernel)提供,另一部分由运行库(Runtime Library)提供。

硬件、操作系统、应用程序之间的关系可以简单的用下图表示:

+--------------------------+
|       Applications       |
+--------------------------+
|+------------------------+|
||    Runtime Library     ||
|+------------------------+|
||         Kernel         ||
|+------------------------+|
|     Operating System     |
+-----+--------+-----------+
| CPU | Memory | IO Device |
+-----+--------+-----------+

随着硬件的性能提升,以及软件种类的丰富,有两种情况变得很常见:

  • 硬件性能过剩——很多计算机的硬件配置,即使不能完全满足峰值性能的要求,也往往会有大量时间处于硬件资源闲置的状态。例如一般家用电脑,已经是四核、六核的配置了,除了游戏、视频制作、3D渲染、高性能计算等特殊应用外,通常有90%以上时间CPU是闲置的。
  • 软件冲突——因为业务需要,两个或者多个软件之间冲突,或者需要同一个软件的不同版本。例如早几年做web前端的,要测试网页在不同版本的IE浏览器上是否能正常显示,然而Windows只能装一个版本的IE浏览器。

为了解决软件冲突,只能配置多台计算机,或者在同一台电脑上安装多个操作系统,通过重启来进行切换。显然这两个方案都有其缺点:多台计算机成本太高,多操作系统的安装、切换都很麻烦。在硬件性能过剩的时候,硬件虚拟化的普及就很自然而然的提出来了。

所谓硬件虚拟化,就是某个特殊的软件,仿真出一台或者多台计算机的各种硬件,用户可以在这一台虚拟机上安装、运行操作系统(一般叫来宾操作系统,Guest OS)和各种应用,并且把Guest OS和上面应用软件对硬件资源的访问转发到底层的硬件上来实现。对于Guest OS和上面的应用程序来说,这台虚拟机和普通的物理计算机是完全一样没有任何区别的——除了性能可能差一点。著名的VMware就是这么一个软件,这类软件有一个专用的单词是Hypervisor(维基的Hypervisor词条说另一种叫法是虚拟机监视器,Virtual Machine Monitor,vmm);

Hypervisor根据其对硬件资源的访问方式,可以分为两大类:

  • Type I:Hypervisor直接访问硬件资源,通常会有另一个操作系统运行于Hypervisor之上来对硬件资源,例如VMware EXSi,Windows的Hyper-V,Linux的Xen;
  • Type II:Hypervisor和普通的应用一样,运行在某个操作系统(例如Windows或者Linux等,这里称之为宿主机操作系统,Host OS)之上,Hypervisor通过Host OS访问硬件资源,例如VMware Workstation,Virtual Box等;

两种类型的Hypervisor区别如图所示:

                             +-----+-----+-----+-----+|App A|App B|App C|App D|
+-----+-----+-----+-----+    +-----+-----+-----+-----+
|App A|App B|App C|App D|    |Guest|Guest|Guest|Guest|
+-----+-----+-----+-----+    | OS0 | OS1 | OS2 | OS3 |
|Guest|Guest|Guest|Guest|    +-----+-----+-----+-----+
| OS0 | OS1 | OS2 | OS3 |    |        Hypervisor     |
+-----+-----+-----+-----+    +-----------------------+
|        Hypervisor     |    |         Host OS       |
+-----------------------+    +-----------------------+
|        Hardware       |    |        Hardware       |
+-----------------------+    +-----------------------+Type I                       Type II

虚拟机的一个缺点在于Guest OS通常会占用不少硬件资源。例如Windows开机不运行任何运用,就需要占用2到3G内存,20到30G硬盘空间。即使是没有图形界面的Linux,根据发行版以及安装软件的不同也会占用1G内存,1到4G硬盘空间。而且为了应用系统运行的性能,往往还要给每台虚拟机留出更多的内存容量。虽然不少Hypervisor支持动态内存,但基本上都会降低虚拟机的性能。如果说这样的资源占用少量的虚拟机还可以接受的话,同时运行十数台数十台虚拟机的时候,浪费的硬件资源就相当可观了;

能不能将所有的应用使用同一个操作系统减少硬件资源的浪费,但是又能避免包括运行库在内的软件冲突?操作系统层虚拟化——容器概念的提出,就是为了解决这个问题。在Linux下,可以通过控制组(Control Group,通常简写为cgroup)隔离,并把应用和运行库打包在一起,来实现这个目的。

物理机,容器和Type II虚拟机的区别见下图:

+-----+-----+-----+-----+                                   +-----+-----+-----+-----+
|App A|App B|App C|App D|     +-----+-----+-----+-----+     |App A|App B|App C|App D|
+-----+-----+-----+-----+     |App A|App B|App C|App D|     +-----+-----+-----+-----+
|+---------------------+|     +-----+-----+-----+-----+     |Guest|Guest|Guest|Guest|
||   Runtime Library   ||     |Lib A|Lib B|Lib C|Lib D|     | OS0 | OS1 | OS2 | OS3 |
|+---------------------+|     +-----+-----+-----+-----+     +-----+-----+-----+-----+
||       Kernel        ||     |    Container Engine   |     |        Hypervisor     |
|+---------------------+|     +-----------------------+     +-----------------------+
|   Operating System    |     |         Host OS       |     |         Host OS       |
+-----------------------+     +-----------------------+     +-----------------------+
|       Hardware        |     |        Hardware       |     |        Hardware       |
+-----------------------+     +-----------------------+     +-----------------------+Physical Machine                  Container                 Type II Hypervisor

上图中,每一个App和Lib的组合,就是一个容器。也就是Docker图标里面的一个集装箱。和虚拟机相比,容器有以下优点:

  • 迅速启动:没有虚拟机硬件的初始化,没有Guest OS的启动过程,可以节约很多启动时间,这就是容器的“开箱即用”。
  • 占用资源少:没有运行Guest OS所需的内存开销,无需为虚拟机预留运行内存,无需安装、运行App不需要的运行库/操作系统服务,内存占用、存储空间占用都小的多。

Docker把App和Lib的文件打包成为一个镜像,容器是镜像的实例。


Docker的容器与镜像

docker有三部分组成:镜像(image)+容器(container)+仓库(repository);

容器是由镜像实例化而来,这和面向对象的概念十分相似,我们可以把镜像看作类,把容器看作类实例化后的对象;

也可以说镜像是文件, 容器是进程。 容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件,这里的文件包括进程运行所需要的可执行文件, 依赖软件, 库文件, 配置文件等等;

镜像,容器,仓库的概念可以通过下图理解:


通过Docker,现在的绝大部分应用,开发者都可以通过docker build创建镜像,通过docker push上传镜像,用户通过docker pull下载镜像,用docker run运行应用。用户不需要再去关心如何搭建环境,如何安装,如何解决不同发行版的库冲突,而且通常不会需要消耗更多的硬件资源,不会明显降低性能。

关于Docker的理解相关推荐

  1. Docker操作系统理解

    Docker操作系统理解 一.操作系统介绍 1.操作系统定义 2.操作系统理解 3.内核作用 4.容器操作系统 二.使用容器运行不同发行版的linux系统 1.下载容器镜像 2.查看下载好的本地容器镜 ...

  2. Docker(基础理解)

    回顾之前遇到的问题: 1.安装一堆不同版本的python在本机,明明用pip安装套件却无法import 2.本地开发用的套件版本和生产环境不合,代码一到生产环境就不能用 3.申请一个测试用的开发环境需 ...

  3. Docker / 深入理解的容器和镜像

    这篇文章希望能够帮助读者深入理解 docker 的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 零.概览 当我对 docker 技术还是 ...

  4. Docker 深入理解概念

    Docker 资源限制的幕后主使cgroup Docker 中的资源限制技术:CGroups . Linux Cgroups 的全称是 Linux Control Group ,简单来说, CGrou ...

  5. docker个人理解与极简安装

    1.小谈docker 以下皆为楼主个人理解,如有错误请指出. 1.docker是什么 docker是一种容器化引擎,可以简单的理解是当使用时,docker为我们建立了一个虚拟机,将我们需要安装的软件安 ...

  6. docker 使用理解 全流程

    1.docker是什么 docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制 ...

  7. docker存储--理解镜像文件系统aufs/device mapper、主机存储共享、容器间存储共享、分布式存储Flocker

    1. docker存储分类 Docker为容器提供了两种存放数据的资源,分别是: 由storage driver管理的镜像层和容器层,即镜像内文件系统. Data Volume,宿主机文件系统 2. ...

  8. docker网络--理解linux底层实现机制、docker网络模式

    1. Linux网络基础 Linux内核具有非常成熟和高性能的TCP / IP堆栈实现.Docker网络使用linux内核的网络堆栈作为低级原语来创建高级网络驱动程序.简而言之,Docker网络就是 ...

  9. docker pull理解误区

    docker run 命令 如果local image中有对应 镜像+tag 不会从新拉取镜像 docker pull 会进行拉取 先进行镜像更改 [root@master01 ~]# docker ...

最新文章

  1. 为什么阿里强制 boolean 类型变量不能使用 is 开头?
  2. mysql where后面if_mysql查询语句where后面加if判断
  3. 微信小程序---导航(navigator)
  4. 深入理解计算机系统:网络编程 下 一个简单的web服务器
  5. 关于 CKEditor 3.6以后不兼容ie6的问题解决方案
  6. dex分包之--------multidex包的配置使用
  7. 从事python需要掌握哪些知识和技能_零基础想转行从事Python?需要掌握如下技能...
  8. vue 计算属性_lt;Vue 源码笔记系列6gt;计算属性 computed 的实现
  9. 服务器显示配置命令,linux查看服务器配置命令
  10. sqlite3_get_table()
  11. Ubuntu16.04安装QQ(for linux)
  12. C语言编写小程序——万年历
  13. 界面清爽的SNS社交网络系统源码 PHP+MySQL(已整合IM聊天系统)
  14. Excel随机数生成
  15. 什么是EDM营销?EDM营销的优点是什么?
  16. 兼容 IE、 FireFox 的 javascript 日历控件 原创作者:寒羽枫(cityhunter172)
  17. Mac取证你需要了解的那些事!
  18. 用Python玩转二维码
  19. 中文文本分类 传统机器学习+深度学习
  20. 这是一篇有温度的NLP秋招面经

热门文章

  1. Redis 过滤请求绝技 — 布隆过滤器与布谷鸟过滤器
  2. 想要彻底搞懂“异地多活”,看完这篇就够了
  3. 面试造飞机系列:面对Redis持久化连环Call,你还顶得住吗?
  4. 生产环境:Nginx高可用方案
  5. 建议收藏这7个软件,自用良心推荐!
  6. 那些对数据实时性要求高的APP后端是怎么做的
  7. 如何使用Leangoo看板统计中的任务周期?
  8. 当定时任务遇上随机数
  9. 面试彩蛋1:斐波那契数列用递归函数、循环函数实现
  10. 动态内存分配与柔性数组