「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战
作为一个 Java 开发人员来说,虽然在大厂里边都有专门的运维人员或者中间件团队去维护我们的一个容器化部署环境,或者是虚拟机的线上部署环境,不用我们 Java 的业务研发或者工程研发去操心和负责。
大部分大厂里边都是采取了云模式开放给我们内部的一些 Java 研发人员,通过可视化页面的方式就能够完成线上的一个部署。
但是如果说你是面试大厂,并且要被大厂定义为你是一个有能力、有潜力、可以有未来培养价值的、全面性的人才的话,你应该掌握一些容器化部署,例如 Docker、K8S。Docker 和 K8S 已经逐渐成为了互联网程序员的一个标配的一个容器化部署节奏。
因此如果说你对容器化的部署有一定的了解,并且可以设身处地的去做一些操作和实践,融入到你的项目的过程当中,在面试的过程当中,和你的面试官侃侃而谈对应的这些内容,无疑是会给你的面试做加分项。
试想一下,如果说你的部门经理手上有两个候选人,他们的基础能力、高并发以及微服务的理念、技能都差不多,沟通潜力也都差不多的时候,作为一个 Java 的程序员能够拥有容器化部署相关的一些经验,而另一个可能几乎都只能依赖运维的同事跟他配合,才能完成一些工作,你的部门经理会选择性价比更高的你来作为这样的一个岗位的候选人。
接下来我们来看一下容器化部署和云原生相关的一些内容和知识。
你作为一个 Java 面试大厂的一个程序员,并不一定需要对容器化部署的一个方方面面有做特别细节的了解,因为毕竟你是面试的业务工程之类的一个研发,并非运维类的一个研发。
因此对容器化部署相关的环节,如果说你有精力、有时间,可以去跟着官方文档做细节的一个学习。但如果说你是为了准备一些面试,或者只是想要了解一些大致的概念,需要去抓住容器化部署和云原生的一些核心,到网上看一些博客即可。
docker 已经成为容器化部署一个核心技术,Docker 本身它的核心技术是什么?
我们都知道,Docker 本身的话是可以去隔离操作系统的各种环境,使得你的应用程序运行在一个独立的容器空间内。
既然有这样的隔离性,势必会做了三层隔离能力的管理,最简单的一个能力的管理就是基于 namespace 命名空间,命名空间是 linux 最新的操作系统上面提供给我们的一个能力,能够将进程、用户、网络、进程内的 IPC 通信以及 UTS 等这样的一些基础内容通过命名空间去做隔离。这样的话,我们不同的 Docker 容器运行在不同的命名空间里边,这样就造成了这些 Docker 容器内的一个进程是可以做到完完全全的一个隔离,包括它的进程、用户以及网络等等相关的。
容器化部署的 Docker 最核心的一项技术,就是其利用了操作系统的一个命名空间,隔离了虚拟机内的一个不同的一个进程。
CGroups 主要是控制组去限制硬件的资源。假设我们买了一台物理机,一共有 64 个核,256G 的内存。很显然,我们在运行 Docker 容器的时候,每一个容器需要去限制它的一个硬件资源。例如我们一般会需 4 核 8G 为一个单元去给我们的业务进程所使用。因此 CGroups 主要是用来限制你作为这个容器的一个进程,能够使用的一个硬件的资源是怎么样的。
UnionFS 主要是做了镜像的管理,Docker 之所以可以发展得那么好,并不在于说其本身的技术的特点有多少,而是在于其提供的内容社区。在内容社区里有类似于 Maven 样子的一个 repository去做定向的一个管理。比如我们需要使用 MySQL 部署在 Docker 内,我们无需自己去开发一个 MySQL 的 Docker,而是使用官方提供的 MySQL 镜像,就可以完成 Docker-MySQL 的一个部署和管理。
当然如果我们要做 Spring Book 相关的一个应用,很显然我们需要依赖于 Java 这样的一个虚拟环境去做启动。我们无需对 jdk 做这样的一个镜像,官方已经提供给我们了 jdk 版本的一个镜像,我们只需要在这个镜像的基础上加上我们 Spring Book 以及我们的应用程序所特有的一些内容和命令,就可以做成我们自己的一个 Spring Book 的相关的一个镜像。整个 UnionFS 提供给我们了镜像的管理和制作的一个叠加的能力。
因此 Docker 的一个核心技术就在于 NameSpace 控制进程的命名空间,CGroups 限制硬件的资源以及 UnionFS 做了可以配置化的一个叠加式的一个镜像管理,帮助我们最简化的去开发我们应用。
我们常见的面试官经常会问的一个问题是,我们的容器 Docker 与虚拟机的区别到底是什么?
其实容器 Docker和虚拟机的一个区别有很多,而且都深入到操作系统内部的一些核心调度上,比如 Docker 的一个NameSpace 、CGroups 以及 UnionFS 体系。
但是本质上来说,我们只需要记住,容器 Docker 与虚拟机的本质区别是 Docker 相当于是运行在你操作系统上的一个进程,而虚拟机是整个的一个操作系统。如果我们需要使用虚拟机去做虚拟化的环境,我们必须得要在我们的一个操作系统上面安装虚拟软件,然后整个的这样的一个虚拟软件需要启动整个的一个内核级别的操作系统。这些内核级别的操作系统,下至对硬件资源的一个驱动和管理,上至应用程序以及 GUI 都是整个的一套完整的系统,因此无论它的启动时间、占用的资源以及对应的一个通信过程都是非常的繁琐、非常的缓慢。
而 Docker 本身就是运行在你操作系统上的一个进程而已,它跟你普通的用户程序没有任何的区别,仅仅只是它的用户程序内会去控制一个 NameSpace、CGroups 和启动 UnionFS,因此它的启动时间是非常的快的,一般来秒级别的启动时间就够了,而且他对资源的占用以及整个的内核态的一个管理是非常轻量级。因为 Docker 本质与一个用户进程没有任何的区别。