乐趣区

大白话让你更懂Docker

 

从 Logo 说起

进入主题之前,我们先来欣赏一下 Docker 的 Logo
已经有审美感很强的同学看出来了,这就是一条咸鱼..

额,不对,这是一条鲸鱼,鲸鱼上载满了集装箱,  可以看“原型”感受一下
官方团队对 Logo 的解释:「The logo is a Whale carrying a stack of containers. It is on its way to deliver those to you」

Docker 直译过来是码头工人,然而 Docker 给人的第一感觉是容器,容器技术英译为 Linux Container,Container 的直译有集装箱,容器两个意思,如果要形象的理解 Linux Container 的话还是叫集装箱技术比较好(可以结合着上图及 LOGO 理解这句话),由于这涉及到学术交流,及中国本土文化,念集装箱技术会比较奇怪,所以我们都称之为容器技术

为什么是 ” 集装箱技术 ”

我们都知道码头里的集装箱是运载货物用的,它是一种按规格标准化的钢制箱子。集装箱的特色,「在于其格式划一,并可以层层重叠,集装箱与集装箱之间互不影响」

于是乎,IT 领域借鉴了这一理念,大家就在想,有没有可能大家「只需要关注程序本身?」

换句话来说,就是我部署一个服务运行好后,我再想移植到另外一个地方,

「不用再安装一套操作系统和依赖环境。」

这就像集装箱运载一样,我把一辆兰博基尼跑车(好比开发好的应用 APP),打包放到一容器集装箱里,它通过货轮可以轻而易举的从上海码头(CentOS7.2 环境)运送到纽约码头(Ubuntu14.04 环境)。而且运输期间,我的兰博基尼(APP)没有受到任何的损坏(文件没有丢失),在另外一个码头卸货后,依然可以完美风骚的赛跑(启动正常)。请结合下图理解

进入正题

定义: Docker 是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的 Linux 机器上,也可实现虚拟化

进一步认识 Docker 之前,我准备了两个关键词

  • 虚拟化技术
  • 容器技术

虚拟化技术

定义: Virtual Machine(又名 VM) 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序 [1] 都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率

通俗点来讲就是虚拟化是为一些组件(例如虚拟应用、服务器、存储和网络)创建基于软件的(或虚拟)表现形式的过程。

基于 hypervisor(虚拟机管理系统)的虚拟化方式可以最大程度上提供虚拟化管理的灵活性。各种不同操作系统的虚拟机都能通过 hypervisor 来衍生、运行、销毁。

然而,随着时间推移,人们发现 hypervisor 这种方式麻烦越来越多。为什么?因为对于 hypervisor 环境来说,每个虚拟机都需要运行一个完整的操作系统以及其中安装好的大量应用程序, 如下图

但实际生产应用时,「我们更关注的是自己部署的应用程序本身」

容器技术

定义: 英文为 Container 有效的将单个操作系统的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求

容器技术严格来说并不是虚拟化,没有客户机操作系统,是共享内核的。容器可以视为软件供应链的集装箱,能够把应用需要的运行环境、缓存环境、数据库环境等等封装起来,以最简洁的方式支持应用运行

Docker 三大核心概念

  • 镜像
  • 容器
  • 仓库

为了更好的理解,先讲大家讲个小故事

小 A 同学想要造一栋别墅,他重金请来了高级设计师,高级建造师,等各种高级工人,热火朝天历时二个月房子建成了,半年后,小 A 同学由于工作调动需要换到另一个城市,他只好在另一个城市花了重金又打造了一栋别墅

小 A 有一个朋友小 B,跟小 A 是同样的场景,唯一不同的是,小 B 认识一个魔法师,这个魔法师施展了法术(构建镜像),将小 B 的别墅直接复制了一份 (镜像),装到了小 B 的双肩包(仓库) 里,小 B 去到另一个城市找了一片空地 (容器) 直接将装在书包里的房子拿了出来,拿出来的房子就能变成跟小 B 在原城市一模一样的房子

听完了故事,咱们再来理解 docker 的两句口号就更好理解了

  • 「Build, Ship and Run (搭建,发送,运行)」
  • 「Build once,Run anywhere (搭建一次,运行到任何地方)」

镜像

如果进行形象的表述,我们可以将 Docker 镜像理解为包含应用程序以及其相关依赖的一个基础文件系统(存储着我们的程序和数据文件等等信息,镜像层可以理解为基本的镜像,可以通过组合多个镜像层生成一个新的镜像;也可以将一个镜像可以作为一个镜像层,成为组合别的镜像的一份子),在 Docker 容器启动的过程中,它以只读的方式被用于创建容器的运行环境,如下图

容器

容器和镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,可以记住这个简单的公式:容器 = 容器镜像 + 可读可写层,如下图

前面说镜像的时候我们有提到它是一个静态文件系统,那么既然容器跟它一样,所以,镜像跟容器都是一个静态概念,但是,容器是可以 run 起来的,当容器 run 起来时,就会成为一个被称作运行态容器的东西,如下图所示

运行态容器 (run container) 是由静态容器(可读写的静态文件系统)、一个隔离的进程空间、以及运行于其中的程序进程所组成。我们通常用 docker run 运行起来的其实就是运行态容器,而使用 docker stop 停止后的容器,就是静态容器

仓库

仓库 (Repository) 是最易理解的部分,大家都用过 Node 的包管理 Npm,这个概念是一致的,仓库分为两种,本地及远程,当我们 build 好一个镜像后,这个镜像会先存放到本地仓库,当我们需要利用网络进行分发时,我们可以 push 到远程仓库,后续通过网络下载使用

官方的 npm 源下载有时候特别慢,这个是由于 XX 的原因,然后我们就需要使用国内的镜像源,那么 docker 的操作也是一样的

容器技术的特性

一种技术的采用,一定有它适合的场景和优势。容器技术的流行原因,总结下来可能主要归功于以下的这些特性

  • 轻量级(只打包必要的 lib/bin)
  • 秒布署(毫秒与秒之间)
  • 易移植(「Build once,Run anywhere」)
  • 弹性伸缩(高可用,节约成本)

总结

通过本文我们对 Docker 有了一个基本的认识,知道了 Docker Logo 并不是一条咸鱼,容器技术与虚拟技术之间的差异,Docker 的三大核心概念及其特性

但 Docker 中涉及的内容远不止于此,帅编也会在下个章节为大家讲解 ” 实际工作场景中的 Docker 应用 ”

点亮在看,持续关注,我们下期再见

Reference

[1]

应用程序:https://baike.baidu.com/item/…

近期

十个超级实用的 ES6 特性

Vue 版的团队代码规范

退出移动版