【Linux学习】Linux 的虚拟化和容器化技术

news2024/11/15 13:22:31

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶​
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客

系列专栏:xiaoxie的Linux学习系列专栏——CSDN博客●'ᴗ'σσணღ
我的目标:"团团等我💪( ◡̀_◡́ ҂)" 

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​+关注(互三必回)!

一.Linux 的虚拟化和容器化技术

1.二者的区别

Linux的虚拟化技术和容器化技术都是用来在单个物理服务器上运行多个独立工作负载的技术,但它们在实现方式、隔离程度、资源效率和适用场景等方面存在显著差异。

虚拟化技术

  1. 实现方式

    • 虚拟化技术使用Hypervisor(虚拟机管理程序)将硬件资源抽象化,为每个虚拟机(VM)模拟出完整的硬件环境,包括CPU、内存、硬盘、网卡等。
    • 每个虚拟机内部运行一个完整的Guest操作系统,它可以是任意类型的Linux发行版或其他操作系统(如Windows)。
  2. 资源隔离

    • 虚拟机之间完全隔离,互不影响,即使使用的内核版本、驱动程序等都可以不同。
    • 每个虚拟机都有自己的内核,这意味着更高的安全性和稳定性,但也意味着更大的资源消耗。
  3. 性能和资源利用率

    • 虚拟化会有一定的性能开销,因为 Guest OS 和 Hypervisor 都需要消耗计算资源。
    • 虚拟机启动相对较慢,并且磁盘I/O性能相对较低,因为它需要加载完整的操作系统镜像。

容器化技术

  1. 实现方式

    • 容器化技术如Docker和LXC等,在操作系统层面实现隔离,而不是硬件层面。
    • 容器内的应用运行在宿主机的操作系统内核上,通过Namespace、Control Groups(cgroups)、Union File Systems(如AUFS或OverlayFS)等技术,实现进程、网络、文件系统等资源的隔离。
  2. 资源隔离

    • 容器共享宿主机的操作系统内核,因此隔离不如虚拟机彻底。
    • 容器之间可以通过命名空间实现逻辑上的隔离,但如果有内核漏洞,可能会波及所有容器。
  3. 性能和资源利用率

    • 容器比虚拟机更轻量级,启动快速,停止单位时间内可以承载更多的服务实例。
    • 容器几乎没有性能开销,因为它并不需要启动一个完整的操作系统,从而极大地提高了资源利用率和性能。
  4. 应用场景

    • 虚拟机适用于需要高度隔离、异构环境部署或者需要特定操作系统版本的应用场景。
    • 容器更适合于云原生应用、微服务架构和持续集成/持续部署(CI/CD)流程,尤其是当应用需要频繁构建、测试和部署时。

总结来说,虚拟化技术主要用于提供强隔离和跨平台兼容性,而容器化技术则专注于快速部署、灵活扩展和高效资源利用,特别适应于现代云计算和微服务架构的需求。

下面以Docker作为容器化技术的代表,KVM作为虚拟化技术的代表,分别介绍它们的使用方法和示例代码。

二.Linux使用KVM实现虚拟化技术

1.什么是KVM

 KVM 是Linux内核的一部分,提供了基于硬件辅助的全虚拟化能力。它允许Linux成为一个宿主机操作系统,可直接运行多个客户机操作系统作为虚拟机实例。每个虚拟机拥有独立的虚拟CPU、内存、磁盘和其他设备。

二.实现代码

  1. 系统要求检查

    • 确保硬件支持虚拟化技术(如Intel VT-x或AMD-V)。
    • 使用 egrep '(vmx|svm)' /proc/cpuinfo 命令检查处理器是否支持虚拟化。
  2. 安装KVM软件包 在Debian/Ubuntu上:

    Bash
    1sudo apt-get update
    2sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

    在RHEL/CentOS上:

    Bash
    1sudo yum install qemu-kvm libvirt-daemon-driver-qemu libvirt-daemon-system virt-install bridge-utils virt-manager
  3. 启用并启动libvirt服务

    Bash
    1sudo systemctl start libvirtd
    2sudo systemctl enable libvirtd
  4. 创建虚拟机

    • 使用virt-manager图形工具创建新虚拟机,或者通过命令行工具virsh、virt-install等进行创建。
    • 创建虚拟机时会指定镜像文件、内存大小、CPU核心数、网络配置等参数。

