引子
近几年来 , 容器化的概念正被广泛地应用到生产中去。
为什么容器化会这么火 , 如果有过一定运维经验的同学会明白 , 在传统的后端领域中 , 其痛点主要在于运维及发布的成本 , 环境的配置及差异会导致意料之外的状况 。 管理一个两个的机器环境是轻松惬意的 , 但管理一个集群的环境是复杂而又不稳定的 。 尽管我们可以通过自动化脚本来部署 , 其中仍然会带来一定部署问题 。
而容器化的横空出世给这些问题交出了一份满意的答卷 。 借由其虚拟化的特性 , 我们能搭建出一个完全一致的生产环境 。
同样 , 在前端大跃进的时代 , 由于中台 、 BFF 、 SSR 的概念也在不断进化迭代 , 而这些新的技术需要前端掌握一定的后端开发知识 , 我们也会遇到上述问题 。 很巧的是这些技术的爆发与容器化被广泛运用的时间碰撞在一起 。 我们也想着是否能让容器化与前端领域发生奇妙的化学反应 。 借着容器化的东风进行一次技术革命 。
容器是什么
容器其实也是一种虚拟化技术 。 这种技术将操作系统虚拟化 , 允许系统资源被分割成数个独立的单元 , 在内核中运行 , 这些独立的单元实例就称为一个容器 。
听起来是不是跟虚拟机很像 ?
从实现效果上 , 基本上是的 。 但从效率上容器化完虐虚拟机 , 我们要解释这个问题就得先了解一下虚拟化是什么
虚拟化是什么
虛擬化(技術)或虛擬技術(英語:Virtualization)是一種資源管理技術,是将计算机的各種實體资源(CPU、内存、磁盘空间、網路適配器等),予以抽象、转换后呈现出来並可供分割、組合為一個或多個電腦組態環境。
其主要分为 硬件虚拟化 、 软件虚拟化 。
硬件虚拟化是物理硬件本身提供了虚拟化支持 , 能将另一平台的指令集转换为自身支持指令集执行 。
软件虚拟化是通过一个中间层来翻译指令集, 将其转化为当前平台支持指令集执行 。
我们可以看到上述虚拟化技术的核心就是指令集转换 。
在开发者中非常熟悉的程序语言虚拟机也属于该范畴。它们也是基于虚拟化的思想。通过隔离应用程序与操作系统,将程序指令转换为当前操作系统所能执行的指令,达到 「 Write once, debug run anywhere 」 的目的。例如 Java ( JVM ) 、 PHP ( HHVM ) 、 JavaScript ( V8 ) 等等。这些语言都具有较强的跨平台性。
虚拟化能带给我们的好处十分明显 , 对于应用程序来说 , 我是唯一的运行程序 , 无须理会各种冲突问题 , 例如 : 端口冲突 、 依赖冲突 。还能做到跨平台兼容 。
QA
观众: 既然虚拟机那么优秀 , 那我们为什么还需要容器化啊 ?
但它带给我们的问题也非常明显 , 上面提到我们需要经过中间层处理进行指令集转换后 , 得到当前平台能执行的机器码 。 所有指令都要进行处理 , 导致了效率比较低下 。
观众:那你不是说容器也是一种虚拟化技术吗 ? 他就没这问题 ?
相对于传统的虚拟机 , 容器最大的优势还是在于容器运行性能远超其他虚拟化实现 。 运行在容器中的应用程序与运行在物理平台上的应用程序在运行性能上不相上下 。
那容器是通过什么方案解决了运行效率问题呢?
容器并不进行指令集转换 。 是的 , 处理一个问题的终极方案就是无视该问题或干掉提出该问题的人。也就是说容器本身并不是跨平台的 。 在上面运行的程序相对于直接运行在宿主机。
???
且慢 , 客官 。 听我娓娓道来 。
Docker
说到容器 , 我们第一个想到的会是 Docker , 作为容器界的当红炸子鸡 。
Docker 提供了 Window 及 Mac 客户端 。 既然上面提到容器技术本身不跨平台 , 那我们环境不还是不一致吗 ?还是说 Docker 解决了这个问题 ? 答案是并没有 , 在 Window 及 Mac 中的 Docker 是通过一个虚拟机来运行的 。 姑且算是解决了该问题吧 。
而我们使用容器的最大优势在于占用服务器资源少 , 启动速度快 ,资源分配隔离 , 快速扩容 , 实时迁移 。
前端
那我们究竟能用 Docker 做些什么呢 。
-
帮助我们统一环境。
此时 , 本地开发 、 CI 打包 、 测试及生产的环境将被统一 。 这点对于 Node 程序来说更是非常重要 。而容器每次运行都是新的环境 , 也不存在环境污染的问题 。对于团队内 Window 和 Mac 同时存在的队伍来说更是一剂良药 。从此告别 “ 我的电脑是正常的 ” 。
-
部署
借助容器的优势 , 我们还可以将 Node 程序打包为一个容器镜像 。 每个版本对应一个容器镜像 , 在回滚发布时 , 我们可以做到秒级响应 。
-
Kubernetes
K8s 联动 。拥抱未来 , 彻底摆脱各种部署问题 。
由于 Docker 本身内容十分多 , 计划分为
-
「 介绍 ( 是个啥能做啥 ) 」
就是这一篇
-
「 重要能力 ( 怎么实现的 ) 」
- 生命周期
- 操作
- 挂载
- 网络
- 镜像
- Dockerfile
-
「 实践 ( 别光说 , 做一个试试 ) 」
- 前端如何利用 Docker 协作
-
「 K8s 番外篇 ( CloudNative 的魅力 ) 」
- 善假于物之 Kubernetes 与 前端
由于是教程向 , 内容会较多 。 需要连载完成 , 喜欢的朋友可以点个在看关注一下 ~ 下篇文章不见不散
君子生非异也,善假于物也。
《荀子·劝学》