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

news2024/11/23 11:07:09

文章目录

    • 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.coloradmin.cn/o/2210287.html

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

相关文章

uniapp-小程序开发0-1笔记大全

uniapp官网: https://uniapp.dcloud.net.cn/tutorial/syntax-js.html uniapp插件市场: https://ext.dcloud.net.cn/ uviewui类库: https://www.uviewui.com/ 柱状、扇形、仪表盘库: https://www.ucharts.cn/v2/#/ CSS样式&…

余 弦 曲 线

1.问题描述 在屏幕上画出余弦函数cos(x)曲线,如图1.6所示。 图1.6 余弦函数cos(x)曲线 2.问题分析 连续的曲线是由点组成的,点与点之间距离比较近,看上去就是曲线了,…

uni-app 如何全局设置,获取app.vue里面的值

在globalData里设置一个值 通过下面方法修改 this.$options.globalData.$versonStatus status 在页面中通过getApp()获取 getApp().globalData.$versonStatus

<<迷雾>> 第11章 全自动加法计算机(3)--存储器示例 示例电路

info::操作说明 将一组比特单元扩展为多组的结果, 操作原理类似 注: 一次只能操作一组, 此处需进一步引入地址译码器才能具体进行操作, 见后面的例子, 此处仅展示结构原理 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdm…

C++模板初阶速成

温馨提示:本篇文章依旧是c速成系列的文章,但和以往有所不同的是,本篇文章带大家简单了解并能够学会使用模板 泛型编程 概念:编写与类型无关的通用代码,是代码复用的一种手段。 什么是复用? 简单来说就是…

分组相关 -- EoO原理

EoO (Ethernet over OTN) 是将以太网信号处理后,经过封装、映射后上OTN系统,通过WDM通道来传送的技术。传统的OTN承载ETH专线,不支持限速&汇聚等场景。引入EoO技术后,支持LAG、QoS、OAM等L2层的功能特性,实现端口限…

RBTree(红黑树)的介绍和实现

欢迎来到杀马特的主页:羑悻的小杀马特.-CSDN博客 目录 ​编辑 一红黑树介绍: 1.1红黑树概念: 1.2红黑树遵循的原则: 1.3红黑树效率分析: 二.红黑树的实现: 2.1红黑树结构: 2.2红黑树节点…

TMGM:下周全球市场分析

本周,美国股市表现强劲,标普500指数和道琼斯工业平均指数均刷新了历史最高记录。这一涨势得到了美联储公开市场委员会(FOMC)会议纪要的支撑,纪要显示大部分官员都支持9月份实施重大的50个基点降息。 在澳大利亚&#…

宝安网站建设中的响应式设计

宝安网站建设中的响应式设计 在数字化时代,网站已成为企业展示形象、吸引客户的重要平台。而在宝安地区,随着互联网的发展,越来越多的企业意识到响应式设计的重要性。响应式设计不仅能够提升用户体验,还能为企业带来更大的市场竞争…

.NET 一款通过DCOM实现系统提权的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

2024年恩施职称评前公示

此次公示共有422人,初级职称、中级职称、馆员、畜牧师、助理馆员、三级演员、农艺师等均在一起进行评审前的公示。 根据恩施州职称改革工作领导小组办公室《关于报送2024年度恩施州中初级专业技术职务评审材料的通知》(恩施州职改办〔2024〕14号&#xf…

04 什么是线性表

什么是线性表 一、为什么需要线性表 例如: ​ 在程序中保存指定班级的所有的学生信息(暂时只需要处理姓名、年龄),该班级最多可容纳30人,且可进行数量上的增减。 业务功能: ​ 1)这个项目中…

【分布式架构】分布式锁Redission

一、流程图 二、lua脚本实现原理 由setnxexpire实现 setnx&#xff1a;判断key是否存在&#xff0c;如果不存在&#xff0c;则获取锁 setnx的数据结构&#xff1a;<key,<key1,value>> key&#xff1a;业务声明的key key1&#xff1a;线程id value&#xff1a;次数…

css 翻页效果

有一个项目&#xff0c;页面切换的时候要翻页效果。 所以有一个简单的demo&#xff0c;提供给大家学习 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdev…

Golang | Leetcode Golang题解之第476题数字的补数

题目&#xff1a; 题解&#xff1a; func findComplement(num int) int {highBit : 0for i : 1; i < 30; i {if num < 1<<i {break}highBit i}mask : 1<<(highBit1) - 1return num ^ mask }

空间计算:现实与数字世界的无缝融合

随着增强现实&#xff08;AR&#xff09;、虚拟现实&#xff08;VR&#xff09;、物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;的不断进步&#xff0c;空间计算&#xff08;Spatial Computing&#xff09;作为一种新兴技术&#xff0c;正在成为人们…

IDEA Sping Boot 多配置文件application Maven动态切换

新建application-dev.yml与application-prod.yml pom.xml文件下添加profiles等 让idea识别出配置文件 <profiles><profile><id>dev</id><properties><!-- 环境标识&#xff0c;需要与配置文件的名称相对应 --><profiles.active>dev&…

安装和配置k8s可视化UI界面dashboard-1.20.6

安装和配置k8s可视化UI界面dashboard-1.20.6 1.环境规划2.初始化服务器1&#xff09;配置主机名2&#xff09;设置IP为静态IP3&#xff09;关闭selinux4&#xff09;配置主机hosts文件5&#xff09;配置服务器之间免密登录6&#xff09;关闭交换分区swap&#xff0c;提升性能7&…

2013年国赛高教杯数学建模A题车道被占用对城市道路通行能力的影响解题全过程文档及程序

2013年国赛高教杯数学建模 A题 车道被占用对城市道路通行能力的影响 车道被占用是指因交通事故、路边停车、占道施工等因素&#xff0c;导致车道或道路横断面通行能力在单位时间内降低的现象。由于城市道路具有交通流密度大、连续性强等特点&#xff0c;一条车道被占用&#x…

ubuntu22.04 ROS2 - 安装

参考链接:Ubuntu 22.04 LTS安装ROS2 (ros-humble-desktop)-CSDN博客 1、安装测试 ros2 run demo_nodes_cpp listener再开一个终端ros2 run demo_nodes_cpp listener2、小海龟模拟器 ros2 run turtlesim turtlesim_noderos2 run turtlesim turtle_teleop_key两个终端分别执行…