3.注意事项:

  • 内核模块加载: KVM需要特定的内核模块才能工作,系统启动时应自动加载这些模块,例如kvm_intel或kvm_amd。如果不自动加载,可以通过以下命令手动加载:

    Bash
    1sudo modprobe kvm_intel # 对于Intel处理器
    2sudo modprobe kvm_amd  # 对于AMD处理器
  • 用户权限: 运行和管理虚拟机通常需要加入libvirt和kvm组,这样用户才能直接管理虚拟机:

    Bash
    1sudo usermod -aG libvirt $USER
    2sudo usermod -aG kvm $USER
  • 网络配置: 要使虚拟机能够联网,可能需要配置网络桥接或NAT网络,这通常涉及编辑网络接口配置文件或使用libvirt的网络管理功能。

  • 存储设置: 虚拟机的磁盘镜像文件应存放在合适的目录,并确保有足够的磁盘空间。

  • 安全考虑: libvirt提供了多种安全策略来限制访问和管理虚拟机,应当正确配置libvirt的访问控制列表(ACL)以确保安全。

虽然上述步骤描述的是基本的系统配置,但实际实现KVM虚拟化技术更多的是在Linux内核层面的架构和API调用,具体的实现代码位于内核模块和相关的用户空间工具中,对于普通用户而言,通常是通过调用libvirt API或使用其提供的工具间接实现对KVM的控制和管理。对于开发者而言,如果要直接操作KVM API,则需要深入了解内核虚拟化子系统和QEMU-KVM的相关接口。

 三.Linux使用Docker容器化技术

1.为什么使用Docker

在Linux上使用Docker容器化技术不需要编写大量的实现代码,而是通过Docker CLI命令行工具和Dockerfile来定义、构建和运行容器。

2.实现Docker容器的基本步骤:

步骤1:安装Docker

在Linux上安装Docker,请参照官方文档或对应Linux发行版的指南。例如,在Ubuntu 20.04上安装Docker的方式如下:

Bash

1sudo apt update
2sudo apt install docker.io
3sudo systemctl start docker
4sudo systemctl enable docker
步骤2:拉取镜像

要运行一个容器,首先需要有一个基础镜像。例如,拉取官方的Ubuntu镜像:

Bash

1sudo docker pull ubuntu
步骤3:编写Dockerfile

创建一个名为Dockerfile的文本文件,用于定义容器环境和所需的应用程序:

Docerfile

1# 使用官方的 Ubuntu 镜像作为基础镜像
2FROM ubuntu
3
4# 更新 apt 包索引
5RUN apt-get update && apt-get upgrade -y
6
7# 安装一个简单的应用,比如 curl
8RUN apt-get install -y curl
9
10# 设置默认的工作目录
11WORKDIR /app
12
13# 当容器启动时运行命令
14CMD ["curl", "https://example.com"]
步骤4:构建镜像

在包含Dockerfile的目录下,构建一个新的Docker镜像:

Bash

1sudo docker build -t my-ubuntu-app .
步骤5:运行容器

使用刚才构建的镜像启动一个新的容器:

Bash

1sudo docker run --name my-running-app -d my-ubuntu-app

3.注意事项:

 1.权限问题

默认情况下,非root用户无法直接运行Docker命令。为了允许非root用户使用Docker,你需要添加用户到docker组:

Bash

1sudo usermod -aG docker $USER

