【云原生技术】Docker容器进阶知识

文章目录

    • namespace概述
      • 一、namespace的基本概念
      • 二、namespace的主要作用
      • 三、namespace的类型
      • 四、namespace的操作
      • 五、namespace在容器技术中的应用
    • cgroup
      • 一、cgroup的基本概念
      • 二、cgroup的主要功能
      • 三、cgroup的子系统介绍
      • 四、cgroup的应用场景
      • 五、cgroup的使用与管理
    • cgroup和namespace的关系
      • 一、cgroup的作用
      • 二、namespace的作用
      • 三、cgroup和namespace的关系
    • Docker资源分配
      • 一、CPU资源配置
      • 二、内存资源配置
      • 三、存储资源配置
        • 数据卷(Volume)
        • 绑定挂载(Bind mounts)
        • 缓存挂载(tmpfs mounts)
      • 四、网络资源配置
      • 五、其他资源配置
      • 六、综合示例

namespace概述

容器技术是一种流行的虚拟化技术,它允许在同一台计算机上与其他进程在独立环境中运行进程。容器是从Linux内核的一些新功能构建的,其中“namespace”(命名空间)技术是容器资源分配的基础之一。以下是对namespace的详细说明:

一、namespace的基本概念

namespace是Linux内核的一项特性,它可以对内核资源进行分区,使得一组进程可以看到一组资源,而另一组进程可以看到另一组不同的资源。简单来说,namespace是由Linux内核提供的,用于进程间资源隔离的一种技术。它将全局的系统资源包装在一个抽象里,让进程(看起来)拥有独立的全局资源实例。

二、namespace的主要作用

在容器技术中,namespace的主要作用是提供资源隔离和封装抽象。通过namespace,容器内的进程和资源可以在一个虚拟化的环境中运行,以便它们似乎独立于主机和其他容器。这为实现多个进程或容器在同一台主机上独立运行而不会相互干扰提供了基础。

三、namespace的类型

Linux提供了多种类型的namespace,用于对多种不同资源进行隔离。在容器技术中,常见的namespace类型包括:

  1. UTS namespace:用于隔离主机名和域名。每个容器都可以具有自己独立的主机名,这有助于在容器中创建隔离的网络标识。
  2. IPC namespace:用于隔离进程间通信资源。同一个IPC namespace的进程之间能互相通讯,不同的IPC namespace之间不能通信。
  3. PID namespace:用于隔离进程ID(PID)。这使得容器内的进程拥有自己独立的PID空间,容器内的进程可以以1作为其PID,而不会与主机或其他容器的进程冲突。
  4. Network namespace:用于隔离网络资源。包括网络接口、IP地址、路由表等。每个容器通常都有自己的网络命名空间,使其能够运行自己的网络栈,与其他容器隔离。
  5. Mount namespace:用于隔离挂载点。每个容器都有自己的挂载命名空间,使其能够拥有独立的文件系统挂载点。这允许容器在其内部拥有自己的文件系统视图,而不会影响到主机或其他容器的文件系统。
  6. User namespace:用于隔离用户和用户组标识。这个命名空间允许容器内的进程拥有不同于主机的用户和用户组标识,从而增强了安全性。

四、namespace的操作

Linux提供了多个API用来操作namespace,它们是clone()、setns()和unshare()函数。为了确定隔离的到底是哪项namespace,在使用这些API时,通常需要指定一些调用参数,如CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS等。

五、namespace在容器技术中的应用

在容器技术中,如Docker和Kubernetes等,都利用了namespace来实现容器的隔离和资源管理。通过为容器分配不同的namespace,可以确保容器内的进程和资源与主机和其他容器相互隔离,从而实现更高的安全性和资源管理效率。

综上所述,namespace是容器资源分配的基础之一,它通过提供资源隔离和封装抽象的功能,为实现多个容器在同一台主机上独立运行而不会相互干扰提供了有力支持。

cgroup

cgroup(Control Groups)是Linux内核提供的一种机制,它允许系统管理员对进程或进程组进行物理资源的限制、隔离和统计。cgroup的应用广泛,是实现虚拟化技术、容器技术以及进行任务管理和性能调优的重要工具。以下是对cgroup的详细介绍:

一、cgroup的基本概念

  1. 进程分组:cgroup允许将进程或进程组进行分组,每个cgroup可以看作是一个进程集合,系统管理员可以对这些进程集合进行统一的资源管理。
  2. 层级结构:cgroup形成树形结构,每个节点都是一个进程组。子节点是父节点进程组的子集,并继承父节点的属性。根节点为root group,包含系统所有进程。
  3. 子系统:cgroup通过子系统来控制不同类型的资源。每个子系统都是一个资源控制器,负责特定类型资源的分配和管理。常见的子系统包括cpu、memory、cpuset、blkio等。

