Docker就应该通俗易懂一些

5,136 阅读6分钟

写在前面

为了避免浪费各位小伙伴的时间,这篇文章是我个人对Docker的理解和总结。也就是说并非涉及到Docker的实战。所以如果想了解Docker在开发过程中的作用,可能这篇文章会让你失望了~

这里是Docker的官方网站,不过很可惜需要翻墙。

本文主要谈一谈这几个点

  • 什么是容器?
  • 容器与虚拟机的比较
  • 什么是Docker?
  • Docker能做什么?

正文

什么是容器?

按照Docker文档中的定义:将软件打包成标准化单元,用于开发,装运和部署。

Package Software into Standardized Units for Development, Shipment and Deployment

不知道这短短的一句话,小伙伴们是怎么理解的。如果我们把视线定位到后面俩个词:装运部署。其实就相对好理解的多了。想要装运,那肯定需要载体,就像我们的集装箱。想要部署,就要有完整的环境,比如我们的Java,需要运行环境。

这俩个概念揉到一起:容器就是蕴涵程序及程序运行环境的合集。(打一个比喻:如果把我们正常的开发体系比作住宅的话;容器就像是房车。独立且五脏俱全)。

传统运行环境和容器的比喻

换个我们技术上的图,来加深一下对容器的理解:

来自官网的图片

我直接结合自己的理解,画的图...

Docker和容器的关系

容器与虚拟机的比较

其实上述巴拉巴拉说了这么多,又是装运,又是部署。说白了不就是隔离而已么?虚拟机也可以做啊!

没错,其实Docker官方文档也认可了这个说法。并没有否定:容器和虚拟机具有类似的资源隔离和分配优势。 Containers and virtual machines have similar resource isolation and allocation benefits

但是......官网祭出了它的杀器:

but function differently because containers virtualize the operating system instead of hardware. Containers are more portable and efficient.

说白了,容器的技术实现更骚:我不光能隔离;我还能小跑,还能小跳呢。你说气人不~~

沿用上述的比喻,如果传统的体系是别墅的话,容器还是房车的话。那么虚拟机就是多层的住宅区了~

既然提到了虚拟机,那么就让我们好好的聊一聊容器与虚拟机的不同。其实从Docker官方的解释就可以很清楚的看出俩者的不同:

容器:

容器是应用层的抽象,它将代码和依赖关系打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。容器占用的空间比VM少(容器映像的大小通常为几十MB),可以处理更多的应用程序,并且需要更少的VM和操作系统。

虚拟机:

虚拟机(VM)是物理硬件的抽象,将一台服务器转变为多台服务器。虚拟机管理程序允许多台虚拟机在一台计算机上运行。每个VM都包含操作系统的完整副本,应用程序,必要的二进制文件和库 - 占用数十GB。虚拟机也可能很慢启动。

说白了,容器是基于操作系统实现的;而虚拟机则是抽闲的计算机硬件。所以相对来说容器的级别更低一点。所以二者各有千秋,就像Docker官网所说:

在一起使用的容器和VM在部署和管理应用程序时提供了极大的灵活性。(Containers and VMs used together provide a great deal of flexibility in deploying and managing app)

什么是Docker?

个人觉得上述的那张图(Docker和容器的关系),可以比较清晰的展现出Docker是什么~

当然,图片能直观的展示,不能具体的描述。接下来让我们通过文字去进一步深化Docker的概念。

个人的理解:它二者不是包含关系。而是杂糅在一起的。我个人喜欢把“容器”理解成是一种概念,而Docker是“容器”这个概念下的一种实现方式(一整套解决方案。毕竟人家是一家商业公司,要赚钱哒~肯定是提供一整套服务)。

按照Docker官网的介绍(对外zhuangbi):

  • 轻量,在一台机器上运行的多个Docker容器。可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。
  • 标准,Docker容器基于开放式标准,能够在所有主流Linux版本、Microsoft Windows以及包括VM、裸机服务器和云在内的任何基础设施上运行。
  • 安全,Docker赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

说白了,作为一个容器,Docker可以帮我们隔离软件的运行环境。独立的数据库,独立的软件运行环境,独立的服务器进程。一切都是独立的,搞崩一个,还有一个,可劲霍霍~

借用百度的一个图:

Docker能做什么?

其实,有了上述那些内容,Docker能做什么已经比较清晰了。借用Docker官网对外“吹牛”的图:

  • 一致的运行环境:作为开发人员,我们经常会甩锅给运行环境。现在好了,Docker的镜像提供了除内核外完整的运行时环境。这个锅没的甩了。
  • 更快速的启动时间:Docker官方对外宣称,可以做到秒级、甚至毫秒级的启动时间。
  • 隔离性:这个就不用多说了...
  • 弹性伸缩,快速扩展:也不知道真的假的
  • 迁移方便:同JVM一个道理,可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上。
  • 持续交付和部署:使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。

Docker能做这些内容主要依赖它的三个内容:镜像(Docker Image)、容器(Docker Containers)、仓库(Docker Registry)。

三个概念

镜像(Docker Image)

镜像是一个构建容器的只读模板,它包含了容器启动所需的所有信息,包括运行程序和配置数据。

容器(Docker Containers)

开发环境真正运行的载体。

仓库(Docker Registry)

存放镜像的地方。

总结

个人理解,镜像可以理解成类(Class),它拥有对象的抽象结构。而容器才是我们真正被new出来,能让我们使用的对象。

更多内容,可以移步官方文档呦,需翻墙

尾声

以上内容,是我工作以来自己对Docker的理解。如有不当之处,还望各位大佬能够批评指正~

这里是一个应届生/初程序员公众号~~欢迎围观

我是一个应届生,最近和朋友们维护了一个公众号,内容是我们在从应届生过渡到开发这一路所踩过的坑,已经我们一步步学习的记录,如果感兴趣的朋友可以关注一下,一同加油~

个人公众号:IT面试填坑小分队