【Linux学习】Linux 的虚拟化和容器化技术
˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客系列专栏:xiaoxie的Linux学习系列专栏——CSDN博客●'ᴗ'σσணღ
我的目标:"团团等我💪( ◡̀_◡́ ҂)"( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝+关注(互三必回)!
一.Linux 的虚拟化和容器化技术
1.二者的区别
Linux的虚拟化技术和容器化技术都是用来在单个物理服务器上运行多个独立工作负载的技术,但它们在实现方式、隔离程度、资源效率和适用场景等方面存在显著差异。
虚拟化技术
-
实现方式:
- 虚拟化技术使用Hypervisor(虚拟机管理程序)将硬件资源抽象化,为每个虚拟机(VM)模拟出完整的硬件环境,包括CPU、内存、硬盘、网卡等。
- 每个虚拟机内部运行一个完整的Guest操作系统,它可以是任意类型的Linux发行版或其他操作系统(如Windows)。
-
资源隔离:
- 虚拟机之间完全隔离,互不影响,即使使用的内核版本、驱动程序等都可以不同。
- 每个虚拟机都有自己的内核,这意味着更高的安全性和稳定性,但也意味着更大的资源消耗。
-
性能和资源利用率:
- 虚拟化会有一定的性能开销,因为 Guest OS 和 Hypervisor 都需要消耗计算资源。
- 虚拟机启动相对较慢,并且磁盘I/O性能相对较低,因为它需要加载完整的操作系统镜像。
容器化技术
-
实现方式:
- 容器化技术如Docker和LXC等,在操作系统层面实现隔离,而不是硬件层面。
- 容器内的应用运行在宿主机的操作系统内核上,通过Namespace、Control Groups(cgroups)、Union File Systems(如AUFS或OverlayFS)等技术,实现进程、网络、文件系统等资源的隔离。
-
资源隔离:
- 容器共享宿主机的操作系统内核,因此隔离不如虚拟机彻底。
- 容器之间可以通过命名空间实现逻辑上的隔离,但如果有内核漏洞,可能会波及所有容器。
-
性能和资源利用率:
- 容器比虚拟机更轻量级,启动快速,停止单位时间内可以承载更多的服务实例。
- 容器几乎没有性能开销,因为它并不需要启动一个完整的操作系统,从而极大地提高了资源利用率和性能。
-
应用场景:
- 虚拟机适用于需要高度隔离、异构环境部署或者需要特定操作系统版本的应用场景。
- 容器更适合于云原生应用、微服务架构和持续集成/持续部署(CI/CD)流程,尤其是当应用需要频繁构建、测试和部署时。
总结来说,虚拟化技术主要用于提供强隔离和跨平台兼容性,而容器化技术则专注于快速部署、灵活扩展和高效资源利用,特别适应于现代云计算和微服务架构的需求。
下面以Docker作为容器化技术的代表,KVM作为虚拟化技术的代表,分别介绍它们的使用方法和示例代码。
二.Linux使用KVM实现虚拟化技术
1.什么是KVM
KVM 是Linux内核的一部分,提供了基于硬件辅助的全虚拟化能力。它允许Linux成为一个宿主机操作系统,可直接运行多个客户机操作系统作为虚拟机实例。每个虚拟机拥有独立的虚拟CPU、内存、磁盘和其他设备。
二.实现代码
-
系统要求检查
- 确保硬件支持虚拟化技术(如Intel VT-x或AMD-V)。
- 使用
egrep '(vmx|svm)' /proc/cpuinfo
命令检查处理器是否支持虚拟化。
-
安装KVM软件包 在Debian/Ubuntu上:
Bash1sudo apt-get update 2sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
在RHEL/CentOS上:
Bash1sudo yum install qemu-kvm libvirt-daemon-driver-qemu libvirt-daemon-system virt-install bridge-utils virt-manager
-
启用并启动libvirt服务
Bash1sudo systemctl start libvirtd 2sudo systemctl enable libvirtd
-
创建虚拟机
- 使用virt-manager图形工具创建新虚拟机,或者通过命令行工具virsh、virt-install等进行创建。
- 创建虚拟机时会指定镜像文件、内存大小、CPU核心数、网络配置等参数。
3.注意事项:
-
内核模块加载: KVM需要特定的内核模块才能工作,系统启动时应自动加载这些模块,例如kvm_intel或kvm_amd。如果不自动加载,可以通过以下命令手动加载:
Bash1sudo modprobe kvm_intel # 对于Intel处理器 2sudo modprobe kvm_amd # 对于AMD处理器
-
用户权限: 运行和管理虚拟机通常需要加入libvirt和kvm组,这样用户才能直接管理虚拟机:
Bash1sudo 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
之后登出并重新登录,以便新的组成员生效。
-
端口映射: 如果容器内的应用监听了某个端口并且希望外部能访问,需要在运行容器时指定端口映射:
Bash1sudo docker run -p 8080:80 my-web-server
上述命令将容器内的80端口映射到主机的8080端口。
-
数据持久化: 容器的生命周期通常是短暂的,如果需要持久化数据,应使用数据卷(volumes):Bash
sudo docker run -v /host/path:/container/path my-data-container
-
网络配置: 根据需求选择合适的网络模式,如bridge(默认)、host或自定义网络。
-
容器资源限制: 通过
-m
参数限制内存使用,通过--cpus
参数限制CPU使用率。 -
安全实践: 尽量避免使用root用户在容器内部运行服务,使用最小权限原则;及时更新Docker和镜像以修复安全漏洞。以上仅是简单示例,实际使用Docker时可能涉及到更复杂的镜像构建、多阶段构建、Compose文件编排、Swarm集群管理等内容。
通过以上示例代码,我们可以看到Docker容器化技术和KVM虚拟化技术的使用方法。在选择合适的技术方案时,需要综合考虑需求、资源消耗和隔离性要求等因素。最终选择哪种技术方案取决于具体的业务需求和资源条件,每种技术都有自己的优势和适用场景
相关文章:

【Linux学习】Linux 的虚拟化和容器化技术
˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…...

Delphi 是一种内存安全的语言吗?
上个月,美国政府发布了 "回到基石 "报告: 通往安全和可衡量软件之路 "的报告。该报告是美国网络安全战略的一部分,重点关注多个领域,包括内存安全漏洞和质量指标。 许多在线杂志都对这份报告进行了评论࿰…...

golang语言系列:Scrum、Kanban等敏捷管理策略
云原生学习路线导航页(持续更新中) 本文是 golang语言系列 文章,主要对编程通用技能 Scrum、Kanban等敏捷管理策略 进行学习 1.什么是敏捷开发 敏捷是一个描述软件开发方法的术语,它强调增量交付、团队协作、持续规划和持续学习。…...

QT背景介绍
🐌博主主页:🐌倔强的大蜗牛🐌 📚专栏分类:QT❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、QT背景 1.1什么是QT 1.2QT的发展历史 1.3什么是框架、库 1.4QT支持的平台 1.5QT的优点 1.6QT的…...

动态规划详解(Dynamic Programming)
目录 引入什么是动态规划?动态规划的特点解题办法解题套路框架举例说明斐波那契数列题目描述解题思路方式一:暴力求解思考 方式二:带备忘录的递归解法方式三:动态规划 推荐练手题目 引入 动态规划问题(Dynamic Progra…...
前端大额计算,真正解决js精度丢失问题
1.解决前端大额计算导致精度丢失问题 2.从底层上解决这个问题,计算时不使用js 运行时计算。 使用rust语言来解决这个问题,因为是底层语言,不涉及到精度问题。 3.实现步骤 步骤 1: 安装工具 确保你已经安装了Rust工具链和wasm-pack&#x…...
Android笔记--MediaCodec(一)
这一节主要来了解一下MediaCodec,Android MediaCodec 是 Android 平台提供的一个用于处理音频和视频数据的 API。它允许开发者对音频和视频数据进行编码和解码,支持多种格式和编解码器。MediaCodec API 通常用于实现实时音视频处理,如视频录制…...

Linux简单介绍
Linux简单介绍 编译器VMware虚拟机Ubuntu——LinuxOS为什么使用LinuxOS? 目录结构Windows目录结构Linux操作系统home是不是家目录? Linux常用命令终端命令行提示符与权限切换命令tab 作用:自动补全上下箭头pwd命令ls命令mkdir命令touch命令rm…...

Servlet 的基本理解
Servlet 是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一个http请求到来:容器将请求封装为servlet中的HttpServletRequest对象,调用init()&a…...
JavaScript之applye、bind和call方法详解
Question Q1 apply()、bind()和call()方法的区别在哪? Q2 apply()和call()的应用场景 Q3 apply()、bind()和call()方法手写实现逻辑 来源 继承自Function.prototype,属于实例方法 console.log(Function.prototype.hasOwnProperty(call)) //trueconsole.l…...

Docker,anaconda环境的部署与迁移
功能上线将提上日程,但是如何将我windows环境下的程序放到linux服务器的测试环境跑通呢?这是我这整个清明假期将要解决的一件事,最蠢的办法就是看自己的环境下有哪些依赖,如何到服务器上一个一个下,但是首先这个方法很…...
【大数据运维】Hbase shell 常见操作
文章目录 一. DDL1. 表的DDL1.1. 创建表1.2. 删除表 2. 列族的DDL2.1. 增加一个列簇2.2. 删除列族2.3. 修改列族版本(ing) 二. DML1. 插入与更新数据2. 删除数据3. 清空表 三. DQL1. scan:查一批数据1.1. 查询全部1.2. 过滤rowkey1.3. 过滤列…...

LeetCode-217存在重复的元素
217 存在重复的元素 给定一个整数数组,判断是否存在重复元素。 如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。 JavaScript的 Array 对象是用于构造数组的全局对象,数组是类似…...

基于两个单片机串行通信的电子密码锁设计
1.功能 电子号码锁在实际应用中应该有两部分,一部分在外部,有键盘部分和密码显示;另一部分内部,设置密码、显示密码。使用单片机自身带有的串口可以很方便的实现单片机之间的通信,使输入的密码值传送到主机检验是否是…...
产品经理功法修炼(3)之产品设计
点击下载《产品经理功法修炼(3)之产品设计》 1. 前言 产品经理的能力修炼并非局限于某一技能的速成,而是需要全面参与到产品的整个生命周期中,通过不断的实践来逐步提升自己的各项能力。尽管在企业的日常运作中,我们不可能身兼数职去扮演每一个角色,但作为产品的核心负…...

Qt 的发展历史、现状与启示
Qt 最早在1991年由挪威的两位程序员 Eirik Chambe-Eng 和 Haavard Nord 开发,他们在1994年创立 Trolltech 公司(奇趣科技)正式经营软件业务。Qt 的第一个公众预览版于1995年面世,之后在2008年被诺基亚收购;2011年到201…...

Quiet-STaR:让语言模型在“说话”前思考
大型语言模型(llm)已经变得越来越复杂,能够根据各种提示和问题生成人类质量的文本。但是他们的推理能力让仍然是个问题,与人类不同LLM经常在推理中涉及的隐含步骤中挣扎,这回导致输出可能在事实上不正确或缺乏逻辑。 考虑以下场景:正在阅读一…...
【Kotlin】匿名类和伴生类
1 匿名类 1)无继承 fun main() {var obj object {var name: String "zhang"override fun toString(): String {return name}}println(obj) // zhang } 2)有继承 fun main() {var obj object: People {var name: String "zhang"…...
【机器学习算法介绍】(3)决策树
决策树是一种常见的机器学习算法,用于分类和回归任务。它模拟了人类决策过程,通过一系列的问题来引导决策。决策树的构建涉及三个主要步骤:特征选择、树的构建和树的剪枝。 1. 特征选择 特征选择是决策树构建过程中的第一步,目的…...
算法之查找
1、顺序查找: package com.arithmetic.search; //顺序查找 //sequentialSearch 方法接收一个整数数组和一个目标元素作为参数,并使用顺序查找的方式在数组中查找目标元素。 //它通过循环遍历数组元素,逐个与目标元素比较,如果找到…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...