首页 > 其他分享 >【云原生技术】Docker容器进阶知识

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

时间:2024-10-13 09:19:17浏览次数:8  
标签:原生 容器 进阶 -- namespace cgroup 进程 Docker 资源

文章目录

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 参数来创建或加入一个用户定义的网络。同样,对于存储资源,你可以根据需要挂载多个卷或目录。

标签:原生,容器,进阶,--,namespace,cgroup,进程,Docker,资源
From: https://blog.csdn.net/wendao76/article/details/142798755

相关文章

  • c语言进阶版第19课—文件操作
    文章目录1.文件1.1文件的作用1.2文件是什么1.3文件名1.4二进制文件和文本文件2.文件的打开和关闭2.1流和标准流2.2文件指针2.3文件的打开和关闭2.4文件的顺序读写2.4.1fputc函数2.4.2fgetc函数2.4.3fputs函数2.4.4fgets函数2.4.5fprintf函数2.4.6fscanf......
  • 开发与部署项目依赖管理之旅:Docker和venv区别
    Docker与venv的区别Docker和虚拟环境(venv)都是用于管理依赖关系和隔离环境的工具,但它们服务的目的和特点有所不同。下面是它们的详细比较。虚拟环境(venv)目的:特定于Python:venv专为Python项目设计,用于管理依赖关系并创建隔离环境。依赖管理:用于在项目中管理Python包的安装,不影......
  • 第105天:权限提升-Linux系统&Docker挂载&Rsync未授权&Sudo-CVE&Polkit-CVE
    演示案例Linux-Rsync未授权访问覆盖-本地Linux-Docker组用户挂载目录-本地Linux-Sudo(CVE-2021-3156)-本地Linux-Polkit(CVE-2021-4034)-本地Rsync(未授权访问)Rsync是linux下一款数据备份工具,默认开启873端口https://vulhub.org/#/environments/rsync/common/借助Linux默认......
  • JavaScript进阶笔记--深入对象-内置构造函数及案例
    深入对象创建对象三种方式利用对象字面量newObject({…})利用构造函数//1.字面量创建对象constobj1={name:'pig',age:18};console.log(obj1);//{name:"pig",age:18}//2.构造函数创建对象functionPig(name,age){......
  • 记一次docker overlay2目录空间占用过高问题
    背景最近需要频繁本地构建镜像以及调试POD,导致磁盘空间告警分析查看当前磁盘使用情况#df-h发现这个目录下占用了不少空间docker常见的造成磁盘告警的原因有,知道原因之后就可以开始清理工作了/var/lib/docker/containers#容器/var/lib/docker/volumes#数据卷......
  • 昇思MindSpore进阶教程--模型推理总览
    大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。技术上主攻前端开发、鸿蒙开发和AI算法研究。努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧MindSpore可以基于训练好的模型,在不同的硬件平台上执行推理任务。Atlas200/300/500推理产品是面向......
  • JAVASE进阶面试题大总结
    ​ 面向对象1.解释一下什么是继承在编程领域,“继承”是面向对象编程中的一个重要概念。继承是指一个类(称为子类或派生类)可以从另一个类(称为父类或基类)获取属性和方法。通过继承,子类能够重用父类的代码和功能,同时还可以添加新的属性和方法,或者修改父类中已有的方法的实现,以......
  • 修改Docker镜像和容器的默认存储目录(迁移原有数据)
    docker根目录占用的磁盘空间太大,将其迁移到新的磁盘上,后续的镜像和容器存储空间将在新的磁盘上1、查看docker现有的存储目录dockerinfo在打印的信息中查看DockerRootDir,即为当前的根目录,默认是/var/lib/docker,如下图:2、查看docker的service位置systemctlstatusdocker.s......
  • Docker中Mysql容器内如何执行SQL文件?
    Docker中Mysql容器内如何执行SQL文件?查看当前运行的容器dockerps拷贝sql文件到mysql容器中sudodockercp/root/sqlfile/423d23129a6b:/home/temp将sqlfile文件夹下的init.sql数据库拷贝到【423d23129a6b容器】下的/home/temp/文件夹下。进入mysql容器内部dockerex......
  • docker入门(二)之容器命令及私有仓库的部署(本地和harbor)
    容器命令:1.启动容器接下来演示在docker下运行一个ubuntu系统,从中学习各容器命令。--name="容器新名字"为容器指定一个名称(不指定的话会随机分配一个名字)。-d:后台运行容器并返回容器ID,也就启动守护式容器(后台运行)-i:以交互模式运行容器,通常与-t同时使用-t:为......