Linux 容器(Linux Containers, LXC)

server/2025/1/12 0:54:20/

文章目录

      • Linux 容器
      • Linux 容器的核心原理
        • 1. Namespace(命名空间)
        • 2. Cgroups(控制组)
        • 3. Chroot 和 Mount
        • 4. UnionFS(联合文件系统)
        • 5. Seccomp、AppArmor、SELinux
      • Linux 容器的架构
        • 1. 核心组件
        • 2. 容器生命周期管理
      • Linux 容器的优缺点
      • Linux 容器使用场景
      • Linux 容器 vs 虚拟机
      • 总结

Linux 容器

Linux 容器(Linux Containers, LXC)是一种轻量级的虚拟化技术,通过使用 Linux 内核功能(如命名空间和控制组)实现应用程序的隔离、资源控制和高效运行。与传统虚拟机相比,容器不需要虚拟化整个操作系统,因而具有更高的性能和更低的资源开销。


Linux 容器的核心原理

Linux 容器的实现依赖以下几个关键技术:

1. Namespace(命名空间)
  • 命名空间提供了进程级别的隔离,容器中的进程认为自己运行在独立的环境中。
  • 主要命名空间:
    • PID(进程 ID)命名空间
      • 隔离进程 ID,容器内的进程只能看到自身的 PID。
    • NET(网络)命名空间
      • 每个容器拥有独立的网络栈,包括接口、IP 地址、路由表等。
    • IPC(进程间通信)命名空间
      • 隔离 System V IPC 和 POSIX 消息队列。
    • UTS(主机名和域名)命名空间
      • 容器可以设置自己的主机名和域名。
    • MNT(挂载点)命名空间
      • 隔离文件系统的挂载点,容器可以有自己的文件系统视图。
    • USER(用户)命名空间
      • 提供用户 ID 和组 ID 的隔离。
2. Cgroups(控制组)
  • Cgroups 用于限制、记录和隔离容器对系统资源的使用。
  • 主要控制资源:
    • CPU:限制 CPU 时间的使用。
    • 内存:设置内存使用上限,防止内存溢出。
    • 磁盘 I/O:控制容器的磁盘读写速率。
    • 网络带宽:限制容器的网络使用。
3. Chroot 和 Mount
  • Chroot:改变进程的根目录,使容器内的进程只能访问自己的文件系统。
  • Mount 命名空间:为每个容器创建独立的文件系统视图。
4. UnionFS(联合文件系统)
  • 容器镜像的文件系统通常基于联合文件系统实现,支持分层结构。
  • 常见的 UnionFS 实现:
    • AUFS:一种早期的联合文件系统。
    • OverlayFS:轻量级、性能高的联合文件系统。
  • 分层镜像结构:
    • 只读层:基础镜像。
    • 读写层:容器运行时的更改存储。
5. Seccomp、AppArmor、SELinux
  • 提供容器的安全隔离:
    • Seccomp:限制系统调用的种类。
    • AppArmor 和 SELinux:强制访问控制(MAC),限制容器访问主机资源的权限。

Linux 容器的架构

1. 核心组件
  • Container Runtime(容器运行时)
    • 执行容器的创建和管理。
    • 示例:runc 是 OCI 标准的容器运行时实现。
  • Container Engine(容器引擎)
    • 管理镜像、容器、网络等功能。
    • 示例:Docker、containerd、CRI-O。
  • Kernel Features(内核功能)
    • 依赖 Linux 内核的 Namespace、Cgroups 等功能实现隔离和资源控制。
2. 容器生命周期管理
  • 创建
    • 基于镜像生成容器文件系统。
    • 分配命名空间、Cgroups。
  • 运行
    • 启动容器进程,绑定资源限制和网络配置。
  • 停止
    • 终止容器进程,释放资源。
  • 删除
    • 清理容器的文件系统和配置。

Linux 容器的优缺点

优点

  1. 轻量级
    • 容器直接使用主机内核,不需要虚拟化整个操作系统。
    • 启动时间快,资源消耗低。
  2. 灵活性
    • 容器之间互相独立,可在开发、测试、生产环境快速迁移。
  3. 高性能
    • 与虚拟机相比,容器几乎没有性能损失。
  4. 易于扩展
    • 支持大规模分布式部署。