二、cgroup的主要功能

  1. 资源限制:cgroup可以对进程组所使用的资源(如CPU、内存、磁盘IO等)进行限制,防止某个进程组占用过多资源,影响系统整体性能。
  2. 优先级设置:通过调整cgroup中进程的优先级,可以实现对进程执行顺序的控制。例如,可以通过限制CPU使用配额来设置进程的优先级。
  3. 资源统计:cgroup提供了资源使用情况的统计信息,如CPU运行时间、内存使用量等。这些信息有助于管理员了解系统的负载状况,及时发现资源瓶颈并进行调整。
  4. 进程控制:cgroup还可以对进程进行挂起、恢复等操作,实现对进程生命周期的管理。

三、cgroup的子系统介绍

  1. cpu子系统:控制进程组对CPU的访问,为每个进程组设置一个使用CPU的权重值或时间配额。
  2. cpuset子系统:为进程组分配可使用的CPU和内存节点,实现资源的精细化控制。
  3. memory子系统:限制进程组的内存使用上限,并生成内存资源使用报告。
  4. blkio子系统:限制进程组对块设备的输入输出操作,包括I/O带宽和IOPS的限制。
  5. devices子系统:控制进程组对设备的访问权限,允许或禁止进程组访问特定设备。
  6. freezer子系统:挂起cgroup中的所有进程,实现进程的暂停和恢复操作。
  7. net_cls子系统:为进程组提供网络带宽的访问限制,如限制发送和接收带宽。

四、cgroup的应用场景

  1. 虚拟化技术:在虚拟化环境中,cgroup可以用来实现虚拟机资源的隔离和限制,避免虚拟机之间的资源竞争。
  2. 容器技术:在Docker等容器技术中,cgroup是实现容器资源隔离和限制的基础。通过为容器创建cgroup,可以限制容器使用的资源量,提高整体系统的吞吐量和性能。
  3. 任务管理:cgroup可以用来管理系统中的各个任务(进程),通过为不同任务分组并设置资源限制,实现任务的优化调度。
  4. 性能调优:通过调整cgroup的资源限制和监控资源使用情况,管理员可以对系统进行性能调优,提高系统的稳定性和响应速度。

五、cgroup的使用与管理

cgroup的用户空间管理是通过cgroup文件系统来实现的。管理员可以通过挂载cgroup文件系统来创建和管理cgroup。常用的cgroup命令包括cgcreate(创建cgroup)、cgdelete(删除cgroup)、cgset(更改cgroup的设置)、cgclassify(将进程加入cgroup)等。此外,还可以使用lssubsys命令查看当前系统中已经挂载的cgroup子系统和层次结构。

综上所述,cgroup是Linux内核提供的一种强大的资源管理机制,它允许系统管理员对进程或进程组进行精细化的资源限制、隔离和统计。通过合理利用cgroup的功能和特性,管理员可以更好地管理和优化系统资源,提高系统的稳定性和性能。

cgroup和namespace的关系

cgroup和namespace是Linux内核中两个重要的功能,它们各自承担着不同的角色,但经常一起使用,特别是在容器技术(如Docker)中。以下是cgroup和namespace之间关系的详细解释:

一、cgroup的作用

cgroup(Control Groups)是Linux内核提供的一种机制,用于限制、记录和隔离进程组的资源使用。这些资源包括CPU、内存、磁盘I/O等。cgroup的主要功能包括:

  1. 资源限制:限制进程组可以使用的资源量,如CPU时间、内存大小和I/O带宽。
  2. 优先级管理:为不同的进程组设置资源使用的优先级。
  3. 隔离:确保不同cgroup的进程不会互相影响。
  4. 监控:跟踪进程组的资源使用情况。
  5. 控制:可以暂停、恢复或终止进程组。

二、namespace的作用

namespace(命名空间)是Linux内核提供的一种机制,用于将内核的全局资源做封装,使得每个namespace都有一份独立的资源。这样,不同的进程在各自的namespace内对同一种资源的使用互不干扰。namespace的主要功能包括:

  1. 资源隔离:每个namespace可以拥有自己独立的主机名、进程ID系统、IPC(进程间通信)、网络、文件系统、用户等资源。
  2. 避免冲突:通过为不同的进程或进程组分配不同的namespace,可以避免资源使用上的冲突。
  3. 简化管理:每个namespace可以看作是一个独立的虚拟环境,简化了对资源的管理和配置。

