软件研发

虚拟化技术之容器与 Docker普及贴

2023-05-20 08:50:11 | 来源:企业IT培训

在云计算中,所谓的虚拟化技术一般可以分为虚拟机技术和容器技术,虚拟机即为Virtual Machine,VM,容器即为Container。那么什么是Docker 虚拟化技术呢?我们一起来看一下:

Docker是一种轻量级的虚拟化技术,相较于传统虚拟机,Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件的基础上,虚拟出自己的系统,再在系统上部署相关的APP应用。同时是一个开源的应用容器运行环境搭建平台,可以让开发者以便捷方式打包应用到一个可移植的容器中,然后安装至任何运行Linux或Windows等系统的服务器上。

相较于传统虚拟机,Docker容器具有以下三大特点:

1、轻量化:

一台主机上运行的多个Docker容器可以共享主机操作系统内核;启动迅速,只需占用很少的计算和内存资源。

2、标准开放:

Docker容器基于开放式标准,能够在所有主流Linux版本、Microsoft Windows以及包括VM、裸机服务器和云在内的任何基础设施上运行。

3、安全可靠:

Docker赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台主机。

让我们通过回顾部署方式的过程,看看为什么容器如此有用。

一、应用部署方式经历的各个阶段

1. 传统部署阶段

早期,我们在物理服务器上运行应用程序。没有办法为物理服务器中的应用程序定义资源边界,这导致了资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,从而导致其他应用程序性能不佳。解决方案是在不同的物理服务器上运行每个应用程序。但由于资源未得到充分利用,这种方法无法扩展,而且组织维护许多物理服务器的成本很高。

传统模式部署最大的问题是造成资源浪费。

2. 虚拟化部署阶段

在虚拟化技术被引入后,虚拟化技术允许我们在单个物理服务器的 CPU 上运行多个虚拟机(VM)。虚拟化允许应用程序在虚拟机之间隔离,不仅避免了资源冲突而且还能提供一定程度的安全性,因为一个应用程序的信息不能被另一个应用程序自由访问。

虚拟化允许我们更好地利用物理服务器中的资源,有更好的可伸缩性,因为可以轻松地添加或更新应用程序,降低硬件成本等等。通过虚拟化技术,我们可以将一组物理资源表示为一次性虚拟机的集群。

每个VM都是在虚拟化硬件之上运行所有组件(包括自己的操作系统)的完整机器。

3、容器化部署阶段

容器类似于 VM,但它们具有松散的隔离属性,以便在应用程序之间共享操作系统。容器的本质是进程(使用了 NameSpace 做隔离,Cgroups 做限制, rootfs 做文件系统的特殊进程),因此,容器被认为是比 VM 更加轻量级的。与虚拟机类似,容器有自己的文件系统、CPU共享、内存、进程空间等。由于它们与底层基础设施分离,所以它们可以跨云和操作系统版本移植。

容器技术可以达到企业脱离云厂商的强制绑(绑)定(架)。

二、容器的作用有哪些?解决了现实中的哪些问题

广泛对容器归纳总结为:

1、容器是一种基于操作系统能力的隔离技术。

2、容器的本质是一组收到资源限制,彼此之间相互隔离的过程。

容器共享宿主机的内核,资源占用小,轻量化,对应用有好。

3、Docker 是目前主流的容器化工具,Kubernetes(k8s) 是主流的容器编排管理工具。

4、Docker 是基于Linux 内核的2项功能实现的:

Namespace:

我们知道 Linux 中的PID、IPC、网络等资源是全局的,而 Namespace 机制是一种资源隔离方案,在该机制下这些资源就不再是全局的了,而是属于某个特定的 NameSpace,各个 Namespace 下的资源互不干扰,这就使得每个 Namespace 看上去就像一个独立的操作系统一样,但是只有 Namespace 是不够。

Control groups:

虽然有了 NameSpace 技术可以实现资源隔离,但进程还是可以不受控的访问系统资源,比如 CPU、内存、磁盘、网络等,为了控制容器中进程对资源的访问,Docker 采用 control groups 技术(也就是cgroup),有了 cgroup 就可以控制容器中进程对系统资源的消耗了,比如你可以限制某个容器使用内存的上限、可以在哪些 CPU 上运行等等。

容器解决了什么问题:

其实通过开始 应用部署方式的变革历程 讲解的内容就可以归纳总结容器主要解决的问题(也是其好处):

1、解决了上线流程繁琐问题

2、解决了资源利用率低问题

3、解决了扩容 / 缩容 不及时问题

4、解决了服务器环境臃肿问题

5、解决了环境不一致问题

三、虚拟机和容器的区别

虚拟机

虚拟机(VM)最恰当的描述是效仿物理硬件或计算系统功能的软件程序。它运行在名为管理程序的仿真软件之上,通过软件环境复制底层物理硬件资源的功能。这些资源可以称为东家机(host machine),而在管理程序上运行的虚拟机通常称为宾客机(guest machine)。

容器

容器化在操作系统级别创建抽象概念,以便应用程序的单个模块化功能可用独立运行。因此,几个孤立的工作负载 — 容器 — 可以使用相同的物理资源动态运行。容器不太严格的技术定义可以是:一个软件单元,虽然是轻量级的,但仍可将代码、其依赖项和配置完全捆绑到一个映像中。

Namespaces是 Linux 中的一个高级概念,每个 Namespaces 都有自己的独立资源,而不需要底层硬件的实际分区。Namespaces 用于虚拟化底层操作系统。