缺点

  1. 隔离性弱于虚拟机
    • 由于共享内核,容器无法完全隔离主机。
  2. 依赖内核版本
    • 不同主机的内核差异可能影响容器的运行。
  3. 安全性
    • 如果容器被攻破,可能影响整个主机。

Linux 容器使用场景

  1. 微服务架构
    • 每个服务运行在独立的容器中,便于扩展和部署。
  2. CI/CD 流程
    • 快速启动和销毁容器,提高持续集成效率。
  3. 开发与测试
    • 提供一致的环境,避免“在我机器上可以跑”的问题。
  4. 资源隔离
    • 在多租户场景下隔离资源,确保服务稳定性。
  5. 分布式计算
    • 容器作为分布式集群的计算单元,灵活调度。

Linux 容器 vs 虚拟机

特性Linux 容器虚拟机
隔离性使用内核命名空间,隔离较弱完整隔离,安全性更高
启动时间秒级分钟级
资源开销低(共享内核)高(需要完整的 OS)
性能接近原生性能有一定性能损失
管理简单(镜像、容器)较复杂(虚拟硬件、镜像)
适用场景微服务、轻量级部署高安全性、复杂应用环境

示例:使用 Linux 容器

运行一个容器

docker run -it ubuntu:latest /bin/bash
  • 使用 docker 作为容器引擎,启动一个基于 Ubuntu 镜像的容器。

查看命名空间

lsns
  • 显示系统中的命名空间,验证容器的隔离性。

设置资源限制

docker run -it --memory="512m" --cpus="1.0" ubuntu:latest /bin/bash
  • 使用 Docker 设置容器的内存和 CPU 限制。

总结

Linux 容器通过 Namespace 和 Cgroups 提供进程隔离和资源控制,结合 UnionFS 实现了轻量级虚拟化。它适合现代云原生架构中的微服务、分布式计算和 DevOps 流程。通过进一步与工具如 Kubernetes 集成,容器技术已成为现代 IT 基础设施的核心组件。


http://www.ppmy.cn/server/157283.html

相关文章

sql--MERGE INTO

可以同时增删改 旧表倒新表 语法如下: MERGE INTO 表名1 ---目标表(即要对此表进行增删改)USING 表名2 ---数据源(给表1提供数据的)ON (关联条件) ---必须是主键列或者唯一列关联…

IDEA的常用设置

目录 一、显示顶部工具栏 二、设置编辑区字体按住鼠标滚轮变大变小(看需要设置) 三、设置自动导包和优化导入的包(有的时候还是需要手动导包) 四、设置导入同一个包下的类,超过指定个数的时候,合并为*&a…

【服务器】ubuntu20.04安装cuda12.01(使用runfile安装)

【服务器】ubuntu20.04安装cuda12.01(使用runfile安装)包教包会 【创作不易,求关注收藏点赞】商业合作请私聊,有问题可以评论或者私聊! 1、进入cuda官网 先登录,登录好之后选择对应的版本 按下面选项…

基于Spring Boot的扶贫助农系统设计与实现(LW+页码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

ls指令详讲

🏝️专栏:https://blog.csdn.net/2301_81831423/category_12872319.html 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 基本语法 常用选项详解 1. 基本选项 …

01.基因组注释笔记——RepeatMasker使用记录

1. 查看官网: RepeatMasker Home Pagehttps://www.repeatmasker.org/ 2. 了解软件的功能: RepeatMasker 是一个用于筛查 DNA 序列中的散布重复序列(interspersed repeats )和低复杂度 DNA 序列(low complexity DNA …

图数据挖掘:助力保险欺诈检测

引言 保险欺诈一直是保险行业面临的一大难题,它不仅损害了保险公司的利益,还可能导致保险费率的上升,最终影响到广大投保人。传统的欺诈检测方法主要依赖于规则引擎和统计分析,但随着欺诈手段的不断翻新,这些方法逐渐…

『SQLite』如何使用索引来查询数据?

前面已经讲过如何创建索引,这里进一步讲解如何通过索引来查询。 INDEXED BY 子句的语法,它可以与 DELETE、UPDATE 或 SELECT 语句一起使用: SELECT|DELETE|UPDATE column1, column2... INDEXED BY (index_name) table_name WHERE (CONDITION…