三、cgroup和namespace的关系

  1. 协同工作:在容器技术中,cgroup和namespace经常一起使用。cgroup负责限制和隔离容器内的资源使用,而namespace则负责隔离容器的运行环境。这样,每个容器都可以看作是一个独立的虚拟环境,拥有自己的资源和进程空间。
  2. 实现容器化:cgroup和namespace是实现容器化的基础。通过为容器创建cgroup和namespace,可以限制容器的资源使用并隔离容器的运行环境。这使得多个容器可以在同一台物理机上运行而不会互相干扰。
  3. 提高资源利用率:cgroup和namespace的协同工作可以提高资源的利用率。通过限制容器的资源使用,可以避免某个容器占用过多资源而影响其他容器的运行。同时,通过隔离容器的运行环境,可以确保容器的安全性和稳定性。

综上所述,cgroup和namespace是Linux内核中两个重要的功能,它们各自承担着不同的角色但经常一起使用。在容器技术中,cgroup和namespace的协同工作为实现容器的资源限制、隔离和安全性提供了基础。

Docker资源分配

在Docker中,资源相关的启动项配置对于确保容器的性能和稳定性至关重要。以下是一些关键的资源相关启动项配置及其详细说明:
docker-namespace-cgroup

一、CPU资源配置

  1. –cpus

    • 功能:限制容器可以使用的CPU核心数量。
    • 示例docker run --cpus=1.5 my_container,这将限制容器使用1.5个CPU核心。
  2. –cpu-shares

    • 功能:设置CPU的相对权重,用于在多个容器竞争CPU资源时分配CPU时间。
    • 默认值:1024。
    • 示例docker run --cpu-shares=512 my_container,这将使该容器在CPU资源竞争中获得较少的CPU时间。

二、内存资源配置

  1. –memory

    • 功能:限制容器可以使用的内存大小。
    • 单位:可以是M(兆字节)或G(千兆字节)。
    • 示例docker run --memory=1G my_container,这将限制容器最大使用1GB内存。
  2. –memory-reservation

    • 功能:指定容器的内存保留值,即保证容器至少能够使用的内存大小。
    • 示例docker run --memory-reservation=512M my_container,这将确保容器至少可以使用512MB内存。
  3. –memory-swap

    • 功能:设置容器可以使用的虚拟内存(包括物理内存和交换空间)大小。
    • 示例docker run --memory=1G --memory-swap=2G my_container,这将限制容器使用1GB物理内存和1GB交换空间。

三、存储资源配置

Docker的存储资源配置通常通过--storage-opt选项来实现,但具体配置取决于使用的存储驱动。例如,对于overlay2存储驱动,可以使用--storage-opt size来限制容器的磁盘空间使用,但需要注意的是,并非所有存储驱动都支持该选项。
Docker 存储绑定主要有两种方式:数据卷(Volume)和绑定挂载(Bind mounts)。

数据卷(Volume)
  • 特点

    • 由 Docker 管理,适用于持久化存储。
    • 更容易备份和迁移。
    • 支持在 Linux 和 Windows 容器中使用。
    • 可以用于容器间的数据共享。
    • 不支持在宿主机上直接查看或管理数据。
  • 使用方法

    • 创建数据卷:docker volume create my_volume
    • 绑定到容器:docker run -v my_volume:/app/data my_image
绑定挂载(Bind mounts)
  • 特点

    • 将宿主机的目录或文件挂载到容器中。
    • 容器可以直接访问宿主机的文件系统。
    • 适合开发环境,方便查看和管理。
  • 使用方法

    • 使用 -v 参数:docker run -v /host/path:/container/path my_image
    • 使用 --mount 参数:docker run --mount type=bind,source=/host/path,target=/container/path my_image
缓存挂载(tmpfs mounts)
  • 特点

    • 基于内存的文件系统,适合存储敏感信息。
    • 只能在 Linux 上使用,不适合持久化。
  • 使用方法

    • docker run --tmpfs /app/data my_image
      选择合适的存储方式取决于具体的使用场景和需求。数据卷适合需要持久化的数据,而绑定挂载更适合开发和测试环境。