总结

虚拟机:

提升服务器资源利用率

提供一个完全隔离的环境(OS级别)

容器:

容器提供一个基本的独立环境,实现容器隔离、资源限制。

容器主要解决应用层面的问题,达到应用快速部署、高效管理。

个人感觉我们不应该单纯的进行虚拟机和容器来对比,因为从我们上述的总结与对比中可以发现:

他们的侧重目的点和作用不同,之所以被大家拿出来对比,因为他们都是虚拟化的手段。

其实在云平台中,我觉得下面这个图(图片由bluetata原创转载请注明出处)更能体现 虚拟机和 容器的关系,他们是相辅相成相互合作的,有着不同的分工:

如果要真拿虚拟机和容器进行对比的话,总结起来的对比表格可以参照如下:

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

Docker项目只是容器技术的其中一种实现,因为它是管理容器的最流行的工具,所以成为了容器技术的代名词,其他著名的容器工具还包括:rkt、Podman、LXC、containerd、Buildah 等。

Docker 使用客户端-服务器 (C/S) 架构模式,也就是分为客户端(Client)和服务端(Server)。

Docker 主要的架构组成如下:

1. Docker Client 客户端

Docker Client 通过命令行或者其他工具使用 Docker API/SDK与 Docker daemon 通信。例如:当使用docker run 命令时,Docker Client 将其发送到 dockerd 来实现相应的功能。

总结起来 Docker Client 客户端的一些特征

Docker Client 可以与多个 Docker daemon 进行交互。

Docker Client 客户端通过命令行或者其他工具使用 Docker API。

Docker Client 客户端和服务器通过 Socket 或 RESTful API 进行通信。

Docker Client 客户端可以连接本地或者远程的守护进程。

2. Docker Host 主机

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

3. Docker Daemon 守护进程

Docker daemon (dockerd) 监听 Docker API 请求并管理 Docker 对象,如镜像、容器、网络和卷。

例如:接收并处理 docker client 发送的请求。daemon 在后台启动一个server,server 负责接受docker client 发送的请求;接受请求后,server 通过路由与分发调度,找到相应的 handler 来执行请求。

4. Docker Container 容器

类似于一个轻量级的沙盒,可以将其看作一个极简的 Linux 系统环境(包括 root 权限、进程空间、用户空间和网络空间等)。基于 Docker 镜像被创建,镜像是静态的定义,容器是镜像运行时的实体;容器可以被创建、启动、停止、删除、暂停等。容器是独立运行的一个或一组应用。

5. Docker Images 镜像

Docker镜像里包含了打包的应用程序及其所依赖的环境、可用的文件系统和其他元数据。Docker 镜像是用于创建 Docker 容器的模板。

6. Docker Registry 仓库

仓库用来存储 Docker 镜像,分为公有仓库和私有仓库。可以上传镜像到一个镜像仓库,然后下载到另外一台电脑上并运行它。

Docker Hub 是一个 Docker 官方维护的公共仓库,Docker 默认从 Docker Hub 来查找镜像。我们也可以维护自己私有的镜像托管服务。

使用docker pull或docker run命令时,所需的图像将从配置的仓库中提取。使用该docker push命令时,会将镜像推送到配置的仓库中。

(1)作为云主机使用

相比虚拟机来说,容器使用的是一系列非常轻量级的虚拟化技术,使得其启动、部署、升级跟管理进程一样迅速,用起来灵活又感觉跟虚拟机一样没什么区别,所以有些人直接使用 Docker 的 Ubuntu 等镜像创建容器,当作轻量的虚拟机来使用。

(2)作为服务使用

如果你仅仅把 Docker 容器当作一个轻量的固定虚拟机用,那其实只能算是另类用法,Docker 容器最重要价值在于提供一整套平台无关的标准化技术,简化服务的部署、升级、维护,只要把需要运维的各种服务打包成标准的集装箱,就可以在任何能运行 Docker 的环境下跑起来,达到开箱即用的效果,这个特点才是 Docker 容器风靡全球的根本原因。

Web应用服务

持续集成和持续部署

(3)微服务架构使用

如果说上面两种应用场景还不足以体现出与传统的 PaaS 平台相比的巨大优势的话,那么对微服务的架构这种复杂又灵活的使用场景的无缝支持绝对具有革命意义。

微服务架构将传统分布式服务继续拆分解耦,形成一些更小服务模块,服务模块之间独立部署升级,这些特性与容器的轻量、高效部署不谋而合。

四、企业如何实施容器

企业不必羞于向工具池中添加容器。想要利用它?以下是开始利用容器的一些方法:

1、洞悉您的当前环境。分析您的应用,核查最适合它们的环境。您是重构现有应用还是构建全新应用?如果您对重构感兴趣,请从无需与其他应用交互便可运行的独立应用入手。

2、培养推广者。贵组织中的某个人(或很多人)可能都对容器化策略有自己的一两个想法。与他们交谈,向他们学习,并考虑让他们成为这项活动的推广者。

3、指定一个项目。确定一个起步的小项目,指定项目组,并设立大致的项目目标。评估沿途的变化。

4、鼓励参加培训。学好新技术需要一定的时间。考虑参加相关课程培训,或者至少给开发者留出专门的学习时间。

如果企业希望借助DevOps来加速连续发布基于微服务的分布式应用功能,则会继续加大容器化投资,尤其是在无法依靠虚拟化实现该等目标的领域。

点击了解相关课程——虚拟化容器技术Docker+K8s