黑马程序员技术交流社区

标题: 【上海校区】讲真的,这可能是把Docker概念讲的最清楚的... [打印本页]

作者: 不二晨    时间: 2018-7-6 10:21
标题: 【上海校区】讲真的,这可能是把Docker概念讲的最清楚的...

本文仅仅对 Docker 的概念做了较为具体的介绍,并不触及一些像 Docker 环境的装置以及 Docker 的一些常见操作和指令。

  先从知道容器开端

  什么是容器?

  先来看看容器较为官方的解说:

  容器镜像是轻量的、可履行的独立软件包 ,包括软件运转所需的一切内容:代码、运转时环境、体系东西、体系库和设置。

  容器化软件适用于根据 Linux 和 Windows 的运用,在任何环境中都能够始终如一地运转。

  容器赋予了软件独立性,使其免受外在环境差异(例如开发和预演环境的差异)的影响,然后有助于削减团队间在相同根底设施上运转不同软件时的抵触。

  一句话归纳容器:容器就是将软件打包成规范化单元,以用于开发、交给和布置。

  再来看看容器较为浅显的解说:假如需求浅显的描绘容器的话,我觉得容器就是一个寄存东西的当地,就像书包能够装各种文具、衣柜能够放各种衣服、鞋架能够放各种鞋子相同。

  咱们现在所说的容器寄存的东西可能更倾向于运用,比方网站、程序乃至是体系环境。

  图解物理机、虚拟机与容器

  关于虚拟机与容器的比照在后面会具体介绍到,这儿仅仅经过网上的图片加深咱们关于物理机、虚拟机与容器这三者的理解。

  物理机

  虚拟机

  容器

  经过上面这三张笼统图,咱们大约能够经过类比归纳出: 容器虚拟化的是操作体系而不是硬件,容器之间是同享同一套操作体系资源的。

  虚拟机技能是虚拟出一套硬件后,在其上运转一个完好操作体系。因而容器的阻隔级别会稍低一些。

  信任经过上面的解说咱们关于容器这个既陌生又了解的概念有了一个开始的知道,下面咱们就来谈谈 Docker 的一些概念。

  谈谈 Docker 的一些概念

  什么是 Docker

  说实话关于 Docker 是什么并不太好说,下面我经过四点向你阐明 Docker 到底是个什么东西:

  Docker 是世界领先的软件容器渠道。

  Docker 运用 Google 公司推出的 Go 言语进行开发完结,根据 Linux 内核的 cgroup,namespace,以及 AUFS 类的 UnionFS 等技能,对进程进行封装阻隔,归于操作体系层面的虚拟化技能。

  由于阻隔的进程独立于宿主和其他的阻隔的进程,因而也称其为容器。Docke 开始完结是根据 LXC。

  Docker 能够主动履行重复性使命,例如搭建和装备开发环境,然后解放了开发人员以便他们专心在真实重要的工作上:构建出色的软件。

  用户能够方便地创建和运用容器,把自己的运用放入容器。容器还能够进行版别办理、仿制、同享、修正,就像办理一般的代码相同。

  Docker 思维:

  集装箱

  规范化: ①运送方法、②存储方法、 ③API接口

  阻隔

  Docker 容器的特色:

  轻量,在一台机器上运转的多个 Docker 容器能够同享这台机器的操作体系内核;它们能够敏捷发动,只需占用很少的计算和内存资源。

  镜像是经过文件体系层进行构造的,并同享一些公共文件。这样就能尽量下降磁盘用量,并能更快地下载镜像。

  规范,Docker 容器根据开放式规范,能够在一切主流 Linux 版别、Microsoft Windows 以及包括 VM、裸机效劳器和云在内的任何根底设施上运转。

  安全,Docker 赋予运用的阻隔性不只限于互相阻隔,还独立于底层的根底设施。

  Docker 默许供给最强的阻隔,因而运用呈现问题,也仅仅单个容器的问题,而不会波及到整台机器。

  为什么要用 Docker

  运用 Docker 有如下几点优势:

  共同的运转环境。Docker 的镜像供给了除内核外完好的运转时环境,保证了运用运转环境共同性,然后不会再呈现“这段代码在我机器上没问题啊”这类问题。

  更快速的发动时刻。能够做到秒级、乃至毫秒级的发动时刻。大大的节省了开发、测验、布置的时刻。

  阻隔性。防止共用的效劳器,资源会简略遭到其他用户的影响。

  弹性伸缩,快速扩展。长于处理会集迸发的效劳器运用压力。

  搬迁方便。能够很简单的将在一个渠道上运转的运用,搬迁到另一个渠道上,而不用忧虑运转环境的改动导致运用无法正常运转的状况。

  继续交给和布置。运用 Docker 能够经过定制运用镜像来完结继续集成、继续交给、布置。

  每逢说起容器,咱们不得不将其与虚拟机做一个比较。

  容器 VS 虚拟机

  简略来说: 容器和虚拟机具有类似的资源阻隔和分配优势,但功用有所不同,由于容器虚拟化的是操作体系,而不是硬件,因而容器更简略移植,功率也更高。

  两者比照图

  传统虚拟机技能是虚拟出一套硬件后,在其上运转一个完好操作体系,在该体系上再运转所需的运用进程。

  而容器内的运用进程直接运转于宿主的内核,容器内没有自己的内核,并且也没有进行硬件虚拟。因而容器要比传统虚拟机更为简便。

  容器与虚拟机 (VM) 总结:

  容器是一个运用层笼统,用于将代码和依靠资源打包在一起。多个容器能够在同一台机器上运转,同享操作体系内核,但各自作为独立的进程在用户空间中运转 。

  与虚拟机比较, 容器占用的空间较少(容器镜像巨细一般只要几十兆),瞬间就能完结发动 。

  虚拟机(VM)是一个物理硬件层笼统,用于将一台效劳器变成多台效劳器。办理程序答应多个 VM 在一台机器上运转。

  每个 VM 都包括一整套操作体系、一个或多个运用、必要的二进制文件和库资源,因而占用大量空间。并且VM发动也非常缓慢 。

  经过 Docker 官网,咱们知道了这么多 Docker 的优势,可是咱们也没有必要完全否定虚拟机技能,由于两者有不同的运用场景。

  虚拟机更擅长于完全阻隔整个运转环境。例如,云效劳供给商一般选用虚拟机技能阻隔不同的用户。而 Docker 一般用于阻隔不同的运用 ,例如前端,后端以及数据库。

  就我而言,关于两者无所谓谁会替代谁,而是两者能够调和共存。

  Docker 中非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。

  Docker 基本概念

  Docker 包括三个基本概念:

  镜像(Image)

  容器(Container)

  库房(Repository)

  镜像:一个特别的文件体系

  操作体系分为内核和用户空间。关于 Linux 而言,内核发动后,会挂载 root 文件体系为其供给用户空间支撑。而 Docker 镜像(Image),就相当所以一个 root 文件体系。

  Docker 镜像是一个特别的文件体系,除了供给容器运转时所需的程序、库、资源、装备等文件外,还包括了一些为运转时准备的一些装备参数(如匿名卷、环境变量、用户等)。

  镜像不包括任何动态数据,其内容在构建之后也不会被改动。

  Docker 设计时,就充分利用 Union FS 的技能,将其设计为分层存储的架构。 镜像实践是由多层文件体系联合组成。

  镜像构建时,会一层层构建,前一层是后一层的根底。每一层构建完就不会再发作改动,后一层上的任何改动只发作在自己这一层。

  比方,删去前一层文件的操作,实践不是真的删去前一层的文件,而是仅在当时层标记为该文件已删去。

  在终究容器运转的时分,尽管不会看到这个文件,可是实践上该文件会一向跟从镜像。

  因而,在构建镜像的时分,需求额定当心,每一层尽量只包括该层需求增加的东西,任何额定的东西应该在该层构建完毕前整理掉。

  分层存储的特征还使得镜像的复用、定制变的更为简略。乃至能够用之前构建好的镜像作为根底层,然后进一步增加新的层,以定制自己所需的内容,构建新的镜像。

  容器:镜像运转时的实体

  镜像(Image)和容器(Container)的联系,就像是面向对象程序设计中的类和实例相同,镜像是静态的界说,容器是镜像运转时的实体。容器能够被创建、发动、中止、删去、暂停等 。

  容器的本质是进程,但与直接在宿主履行的进程不同,容器进程运转于归于自己的独立的命名空间。前面讲过镜像运用的是分层存储,容器也是如此。

  容器存储层的生计周期和容器相同,容器消亡时,容器存储层也随之消亡。因而,任何保存于容器存储层的信息都会随容器删去而丢掉。

  依照 Docker 最佳实践的要求,容器不该该向其存储层内写入任何数据 ,容器存储层要坚持无状况化。

  一切的文件写入操作,都应该运用数据卷(Volume)、或许绑定宿主目录,在这些方位的读写会越过容器存储层,直接对宿主(或网络存储)发作读写,其功能和稳定性更高。

  数据卷的生计周期独立于容器,容器消亡,数据卷不会消亡。因而, 运用数据卷后,容器能够随意删去、从头 run,数据却不会丢掉。

  库房:会集寄存镜像文件的当地

  镜像构建完结后,能够很简略的在当时宿主上运转,可是, 假如需求在其他效劳器上运用这个镜像,咱们就需求一个会集的存储、分发镜像的效劳,Docker Registry 就是这样的效劳。

  一个 Docker Registry 中能够包括多个库房(Repository);每个库房能够包括多个标签(Tag);每个标签对应一个镜像。

  所以说,镜像库房是 Docker 用来会集寄存镜像文件的当地,类似于咱们之前常用的代码库房。

  一般,一个库房会包括同一个软件不同版别的镜像,而标签就常用于对应该软件的各个版别 。

  咱们能够经过<库房名>:<标签>的格局来指定具体是这个软件哪个版别的镜像。假如不给出标签,将以 latest 作为默许标签。

  这儿弥补一下 Docker Registry 揭露效劳和私有 Docker Registry 的概念:

  Docker Registry 揭露效劳是开放给用户运用、答运用户办理镜像的 Registry 效劳。

  一般这类揭露效劳答运用户免费上传、下载揭露的镜像,并可能供给收费效劳供用户办理私有镜像。

  最常运用的 Registry 揭露效劳是官方的 Docker Hub ,这也是默许的 Registry,并具有大量的高质量的官方镜像,网址为:hub.docker.com/ 。

  在国内拜访 Docker Hub 可能会比较慢,国内也有一些云效劳商供给类似于 Docker Hub 的揭露效劳。

  除了运用揭露效劳外,用户还能够在本地搭建私有 Docker Registry 。Docker 官方供给了 Docker Registry 镜像,能够直接运用做为私有 Registry 效劳。

  开源的 Docker Registry 镜像只供给了 Docker Registry API 的效劳端完结,足以支撑 Docker 指令,不影响运用。但不包括图形界面,以及镜像保护、用户办理、拜访操控等高档功用。

  最终谈谈:Build、Ship、and Run

  假如你查找 Docker 官网,会发现如下的字样:“Docker - Build,Ship,and Run Any App,Anywhere”。

  那么 Build,Ship,and Run 到底是在干什么呢?

  Build(构建镜像):镜像就像是集装箱,包括文件以及运转环境等等资源。

  Ship(运送镜像):主机和库房间运送,这儿的库房就像是超级码头相同。

  Run (运转镜像):运转的镜像就是一个容器,容器就是运转程序的当地。

  Docker 运转进程也就是去库房把镜像拉到本地,然后用一条指令把镜像运转起来变成容器。

  所以,咱们也常常将 Docker 称为码头工人或码头装卸工,这和 Docker 的中文翻译转移工人千篇一律。

  总结

  本文主要把 Docker 中的一些常见概念做了具体的论述,可是并不触及 Docker 的装置、镜像的运用、容器的操作等内容。这部分,期望读者自己能够经过阅览书籍与官方文档的方式把握。

【转载地址】https://blog.csdn.net/qq_42564846/article/details/80921234



作者: wuqiong    时间: 2018-7-12 15:43

作者: 吴琼老师    时间: 2018-7-12 16:34

作者: 不二晨    时间: 2018-7-12 17:04
赞一个




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2