本文已参与「新人创作活动」,一起开启掘金创作之路。
大家好,我是脚丫先生 (o^^o)
最近,小伙伴总是询问我云计算技术。
目前的技术水平已经真正进入到了云计算时代。
各大基础设施纷纷上云,作为当下最主流的容器技术。
毫无疑问,Docker 容器技术已经成为互联网从业成员不可或缺的技术。
今天,我就以一层大白话的功力帮助小伙伴们简单的对Docker了解了解。
一、什么是虚拟化
在计算机中,虚拟化:是一种将计算机物理资源,如:服务器、网络、内存、存储等等,进行抽象、转换为虚拟的计算机资源提供给程序使用的技术。
简而言之,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,这样就可以充分利用硬件资源。
举个例子: 一块地有 100 平方,没有虚拟化技术时只能盖一层平房,现在有虚拟化技术了,可以盖五层,十层。同样一台服务器,之前只能玩一个操作系统,现在通过虚拟化可以搞定几十个虚拟主机操作系统环境。
二、初识 Docker
Docker 是一个开源的应用容器引擎,也是一种虚拟化技术,属于轻量级的虚拟化。可以这么去理解 docker,如上图 Logo 所示:鲸鱼和集装箱。
大鲸鱼就是操作系统,我们把要交付的应用程序看成是各种货物,原本要将各种各样形状、尺寸不同的货物放到大鲸鱼上,你得为每件货物考虑怎么安放(就是应用程序配套的环境),还得考虑货物和货物是否能叠起来(应用程序依赖的环境是否会冲突)。
现在使用了集装箱(容器)把每件货物都放到集装箱里,并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响,这样大鲸鱼可以用同样地方式安放、堆叠集装了,省事省时省力,美滋滋。
学习 docker 最吸引人的地方: 在于简化部署,随时迁移,优化运维管理。
随着互联网的飞速发展,应用系统架构日趋复杂,不同程序模块依赖的环境千奇百怪,导致部署一套环境成本越来越高,而且不便于迁移和管理。而在使用 docker 之后,可以把不同的程序分别打包成镜像,只需要管理这些镜像即可。
可以这么理解:一个镜像好比一个人,培养小王为数学家,专门负责数学相关的事。培养小李为语言学家,专门负责语言相关的事。体现到虚拟机上,就是这样:
mysql 镜像和 redis 镜像分别负责着各自的业务功能,不需要泪流满面的去安装和适配各种依赖环境。docker 创建的镜像,只需要三秒,开箱即用。突然有一种悄悄拔高,立马惊艳的感觉...nice.
Docker 镜像的设计,突破了以往程序即应用的观念,通过 Docker 镜像 ( images ) 将应用程序所需要的系统环境,由下而上打包,达到应用程序跨平台间的无缝接轨运作。
三、Docker 与虚拟机的形象比喻
1、物理机
物理机就好比一栋楼一户人家,
2、虚拟机
3、容器
四、虚拟机 VS 容器
1、物理机
物理机是相对于虚拟机而言的对实体计算机的称呼。物理机提供给虚拟机以硬件环境,有时也称为“寄主”或“宿主”。
就好比,你去电脑城买各种配件,CPU、显卡啊,硬盘等组装起来,得到的一台电脑就是物理机。它是实实在在的硬件。
2、虚拟机
所谓虚拟机(Virtual Machine): 就是通过软件方法利用一台物理电脑的硬盘和内存可虚拟出若干台机器。
它是电脑中的电脑,是利用软件虚拟出来的计算机,是在现有的操作系统上虚拟出来的一个完全隔离环境中的完整计算机系统。
虚拟机(Virtual Machine)技术: 就是通过软件工具模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
利用这种技术,可以在现有的计算机的操作系统中建立多个同构或异构的虚拟计算机系统。这些虚拟计算机系统既包括自己虚拟的内存、CPU 处理器、硬盘、CD/DVD、网络适配器、USB 控制器、声卡、显示器等硬件设备,又可以安装或使用各种操作系统、软件工具等。
我们可以这么理解:虚拟机就是就是一个程序,模拟成电脑,能安装任何的操作系统。
即,一个物理硬件层抽象,用于将一台服务器变为多台服务器,管理程序允许多个 VM 在一台机器上运行,每个 VM 包含一整套操作系统,一个或者多个应用、必要的二进制文件和资源库,因此占用大量空间,启动也比较缓慢。
3、容器
容器技术是一种全新意义上的虚拟化技术,按分类或者实现方式来说,其应该属于操作系统虚拟化的范畴,也就是在由操作系统提供虚拟化的支持。
它是一个应用层的抽象,用于将代码和依赖资源打包在一起,多个容器可以在一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行,与虚拟机相比,容器占用空间较少,秒钟就能完成启动。
4、小结
我们可以通过虚拟机和容器技术的剖析图来进行分析,就更加容易从直观上对两者的区别进行理解。
容器由于没有了虚拟操作系统和虚拟机监视器这两个层次,大幅减少了应用程序运行带来的额外消耗。
- 容器 是一个应用层抽象,用于将代码和依赖资源打包在一起。 多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行 。与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动 。
- 虚拟机(VM)是一个物理硬件层抽象,用于将一台服务器变成多台服务器。 管理程序允许多个 VM 在一台机器上运行。每个 VM 都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且 VM 启动也十分缓慢 。
- 虚拟机和容器有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而 Docker 通常用于隔离不同的应用 ,例如前端,后端以及数据库。
| 特性 | 虚拟机 | 容器 |
|---|---|---|
| 隔离级别 | 操作系统级别 | 进程级 |
| 隔离策略 | 运行于 Hypervisor 上 | 直接运行在宿主机内核中 |
| 系统资源 | 5-15% | 0-5% |
| 启动速度 | 慢,分钟级 | 快,秒级 |
| 占用磁盘空间 | 非常大,GB-TB 级 | 小,KB-MB |
| 并发性 | 一台宿主机十几个,最多几十个 | 上百个,甚至上百上千个 |
| 高可用策略 | 备份、容灾、迁移 | 弹性、负载、动态 |
五、Docker 的基本组成之前言
1、Docker 服务端和客户端
在对 Docker 的基本组成讲解之前,我们需要明白的是Docker 是一个客户端-服务端(C/S)架构程序。
不明白什么是 C/S 架构对吧,我这里就简单说明下,一般来说,应用程序架构分为两种:
| 客户端-服务端(C/S) | 浏览器-服务端(B/S) |
|---|---|
| 客户端-服务端(C/S) : Client - Server(C/S) = 客戶端 - 服务器。 |
例如: QQ,迅雷,快播等。夜深人静的时候,你躲在被子里,用自己安装的快播神器看不知名的大片,快播软件就需要和服务器进行通信,服务器源源不断的把各种画面信息返回给快播神器。
这种需要安装软件才能与服务器进行数据通信的方式就是 C/S 架构。
C/S 系统结构
浏览器 - 服务端(B/S) : Browser - Server(B/S) = 浏览器 - 服务器。
例如:所有的网站都是 B/S 架构,你找你朋友,借一步说话,要了个网址,直接浏览器输入就可以乐呵呵的看不知名的大片。这种不需要安装软件,直接有个网址就能看片的方式就属于 B/S 架构。
B/S 系统结构
总的来说,C/S 每一个客户端都必须安装和配置专用的软件。B/S 最大的优点就是不用安装任何专门的软件,只要有一个浏览器就可以。
docker 引擎是一个 c/s 结构的应用。Docker 客户端只需要向 Docker 服务端或者守护进程发出请求,服务端或者守护进程完成所有工作返回结果主要组件见下图:
- Server 是一个常驻进程
- REST API 实现了 client 和 server 间的交互协议
- CLI 实现容器和镜像的管理,为用户提供统一的操作界面
六、Docker 的基本组成
我们可以知道 Docker 使用的是 C/S 架构,Client 通过接口与 Server 进程通信实现容器的构建,运行和发布。client 和 server 可以运行在同一台集群,也可以通过跨主机实现远程通信。
镜像(image):
Docker 镜像就是一个只读的模板,可以通过这个模板来创建容器。一个镜像是可以创建多个容器的,就好像 java 里的类和对象一样,类是镜像,容器是对象。
容器(container):
Docker 利用容器来运行应用。容器是从镜像创建而来的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
仓库(repository):
仓库就是存放镜像的地方,分为公有仓库(Public)和私有仓库(Private)两种形式,其中官方仓库 Docker Hub 是国外的。
而国内很多公司,像阿里云,华为云等都有自己的容器服务,Docker 默认使用的是国外的仓库,我们在国内访问就很慢,所以我们在学习的时候就需要配置镜像加速。
上面的介绍,我想可能对于刚刚学习 Docker 的老铁来说,有点生涩难懂,我刚刚学习 Docker 的时候也是一样。不过没关系,我举个通俗的例子讲解:
我们需要注意的是 Docker 本身并不是容器,它只是创建容器的工具,是应用容器引擎。
要想搞明白 Docker,只需要知道两点即可:
第一点,Build, Ship and Run 译为:构建镜像,运输镜像,运行镜像
Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等等资源。 Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样。 Run (运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方。
举个例子: 我爹年纪大了,想回老家盖房子,我们来到老家,找了平时比较热闹的地方,买了块地基准备盖房,于是我和我爹搬水泥,石头,各种材料,费了九牛二虎之力终于盖好房子了。
结果,住了一段时间,我爹说这儿太吵了,想换个清静地方。按照传统的办法,我们只能再次搬石头、砍木头、画图纸、盖房子。但是,哆啦 A 梦从百宝袋里掏出一个魔法棒,可以把我和我爹盖的房子,打包做成“镜像”,放在我的背包里。
等我到了安静的地方,找块空地,就用这个“镜像”,复制一套房子,摆在那边,拎包入住。所以 Docker 的第二点就是:Build once ,Run anywhere 译为: 一次搭建,到处能用。
从上面的例子,放在我包里的镜像就是 Docker 镜像,而我在安静的空地,用魔法棒复制的一套房子就是一个Docker 容器,我的背包,就是 Docker 仓库。
既然,我和我爹盖的房子可以打包做成镜像,那么别人房子也可以做成镜像,这样一来,我们是不是就可以直接住各种豪宅,岂不美滋滋。这么多房子做成的镜像,那就得需要一个大的包来装,于是乎,这个大包就变成了专业术语里的仓库(repository)。
因此,官方提供了一个 Docker Hub 给大家进行共享房子镜像,当然你也可以搞私有仓库,独乐乐,不共享自己的房子镜像给别人。
好了,今天就聊这么多。
也算是详细的让大家对云计算基础技术之Docker。
了解了解。
祝各位终有所成,收获满满!