之后登出并重新登录,以便新的组成员生效。

  1. 端口映射: 如果容器内的应用监听了某个端口并且希望外部能访问,需要在运行容器时指定端口映射:

    Bash
    1sudo docker run -p 8080:80 my-web-server

    上述命令将容器内的80端口映射到主机的8080端口。

  2. 数据持久化: 容器的生命周期通常是短暂的,如果需要持久化数据,应使用数据卷(volumes):Bash

    sudo docker run -v /host/path:/container/path my-data-container

  3. 网络配置: 根据需求选择合适的网络模式,如bridge(默认)、host或自定义网络。

  4. 容器资源限制: 通过 -m 参数限制内存使用,通过 --cpus 参数限制CPU使用率。

  5. 安全实践: 尽量避免使用root用户在容器内部运行服务,使用最小权限原则;及时更新Docker和镜像以修复安全漏洞。以上仅是简单示例,实际使用Docker时可能涉及到更复杂的镜像构建、多阶段构建、Compose文件编排、Swarm集群管理等内容。

通过以上示例代码,我们可以看到Docker容器化技术和KVM虚拟化技术的使用方法。在选择合适的技术方案时,需要综合考虑需求、资源消耗和隔离性要求等因素。最终选择哪种技术方案取决于具体的业务需求和资源条件,每种技术都有自己的优势和适用场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1568563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进阶线段树之乘法线段树