四、网络资源配置

  1. –network

    • 功能:设置容器的网络模式。
    • 常见模式:bridge(默认)、host、none、container以及自定义网络。
    • 示例docker run --network=bridge my_container,这将容器连接到默认的bridge网络。
  2. 端口映射

    • 功能:将容器的端口映射到主机的端口上,以便外部访问。
    • 示例docker run -p 8080:80 my_nginx,这将容器的80端口映射到主机的8080端口。

五、其他资源配置

Docker还支持其他类型的资源配置,如设备访问、安全策略等,这些配置通常通过--device--cap-add--cap-drop等选项来实现。

六、综合示例

要创建一个 Docker 容器,同时指定 CPU、内存、网络和存储资源,你可以使用 docker run 命令,并结合多个参数来实现。以下是一个示例命令,它展示了如何为一个容器指定这些资源:

docker run -d \--name my_container \--memory="512m" \  # 限制容器使用的最大内存为 512MB--cpus="1.0" \      # 限制容器可以使用的 CPU 核心数为 1 个(1.0 表示 1 个核心的使用权)--network=host \    # 使用宿主机的网络栈-v my_volume:/app/data \  # 绑定一个数据卷,用于持久化存储-v /host/path:/container/path \  # 绑定挂载宿主机的目录到容器中my_image

在这个命令中:

  • -d:表示后台运行容器。
  • --name my_container:为容器指定一个名称。
  • --memory="512m":为容器分配的最大内存限制为 512MB。
  • --cpus="1.0":为容器分配的 CPU 核心数。这个值可以是一个分数,表示 CPU 的使用权重。
  • --network=host:将容器的网络栈设置为与宿主机共享,这意味着容器将不会获得自己的 IP 地址,而是使用宿主机的网络。
  • -v my_volume:/app/data:创建或使用一个名为 my_volume 的 Docker 数据卷,并将其挂载到容器的 /app/data 目录。这适用于需要持久化存储的场景。
  • -v /host/path:/container/path:将宿主机上的 /host/path 目录挂载到容器的 /container/path 目录。这适用于需要从宿主机直接访问文件的场景。
  • my_image:指定要运行的 Docker 镜像名称。

请根据你的具体需求调整这些参数。例如,如果你需要为容器设置特定的网络设置,你可以使用 --network 参数来创建或加入一个用户定义的网络。同样,对于存储资源,你可以根据需要挂载多个卷或目录。

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

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

相关文章

.ts文件编译为.js文件

.ts文件如何编译为.js文件 首先安装了tsc $ npm install -g typescript可以使用如下命令检查是否安装tsc,出现版本号则说明安装成功 tsc -v创建.ts文件 创建 1.ts,编写代码如下: function test(a:string):string{return a }编译为.js文件 执行如下…

Spring Cloud环境搭建

一.开发环境推荐 JDK建议使用JDK17。 因为SpringCloud是基于SpringBoot进行开发的,SpringBoot3.X以下的版本,Spring官方已经不再维护了(还可以继续使用),SpringBoot3.X的版本使用的JDK版本基线是17,而且1…

IPv 4

IP协议 网络层主要由IP(网际协议)和ICMP(控制报文协议)构成,对应OSI中的网络层,网络层以实现逻辑层面点对点通信为目的。目前应用最广泛的IP协议为IPv4 基本概念给出 主机:配有IP地址但不具有路…

live2d 实时虚拟数字人形象页面显示,对接大模型

live2dSpeek 测试不用gpu可以正常运行 https://github.com/lyz1810/live2dSpeek 运行的话还需要额外下载https://github.com/lyz1810/edge-tts支持语音 ## 运行live2dSpeek >npm install -g http-server >http-server . ## 运行edge-tts python edge-tts.py

SpringMVC(看这一篇就够了)

目录: SpringMVC什么是MVC模型SpringMVC案例SpringMVC执行流程SpringMVC封装参数简单数据类型简单对象关联对象简单数据类型集合Map集合参数类型转换器编码过滤器Servlet原生对象 SpringMVC处理响应视图解析器返回值为void返回值为ModelAndView向request域设置数据向…

止步阿里一面。。。

时间过的真快,转眼间国庆已经过去一周了,又到了新的一周,继续分享最新的面经。 今天分享的是粉丝在阿里巴巴的一面,考察了数据库、redis、kafka、ES和项目,数据库和redis不用多说,项目必用面试必考&#x…

【Python时序数据系列】基于LSTM模型实现时序数据二分类(案例+源码)

