从船舶运输的发展史说起,容器何以与微服务成为「好搭档」【容器学习】
前言
带着对技术学习的兴趣,打开了推荐的《容器入门》的课程,想对容器有一个基础的了解,一口气炫完课程。
先简单说一下学习感受,内容通俗易懂,从容器历史出发,带着讲故事的趣味性,让我感受到学习的乐趣同时也逐渐进入学习的状态。这种渐入佳境的学习感觉还是很赞的。
整个课程的内容不是特别多,但是关于容器的基础知识点、特定技术和在微服务架构中的重要性,讲的很明白。
课程介绍图
课程介绍中对课程内容归纳的很好。
容器
接下来分享我再学习过程中,产出的学习笔记。三个标题,带着三个问题,我们一起来探索一下容器世界里有哪些知识点。
什么是容器?
历史的演变
相似的事物通过归纳总结,总能找出规律,容器也不例外。
从船舶运输货物讲起,早起盛放货物的容器,船员在完全装满船只之前无法得知到底能装下多少货物。这使得效率低下,运输成本增加。
随着历史的演进,集装箱的出现,改善了船舶上货物的装卸。提高了效率降低了成本
通过现实世界中容器的演变历史,来总结一下计算平台中的容器。
容器简介
容器是一种标准化软件单元。它可在运行容器化平台的任何计算环境中快速可靠的运行。是操作系统级别实施的一种形式的虚拟化。
容器内容图
由这种图片可以更加具象的了解容器所含的内容。
容器是独立的轻量级软件包,包括运行应用程序所需要的一切。例如代码、系统 工具、系统库和设置等。
容器可以是在大型企业应用程序中的服务,也可以是在隔离环境中运行的独立应用程序。
容器与其他形式的虚拟化的区别?
虚拟化分类
课程中列举的其他形式的虚拟化主要有裸机服务器和虚拟机,如下图是三者的对比:
虚拟化分类对比
三者的优缺点对比如下:
类型 |
缺点 |
优点 |
裸机服务器 |
1.所有应用程序需要保持同步,不一致时会导致报错; 2.物理空间占用较多、利用率低。 |
复杂性低 |
虚拟机 |
1.虚拟化层较多,导致更新和补丁数量增多; 2.冗余增加,相似的操作系统需要多次安装。 |
利用率较高,且物理空间占用较少 |
容器 |
1.轻量级、高效; 2.启动和关闭速度快; 3.按需共享库,更加灵活; 4.可移植度高 |
复杂性增加 |
这个对比,是跟着课程讲解总结的,如果有不正确的地方欢迎指正。
容器化
容器化不是新概念,它经历了一系列的演变。
Docker
Docker 容器,一种轻量级容器虚拟化平台。可以提供创建、存储、管理和运行容器的工具。
轻松与自动构建、测试和部署管道相集成。
Docker 优势
- 可移植的运行时应用程序环境;
- 可将应用程序和依赖项打包进单一的不可变构件中;
- 能够同时运行具有不同依赖项的不同应用程序版本;
- 更快的开发和部署周期;
- 提高资源利用率和效率。
Docker 代码示例
简单示例
容器启动后会回显 "Hello world"
FROM ubuntu:latest
CMD echo "Hello world"
复杂示例
下面这段代码演示如何运行 Java 应用程序。从使用OpenJDK 8映像开始,将包含代码的.jar文件从系统复制到容器中,对此容器进行实例化后,它将运行该 Java 应用程序。
FROM openjdk:8
COPY /hello.jar /usr/src/hello.jar
CMD java -cp /usr/src/hello.jar
org.example.App
Dockerfile 示例
下面这段代码是一个更为真实的 Dockerfile 示例,从 CentOS 7 映像开始,进入更新操作系统并安装 Apache的步骤,最后复制应用程序的 Shell 脚本并授予它可执行权限。
实例化容器后,命令会运行该 Shell 脚本。
FROM centos:7
RUN yum -y update && yum -y install httpd
EXPOSE 80
ADD run-http.sh /run-http.sh
RUN chmod -v +x /run-http.sh
CMD ["/run-http.sh"]
这里展示了分层形式,Dockerfile 中的每条指令都会创建一个层。这些层都是只读的,因此容器映像是不可变对象。与其他虚拟技术相比,这也是帮助容器映像实现轻量化小型和快速的因素之一。
OpenJDK相关知识点可以看这篇文章。
Docker 镜像与容器
容器映象是高度可移植的不可变只读模板,可以将其移植到支持 Docker 的任何环境,也可将其存储在注册表中以便重复使用。
容器是映射的示例,可以基于该映像启动一个或多个容器。每个容器在其现有映像之上都用一个精简的读/写层。这使得快速启动容器成为可能。
多个容器可以共享对同一底层映像的访问,但同时仍具有独立的数据状态。
删除容器后,该可写层也会被删除。
容器的读/写层使您的应用程序能够在运行时保持正常运行状态。
为什么说容器在微服务架构中是重要的?
什么是微服务?
这几年微服务一词逐渐引起开发者们的兴趣和探讨,那么什么是微服务呢?
微服务是一种软件开发的架构和组织方法,旨在加快部署周期。
微服务相较传统架构,可以促进创新和所有权,提高软件应用程序的可维护性和可扩展性。
如图,传统架构和微服务架构的对比:
先来看传统架构。
对于每个应用程序,所有进程紧密耦合,这意味着,如果应用程序的一个进程遇到需求峰值,则必须扩展整个结构。随着代码库的增长,添加或改进功能变得更加复杂。这不仅限制了实验,还让实现创意变得困难。
整体架构还增加了应用程序可用性的风险。因为许多相互依赖和紧密耦合的进程,扩大了单个进程失败的影响。而且不难看出不同应用程序之间,在功能上有很多 冗余之处。
现在来看微服务架构。
如图,一共运行了三个相同的应用程序。每个应用程序都构建成为一个可作为服务运行的独立组件。并使用轻量级 API 操作进行通信。每个服务执行一个可支持多个应用程序的功能。所用服务都独立运行。因此可以对服务进行更新、部署和扩展以便满足对特定应用程序功能的需求。
还可以从专业服务器迁移到抽象硬件层,在抽象硬件层可以根据性能和弹性等需求智能地放置微服务。所有这些分解带来了更快的迭代、自动化和整体敏捷性。支持快速启动、快速失败和快速恢复。
微服务特性
- 采用分散式的革新设计;
- 智能终端节点、哑管道;
- 采用独立产品形式,而不是项目形式;
- 面向故障的设计;
- 可弃性;
- 兼顾开发与生产。
微服务架构中容器的重要性
在做了上面的了解之后,我们就明白为什么容器和微服务是「好搭档」。
容器是支持现代微服务架构的基础技术。
将微服务放置到容器中。容器占用的空间更少,启动速度也更快。借助微服务架构,开发人员可以充分利用容器。
去中心化的革新设计,每个容器都使用最适合服务运行的语言和技术,而不是要求用户使用特点的语言或特定的技术。
总结
先来对今天的笔记做个小结:
- 容器是是一种标准化软件单元。它可在运行容器化平台的任何计算环境中快速可靠的运行。是操作系统级别实施的一种形式的虚拟化。
- 相较于其他虚拟化的方式,容器拥有轻量级、高效,启动和关闭速度快,按需共享库、更加灵活,可移植度高等优点。
- Docker 容器,一种轻量级容器虚拟化平台。可以提供创建、存储、管理和运行容器的工具。具有高效移植、同时运行不同依赖不同版本的应用、缩短开发周期、提升资源利用率等优点。
- 微服务是一种软件开发的架构和组织方法,旨在加快部署周期。
- 容器和微服务是「好搭档」。容器是支持现代微服务架构的基础技术。将微服务放置到容器中。容器占用的空间更少,启动速度也更快。借助微服务架构,开发人员可以充分利用容器。
对容器的学习暂时告一段落,希望未来有机会可以通过学习提升更多有关容器的技能。
将收获转化成知识进行传播,也希望能够每一个阅读者带去帮助。
- 点赞
- 收藏
- 关注作者
评论(0)