1.乘法线段树 顾名思义,就是其中的区间修改为乘法,但是呢,如果只是一个乘法,把之前的加号变成*号,然后开long long即可(因为乘法的数据超大,如果不在中间mod点儿东西还能直接超出64位&#xff…

【Java EE】Maven jar 包下载失败问题的解决方法

文章目录 1. 配置好国内的Maven源1.1配置当前项⽬setting1.2设置新项⽬的setting 2.重新下载jar包3.其他问题⭕总结 1. 配置好国内的Maven源 因为中央仓库在国外, 所以下载起来会⽐较慢, 所以咱们选择借助国内⼀些公开的远程仓库来下载资源 接下来介绍, 如何设置国内源 1.1配…

Java集合(个人整理笔记)

目录 1. 常见的集合有哪些? 2. 线程安全的集合有哪些?线程不安全的呢? 3. Arraylist与 LinkedList 异同点? 4. ArrayList 与 Vector 区别? 5. Array 和 ArrayList 有什么区别?什么时候该应 Array而不是…

Spring Boot Mockito (二)

Spring Boot Mockito (二) 基于第一篇Spring Boot Mockito (一) 这篇文章主要是讲解Spring boot 与 Mockito 集成持久层接口层单元测试。 1. 引入数据库 h2及其依赖包 <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId…

C语言----数据在内存中的存储

文章目录 前言1.整数在内存中的存储2.大小端字节序和字节序判断2.1 什么是大小端&#xff1f;2.2 练习 3.浮点数在内存中的存储3.1.引子3.2.浮点数的存储3.2.2 浮点数取的过程 前言 下面给大家介绍一下数据在内存中的存储&#xff0c;这个是一个了解c语言内部的知识点&#xf…

动规训练3

一、按摩师 1、题目解析 简而言之就是&#xff0c;找到一个按摩师的预约总是长的最长方案&#xff0c;还有一个限制条件&#xff0c;选取的预约两两不相邻。 2、算法原理 a状态表示方程 小技巧&#xff1a;经验题目要求 dp[i]表示以这个节点为结尾&#xff0c;最长的预约时…

【C语言】翻译环境与运行环境

一、前言 在我们学习C语言的时候&#xff0c;第一个接触的程序就是&#xff1a;在屏幕上打印” hello word! “&#xff0c;可当时的我们却未去深入的理解与感悟&#xff0c;一个程序代码是如何运行的&#xff1b;而这一期的博客&#xff0c;则是带着我们&#xff0c;通过C代码…

Python | SLP | EOF | 去除季节趋势

EOF & PC 前言 在计算EOF&#xff08;经验正交函数&#xff09;之前去除季节循环是为了消除数据中的季节变化的影响&#xff0c;使得EOF能够更好地捕捉数据中的空间变化模式。如果不去除季节循环&#xff0c;季节性信号可能会在EOF中占据较大的比例&#xff0c;从而影响对其…

材料物理 笔记-4

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 离…

浙大恩特客户资源管理系统 RegulatePriceAction SQL注入漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统 RegulatePriceAction接口存在 SQL 注入漏洞,攻击者可通过输入恶意 SQL …

信息传播的AI时代:机器学习赋能新闻出版业的数字化之旅

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

layui框架实战案例(26):layui-carousel轮播组件添加多个Echarts图标的效果

在Layui中&#xff0c;使用layui-carousel轮播组件嵌套Echarts图表来实现多个图表的展示。 css层叠样式表 调整轮播图背景色为白色&#xff1b;调整当个Echarts图表显示loading…状态&#xff1b;同一个DIV轮播项目添加多个Echarts的 .layui-carousel {background-color: #f…

黄锈水过滤器 卫生热水工业循环水色度水处理器厂家工作原理动画

​ 1&#xff1a;黄锈水处理器介绍 黄锈水处理器是一种专门用于处理“黄锈水”的设备&#xff0c;它采用机电一体化设计&#xff0c;安装方便&#xff0c;操作简单&#xff0c;且运行费用极低。这种处理器主要由数码射频发生器、射频换能器、活性过滤体三部分组成&#xff0c;…

GPT-3.5开放免费使用,这次OpenAI做到了真的open

本周一&#xff0c;OpenAI宣布&#xff0c;部分地区的ChatGPT网站访问者现在无需登录即可使用人工智能助手。 此前&#xff0c;该公司要求用户创建账户才能使用&#xff0c;即使是目前由GPT-3.5AI语言模型支持的免费版ChatGPT也是如此。 01.GPT-3.5开放免登录使用 众所周知&…

mysql+keepalive+lvs搭建的数据库集群实验

前提条件&#xff1a;准备5台计算机&#xff0c;且网络互通 1、客户端 yum groups -y install mariadb-client ip 192.168.0.5 2、lvs1 yum-y install ipvsadm keepalived ip 192.168.0.1 keepalivedvip 192.168.0.215 /etc/hosts 解析192.168.0.1 主机名 3、lvs2 yum-y i…

生成式人工智能与 LangChain(预览)(下)

原文&#xff1a;Generative AI with LangChain 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 六、开发软件 虽然这本书是关于将生成式人工智能&#xff0c;特别是大型语言模型&#xff08;LLMs&#xff09;集成到软件应用程序中&#xff0c;但在本章中&#xff0c;…

C++模板基础1——定义函数模板

函数模板定义格式 模板函数定义格式如下&#xff1a; template <typename T> 返回类型 函数名(参数列表) {// 函数体 }其中&#xff0c;template<typename T>是模板声明&#xff0c;用于定义模板参数 T。可以使用不同的关键字代替 typename&#xff0c;例如 clas…

4大企业实例解析:为何MongoDB Atlas成为AI服务构建的首选

随着人工智能和生成式AI技术的迅猛发展&#xff0c;众多企业和机构正积极利用自然语言处理&#xff08;NLP&#xff09;、大型语言模型&#xff08;LLM&#xff09;等前沿技术&#xff0c;打造出一系列AI驱动的产品、服务和应用程序。 本文将展示四家已在AI创新领域取得显著成…

【MATLAB】PSO_BP神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 PSO_BP神经网络时序预测算法是一种结合了粒子群优化(PSO)算法和反向传播(BP)神经网络的时序预测方法。它利用了PSO算法的全局搜索能力和BP神经网络的优化能力&#xff0c;能够更准确地预测时序数据。 具体步…

【随笔】Git -- 高级命令(上篇)(六)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…