这是我的第366篇原创文章。 一、引言 前面我介绍了单变量时序预测和多变量时序预测,都是回归任务。 相关链接: 时序预测系列文章 本文将介绍时序分类任务-基于LSTM模型进行时序数据二分类。 二、实现过程 2.1 准备数据 df1 pd.read_table("t…

python yolov8半自动标注

首先标注一部分图片,进行训练,生成模型,标注文件为xml方便后面统一做处理。 1、标注数据(文件为xml, 转为txt用于训练,保留xml标签文件) 2、模型训练(训练配置、训练代码、) 3、使用…

ShardingJDBC分库分表实战

目录 一、第一个分库分表的案例 1、快速搭建基础JDBC应用 2、引入ShardingJDBC快速实现分库分表 二、理解分库分表的核心概念 1、ShardingSphere分库分表的核心概念 2、垂直分片和水平分片 三、ShardingJDBC常见数据分片策略实战 1、INLINE简单分片 2、STANDARD标准分片…

ubuntu下实时查看CPU,内存(Mem)和GPU的利用率

一、实时查看CPU和内存(Mem)利用率 htop官网:htop - an interactive process viewer sudo apt-get install htop htop ①. 顶部状态栏(System Metrics Overview) 这个区域显示系统的全局资源使用情况,包括…

深入解析 Harris 角点检测算法:从孔径问题到响应函数的完整推导

在图像处理中,角点是非常重要的特征。为了快速、准确地检测角点,Harris 提出了 Harris 角点检测算法,它基于局部窗口内图像梯度的变化来判断角点。本文将从最基础的孔径问题(Aperture Problem)入手,通过泰勒…

MeterSphere接口自动化平台调试

1。后置脚本节目 //导入json包 import org.json.*; import com.decode.DecodeMain; String responseprev.getResponseDataAsString(); String result DecodeMain.DecodeUtil(response); log.info(“获取批次账单id result:”result); //转换为Object对象类型 JSONObject data_…

机器学习:知识蒸馏(Knowledge Distillation,KD)

知识蒸馏(Knowledge Distillation,KD)作为深度学习领域中的一种模型压缩技术,主要用于将大规模、复杂的神经网络模型(即教师模型)压缩为较小的、轻量化的模型(即学生模型)。在实际应…

UE5 C++: 插件编写06 | 移动文件时自动Fix up redirectors

目录 前言: 本文内容: WHY WHAT HOW 详细步骤 代码解析 1. Build.cs file中 2. QuickAssetAction.cpp中 IMPORTANT NOTES 中文解释: 使用 AssetToolsModule 来修复重定向器 使用 AssetRegistryModule 来过滤所有重定向器 使用 FMo…

利士策分享,美国“假旗”行动,是否成为了网络空间的阴霾?

利士策分享,美国“假旗”行动,是否成为了网络空间的阴霾? 在当今这个信息化时代,网络空间已经成为国家间竞争与合作的重要领域。然而,美国却频繁采取一种名为“假旗行动”的卑劣手段,污染全球网络空间,给世…

Java 二分查找算法详解及通用实现模板案例示范

1. 引言 二分查找(Binary Search)是一种常见的搜索算法,专门用于在有序数组或列表中查找元素的位置。它通过每次将搜索空间缩小一半,从而极大地提高了查找效率。相比于线性查找算法,二分查找的时间复杂度为 O(log n)&…

Arthas常用的命令(三)--monitor、jad 、stack

monitor:监控方法的执行情况 监控指定类中方法的执行情况 用来监视一个时间段中指定方法的执行次数,成功次数,失败次数,耗时等这些信息 参数说明 方法拥有一个命名参数 [c:],意思是统计周期(cycle of ou…

linux线程 | 同步与互斥(上)

前言:本节内容主要是线程的同步与互斥。 本篇文章的主要内容都在讲解互斥的相关以及周边的知识。大体的讲解思路是通过数据不一致问题引出锁。 然后谈锁的使用以及申请锁释放锁的原子性问题。 那么, 废话不多说, 现在开始我们的学习吧&#x…

软件测试工程师面试整理 —— 操作系统与网络基础!

在软件测试中,了解操作系统和网络基础知识对于有效地进行测试工作至关重要。无论是在配置测试环境、调试网络问题,还是在进行性能测试和安全测试时,这些知识都是不可或缺的。 1. 操作系统基础 操作系统(Operating System, OS&am…

OgreNext高级材质中增加线宽,点大小,虚线模式绘制支持

修改Ogre高级材质系统,增加线宽,点大小,虚线模式,虚线参数的支持,效果如下: 需要修改的代码文件如下: 修改如下 代码文本: //范围[0.2 - 51] 0.2 * [0,255];Ogre::uint8 mLineWidth;//范围[…