草庐IT

[ 云原生 | 容器 ] 虚拟化技术之容器与 Docker 概述

bluetata 2023-04-19 原文

(借用老东家 Youtube 上的一张图)

在云计算中,虚拟化技术一般可以被分为两类,分别是虚拟机(VM,Virtual Machine)技术以及容器(Container)技术,这里我们只讲云原生中 Docker 虚拟化技术。

文章目录

一、应用部署方式的变革历程

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

图片来源于: [kubernetes.io](https://kubernetes.io/docs/concepts/overview/)

1. 传统部署阶段

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

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


2. 虚拟化部署阶段

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

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

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


3. 容器化部署阶段

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

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


二、为什么要用容器?容器解决了什么问题

容器概述

广泛对容器归纳总结为:

  • 容器是一种基于操作系统能力的隔离技术。
  • 容器的本质是一组收到资源限制,彼此之间相互隔离的过程。容器共享宿主机的内核,资源占用小,轻量化,对应用有好。
  • Docker 是目前主流的容器化工具,Kubernetes(k8s) 是主流的容器编排管理工具。
  • 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. 解决了环境不一致问题


三、虚拟机 vs. 容器

广泛被大家使用的虚拟机和容器的对比图:

虚拟机

如果我们仔细观察虚拟机是如何在物理硬件上构建的,就会发现在物理硬件和操作系统之间有一层 Hypervisor,从更广泛的角度来看,Hypervisor 用于对硬件进行虚拟化,然后按照用户希望的方式对硬件进行配置。


容器

与虚拟机不同(虚拟机管理程序将物理硬件划分为多个部分),容器就像普通的操作系统进程。现在的问题是,如果容器就像普通进程,那么它是如何与其他进程隔离的呢?这就是 Namespaces 出现的地方。

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

由于容器只是操作系统进程,这就是为什么提升一个容器需要几秒钟,而提升一个虚拟机需要几分钟的原因。


总结

  • 虚拟机

    1. 提升服务器资源利用率
    2. 提供一个完全隔离的环境(OS级别)
  • 容器

    1. 容器提供一个基本的独立环境,实现容器隔离、资源限制。
    2. 容器主要解决应用层面的问题,达到应用快速部署、高效管理。

个人感觉我们不应该单纯的进行虚拟机和容器来对比,因为从我们上述的总结与对比中可以发现,
他们的侧重目的点和作用不同,之所以被大家拿出来对比,因为他们都是虚拟化的手段。

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


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

容器 Container虚拟机 VM
启动速度秒级分钟级
运行性能接近原生5%左右损失
磁盘占用MBGB
数量成百上千一般几十台
版本控制镜像 Images 可以保存差异,可以进行版本控制。Dockerhub 类似于 GitHub没有有效的差异,没有版本控制
隔离性进程级系统级(更底层)
操作系统主要支持 Linux几乎所有
封装程度只打包项目代码和依赖关系,共享宿主机内核完整的操作系统

四、Docker 概述

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

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


五、Docker 基本组成

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

Docker 主要的架构组成如下(图片由bluetata原创转载请注明出处):

(架构图参照于官方架构 https://docs.docker.com/get-started/overview/)

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 pulldocker run命令时,所需的图像将从配置的仓库中提取。使用该docker push命令时,会将镜像推送到配置的仓库中。


六、Docker 应用场景

1. 作为云主机使用

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


2. 作为服务使用

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

  • Web应用服务
  • 持续集成和持续部署

3. 微服务架构使用

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

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


七、Docker的相关资源

Docker 官方主页:http://www.docker.com/
Docker 引擎的 GitHub 源代码:https://github.com/moby/moby
Docker Hub:https://hub.docker.com/
Docker CLI:https://github.com/docker/cli
Docker Forge(收集了各种Docker工具、组件和服务):https://github.com/dockerforge
Docker 官方博客:https://www.docker.com/blog/
Docker 的IRC频道:irc.freenode.net
Docker 的StackOverflow问答主页:https://stackoverflow.com/questions/tagged/docker


八、参考文献


:本文原创由 bluetata 发布于: https://bluetata.blog.csdn.net/ 转载请务必注明出处。


有关[ 云原生 | 容器 ] 虚拟化技术之容器与 Docker 概述的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  3. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  4. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  5. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  6. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  7. ruby-on-rails - 用于门户的 Ruby 技术 - 2

    我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它

  8. iNFTnews | 周杰伦18年前未发布的作品Demo,藏在了区块链技术里 - 2

    当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在

  9. 【云原生】SpringCloud-Spring Boot Starter使用测试 - 2

    目录SpringBootStarter是什么?以前传统的做法使用SpringBootStarter之后starter的理念:starter的实现: 创建SpringBootStarter步骤在idea新建一个starter项目、直接执行下一步即可生成项目。 在xml中加入如下配置文件:创建proterties类来保存配置信息创建业务类:创建AutoConfiguration测试如下:SpringBootStarter是什么? SpringBootStarter是在SpringBoot组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种SpringBootStarter包可以快速搭建出一

  10. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

随机推荐