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

˃͈꒵˂͈꒱ 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.mzph.cn/news/792161.shtml

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

相关文章

如何设计一个类似Dubbo的RPC框架

首先有个注册中心,提供的服务在注册中心注册保留各个服务的信息,用zookeeper来做。然后消费者需要去注册中心拿对应的服务信息,而且每个服务可能会存在于多台机器上。接着就发起一次请求了,怎么发起?基于动态代理,面向接口获取到一个动态代理,就是接口在本地的一个代理,…

MySQL 导入库/建表时/出现乱码

问题描述: 新建不久的项目在使用Navicat for MySQL进行查看数据,发现表中注释的部分乱码,但是项目中获取的数据使用不会。 猜测因为是数据库编码和项目中使用的不一样,又因为项目的连接语句定义了需要编码,故项目运行…

浅述安防视频监控平台EasyCVR视频汇聚管理系统运维管理能力

智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中,将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、…

Go 性能压测工具之wrk介绍与使用

在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug;压力测试(压测)是确保系统在高负载情况下仍能稳定运行的重要步骤。通过模拟高并发场景,可以评估系统的性能瓶颈、可靠…

在云端遇见雨云:一位服务器寻觅者的指南

引言:寻觅一座云端归宿 当我踏入数字世界的边缘,带着对网络的探索与期待,我迫切需要一座安全可靠的数字栖息地。云计算技术正如一场魔法般的变革,而在这片广袤的云端中,雨云就像是一位友善的向导,引领我穿越…

(C)1005 继续(3n+1)猜想

1005 继续(3n1)猜想: 问题描述 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候&a…

30.多个线程交替执行

线程一输出a,5次; 线程二输出b,5次; 线程三输出c,5次; 现在要求输出abcabcabcabcabc怎么实现? 采用wait和notifyAll实现 public class ThreadTest {public static void main(String[] args) {WaitNotify waitNotify new Wai…

3DGS实时高质量大规模场景渲染最新SOTA!

作者:小柠檬 | 来源:3DCV 在公众号「3DCV」后台,回复「原论文」可获取论文pdf 添加微信:dddvision,备注:3D高斯,拉你入群。文末附行业细分群 详细内容请关注3DCV 3D视觉精品课程:…

文字识别 Optical Character Recognition,OCR CTC STN

文字识别 Optical Character Recognition,OCR 自然场景文本检测识别技术综述 将图片上的文字内容,智能识别成为可编辑的文本。 场景文字识别(Scene Text Recognition,STR) OCR(Optical Character Recognition, 光学字符识别)传统上指对输入扫描文档图像进行分析处理,识…

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

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

【JAVAEE学习】探究Java中多线程的使用和重点及考点

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

Java基数排序知识点(含面试大厂题和源码)

基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。它通过从最低位(个位)开始排序,然后逐渐转向最高位,对每一位进行…

Arcgis研究区图经纬度(南北)切换为英文字体(SN)

只在做英文论文研究区图的时候用,平常为了方便还是切换为中文

MySQL中 in 和 exists 区别

在MySQL中,IN和EXISTS都是用于在子查询中测试条件的操作符,但它们在处理和效率上有一些重要的区别。MySQL中的in语句是把外表和内表作hash连接,⽽exists语句是对外表作loop循环,每次loop循环再对内表进⾏查询。⼤家⼀直认为exists…

面试题:JVM 调优

一、JVM 参数设置 1. tomcat 的设置 vm 参数 修改 TOMCAT_HOME/bin/catalina.sh 文件,如下图 JAVA_OPTS"-Xms512m -Xmx1024m" 2. springboot 项目 jar 文件启动 通常在linux系统下直接加参数启动springboot项目 nohup java -Xms512m -Xmx1024m -jar…

作业3:计算机体系结构属性优选

作业3:计算机体系结构属性优选 一. 单选题(共11题,55分) (单选题)下列哪个选项属于非线性结构( )? A. 线性表 B. 栈 C. 树 D. 队列 正确答案: C:树; (单选题) 浮点数在机器中的表示形式如下所…

运行sentinel Java环境不是8以及端口被占用如何运行

1.Java环境不是8 运行sentinel (没有耐心直接看第三点) java --add-opens java.base/java.langALL-UNNAMED -jar sentinel-dashboard-1.8.1.jar2.8080端口被使用 运行 sentinel java -jar -Dserver.port8090 sentinel-dashboard-1.8.1.jar3.8080端口占用和Java环境不是8 运行…

JS详解-fetch核心语法

document.querySelector(.btn).addEventListener(click,async () > {const p new URLSearchParams({pname:浙江省,cname:杭州市})//1、如何请求?默认为get,参数1 url地址,返回promiseconst res await fetch(http://hmajax.itheima.net/…

给你一个网站如何测试?

主要围绕,功能,页面 UI ,兼容,性能,安全,这几个方面去聊,首先是制定测试计划,确定测试范围和测试策略,一般包括以下几个部分:功能性测试;界面测试…

【打印SQL执行日志】⭐️Mybatis-Plus通过配置在控制台打印执行日志

目录 前言 一、Mybatis-Plus 开启日志的方式 二、测试 三、日志分析 章末 前言 小伙伴们大家好,相信大家平时在处理问题时都有各自的方式,最常用以及最好用的感觉还是断点调试,但是涉及到操作数据库的执行时,默认的话在控制台…