OpenEuler容器化实践

举报
pluto1447 发表于 2025/12/21 00:48:10 2025/12/21
【摘要】 本实验深入探讨了容器化技术原理,涵盖Namespace隔离、Cgroups限制及UnionFS分层存储等核心机制。通过实践,掌握了openEuler轻量级引擎iSulad的镜像与容器全生命周期管理。最后,利用WSL2环境部署了openEuler AI容器镜像,成功配置CUDA环境并调用GPU算力,验证了其在AI开发中开箱即用、高效集成的优势。

OpenEuler容器化实践

一、 实验目的

  1. 什么是容器化:学会容器化是什么,了解标准化规范(OCI)。
  2. iSulad 容器实践:了解什么是 iSula,学会使用 iSulad。
  3. openEuler AI 容器镜像实践:学会openEuler AI 容器镜像的基础使用。

二、 实验环境

  • 宿主机:Windows 10/11 或 macOS
  • 虚拟机软件:VMware Workstation
  • 目标系统:openEuler 22.03 LTS 或 24.03 LTS (x86_64 架构)
  • 开发工具:VS Code

三、 实验内容与步骤

1. 什么是容器化

1.1 容器化的概念

不同于硬件级虚拟化(Hardware Virtualization,如 VMware、KVM),容器化不模拟完整的硬件指令集,也不运行完整的 Guest OS。
容器化是由 Linux 内核的三大核心技术支撑构建的:

A. Namespaces(命名空间)—— 实现“环境隔离”

这是 Linux 内核提供的一种资源隔离机制。它让进程“误以为”自己独占了整个操作系统。

  • 作用:它对全局系统资源进行封装隔离,使得处于不同 Namespace 的进程拥有独立的全局系统资源标识。
  • 具体维度
    • PID Namespace:进程隔离(容器内 PID 为 1,宿主机上可能是 12345)。
    • NET Namespace:网络隔离(独立的 IP、端口、路由表、网卡)。
    • MNT Namespace:文件系统挂载点隔离(独立的文件系统视图)。
    • IPC Namespace:进程间通信隔离(独立的信号量、消息队列)。
    • UTS Namespace:主机名隔离。
    • USER Namespace:用户权限隔离。

B. Cgroups(Control Groups,控制组)—— 实现“资源限制”

Namespaces 只是把进程藏起来(看不见别人),但没法阻止它把电脑卡死。Cgroups 负责限制资源。

  • 作用:限制、记录和隔离进程组(Process Groups)所使用的物理资源。
  • 具体维度
    • CPU:限制 CPU 使用率或分配 CPU 时间片(Shares)。
    • Memory:限制最大内存使用量(OOM Killer 触发阈值)。
    • Block I/O:限制磁盘读写速度(IOPS/BPS)。

C. UnionFS(Union File System,联合文件系统)—— 实现“分层存储”

这是容器镜像(Image)精简且高效的核心。

  • 机制写时复制 (Copy-on-Write, CoW)分层叠加 (Layered)
  • 解释
    • 容器镜像由多个只读层 (Read-only Layers) 组成(如 OS层、依赖层、代码层)。
    • 当容器启动时,引擎会在镜像最上层挂载一个读写层 (Read-Write Layer)
    • 对文件的修改只发生在读写层,底层的只读层永远不会被改变(不可变基础设施 Immutable Infrastructure)。这使得由同一个镜像启动的 100 个容器,底层文件是共享的,极大节省了磁盘空间。
    • 技术实现:在 Linux 上常用的驱动是 Overlay2

1.2 标准化规范(OCI)

标准化规范(OCI) 是在Linux基金会主导下的轻量级的开源管理项目。旨在为容器格式和运行时构建开放的行业标准。

  1. OCI Runtime Spec(运行时规范):定义了如何根据配置及文件系统包启动一个容器。
    • 例如:runc (Docker使用), lcr (iSula使用)。
  2. OCI Image Spec(镜像规范):定义了镜像的文件格式、manifest 文件、配置信息的标准结构。
    • 这保证了 Docker Build 出来的镜像,iSula 可以直接 Load。

2. iSulad 容器实践

2.1 iSula是什么

iSula 是由 openEuler 推出的轻量级容器解决方案,命名灵感源于"子弹蚁"以小体积承载高能量的特质。其核心组件包括 iSulad 容器引擎、kata-containers 安全容器和syscontainer-tools 系统容器插件,通过 Linux 容器技术实现系统级虚拟化,支持 CRI/OCI 标准接口,兼容 runc/kata 等多种运行时。iSula 具备轻量化、快速启动、灵活配置等特性,适用于 IoT、边缘计算和云计算等多场景,内存占用可低于15M。

2.1 iSulad是什么

iSulad 是一个新的通用容器引擎,提供统一的架构设计来满足CT和IT领域的不同需求。

iSulad 的特点如下:

轻量语言:C/C++,Rust on the way

北向接口:提供CRI接口,支持对接Kubernets;同时提供便捷使用的命令行

南向接口:支持OCI runtime和镜像规范,支持平滑替换

容器形态:支持系统容器、虚机容器等多种容器形态

扩展能力:提供插件化架构,可根据用户需要开发定制化插件

以上的特点使得 iSulad 可以不受硬件规格和架构的限制,更小的底噪开销也使得它的可应用领域更为广泛。

2.3 iSulad 的安装和配置

  1. 下载iSulad (iSulad的安装、升级、卸载均需要使用root权限)

    yum install -y iSulad
    
  2. 启动 iSulad

    systemctl start isulad
    
  3. 配置镜像

    vim /etc/isulad/daemon.json
    

    修改的镜像仓库如下,可自行配置其它的镜像仓库

    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://docker.1panel.live",
        "https://hub.rat.dev"
    ]
    
  4. 重启iSulad

    systemctl restart isulad
    

2.4 iSulad 的 docker 镜像管理

  1. 登录到镜像仓库

    isula login命令用于登录到镜像仓库。登录成功后可以使用isula pull命令从该镜像仓库拉取镜像。如果镜像仓库不需要密码,则拉取镜像前不需要执行该命令。

    isula login [OPTIONS] SERVER
    
  2. 从镜像仓库退出登录

    isula logout命令用于从镜像仓库退出登录。退出登录成功后再执行isula pull命令从该镜像仓库拉取镜像会因为未认证而拉取失败。

    isula logout SERVER
    
  3. 从镜像仓库拉取镜像到本地。

    isula pull [OPTIONS] NAME[:TAG]
    

    拉取 nginx 镜像.

    isula pull nginx
    
  4. 查看镜像

    isula tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
    

    查看镜像是否拉取成功。

    isula images
    

  5. 添加镜像标签

    tag命令用于添加镜像标签

    isula tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
    

    为 ngnix 添加 tag

    isula tag ngnix xingn
    isula tag nginx:latest nginx:v1.0
    isula tag nginx:latest a:1
    

    使用 isula images 查看 tag 结果,可以看到可以随意修改名字和标签

  1. 删除镜像

    删除一个或多个镜像。

    isula rmi [OPTIONS] IMAGE [IMAGE...]
    

    删除 nginx tag 和 镜像

    isula rmi xingn
    isula rmi nginx:v1.0
    isula rmi a:1
    isula rmi nginx
    

2.5 iSulad 的容器管理

  1. 创建容器

    isula create 命令用于创建一个新的容器。容器引擎会使用指定的容器镜像创建容器读写层,或者使用指定的本地rootfs作为容器的运行环境。创建完成后,会将容器的ID输出到标准输出,后续可以使用isula start 命令启动该容器。新创建的容器状态为inited状态。

    isula create [OPTIONS] IMAGE [COMMAND] [ARG...]
    

    先拉取镜像 busybox ,再创建容器

    isula pull busybox
    isula create busybox
    

    可以看到输出了容器的 id

  1. 启动容器

    isula start命令用于启动一个或多个容器。

    isula start [OPTIONS] CONTAINER [CONTAINER...]
    

    使用之前输出的容器 id 启动容器

    isula start f8331d7c7506da30799c0bda3a3324ede8c36986481f22f96e0f22415d62a8f7
    
  2. 运行容器

    isula run命令用于创建一个新的容器。会使用指定的容器镜像创建容器读写层,并且为运行指定的命令做好准备。创建完成后,使用指定的命令启动该容器。run命令相当于create然后start容器。

    isula run [OPTIONS] ROOTFS|IMAGE [COMMAND] [ARG...]
    

    运行容器 busybox

    isula run -itd busybox
    
  3. 接入容器

    isula attach 命令用于将当前终端的标准输入、标准输出和标准错误连接到正在运行的容器。

    原生 docker attach 容器会直接进入容器,而isulad attach 容器后需要敲一个回车才进入。

    isula attach [OPTIONS] CONTAINER
    

    进入 busybox

    isula attach 9817c89fd2f564c4a940d96134cf2f5043953643b51fa9ea23ad90b649858e6a
    

    可以看到 busybox 的目录

  1. 重命名容器

    isula rename [OPTIONS] OLD_NAME NEW_NAME
    

    重命名为 my_busybox

    isula rename 9817c89fd2f564c4a940d96134cf2f5043953643b51fa9ea23ad90b649858e6a my_busybox
    
    
  2. 查询单个容器信息

    isula inspect提供了容器的详细信息。

    isula inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]
    

    查询 busybox

    isula inspect busybox
    

  1. 查询所有容器信息

    isula ps 用于查询所有容器的信息。

    isula ps [OPTIONS]
    

    查询容器

    isula ps -a
    

    可以看到改名成功。其中 CONTAINER ID 是机器生成的唯一哈希值,NAMES 是用户指定或系统生成的易读标识符,可以在创建时 --name 参数给容器起名。使用之前命令时两个都可以混用。

  1. 在容器中执行新命令

    isula exec 命令用于正在运行的容器中运行一个新命令。新执行的命令将在容器的默认目录中运行。如果基础镜像指定了自定义目录,则将使用该目录。

    isula exec [OPTIONS] CONTAINER COMMAND [ARG...]
    

    查看 busybox 的目录

    isula exec my_busybox ls
    

  1. 停止容器

    isula stop命令用于停止一个或多个运行中的容器。首先向容器中的首进程会发送SIGTERM信号,在指定时间(默认为10s)内容器未停止时,会发送SIGKILL。

    isula stop [OPTIONS] CONTAINER [CONTAINER...]
    

    停止 busybox

    isula stop my_busybox
    
  2. 强制停止容器

    isula kill命令用于强制停止一个或多个运行中的容器。

    isula kill [OPTIONS] CONTAINER [CONTAINER...]
    
  3. 重启容器

    isula restart 用于重启一个或者多个容器。

    isula restart [OPTIONS] CONTAINER [CONTAINER...]
    

    重启 busybox

    isula restart my_busybox
    
  4. 查看容器中的进程信息

    isula top用于查看容器中的进程信息。

    isula top [OPTIONS] container [ps options]
    

    查看 busybox

    isula top my_busybox
    

  1. 查看容器中使用的资源

    isula stats用于实时显示资源使用的统计信息。

    isula stats [OPTIONS] [CONTAINER...]
    

    查看 busybox

    isula stats my_busybox
    

  1. 获取容器日志

    isula logs用于获取容器的日志。

    isula logs [OPTIONS] [CONTAINER...]
    

    查看 busybox

    isula logs my_busybox
    

  1. 容器与主机之间的数据拷贝

    isula cp 用于容器与主机之间的数据拷贝,仅支持runtime类型为lcr的容器。

    isula cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
    isula cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
    

    把 iSula.txt 复制到 busybox 的 /home 目录下

    echo hello iSula > iSula.txt
    isula cp iSula.txt my_busybox:/home
    isula exec my_busybox cat /home/iSula.txt
    

  1. 暂停容器中的所有进程

    isula pause用于暂停一个或者多个容器中的所有进程。

    isula pause [OPTIONS] CONTAINER [CONTAINER...]
    
  2. 恢复容器中的所有进程

    isula unpause用于恢复一个或者多个容器中的所有进程, 为isula pause的逆过程。

    isula unpause [OPTIONS] CONTAINER [CONTAINER...]
    
  3. 删除容器

    isula rm命令用于删除一个或多个容器。

    isula rm [OPTIONS] CONTAINER [CONTAINER...]
    

    删除 busybox

    isula rm -f my_busybox
    

3 openEuler AI 容器镜像实践

3.1 什么是 openEuler AI 容器镜像

  • 开箱即用

    openEuler 兼容 NVIDIA、Ascend 等主流算力平台的软件栈,为用户提供高效的开发运
    行环境。通过将不同 AI 算力平台的软件栈进行容器化封装,即可简化用户部署过程,提供
    开箱即用的体验。同时,openEuler 也提供丰富的 AI 框架,方便大家快速在 openEuler 上使
    用 AI 能力。

  • 功能描述

    1. openEuler 已兼容 CANN、CUDA 等硬件SDK,以及 TensorFlow、PyTorch、MindSpore 等相应的 AI 框架软件,支持 AI 应用在 openEuler 上高效开发与运行。
    2. openEuler AI 软件栈容器化封装优化环境部署过程,并面向不同场景提供以下三类容器镜像。
    • SDK 镜像:以 openEuler 为基础镜像,安装相应硬件平台的 SDK,如 Ascend 平台的 CANN 或 NVIDIA 的 CUDA 软件。
    • AI 框架镜像:以 SDK 镜像为基础,安装 AI 框架软件,如 PyTorch 或 TensorFlow。此外,通过此部分镜像也可快速搭建 AI 分布式场景,如 Ray 等 AI 分布式框架。
    • 模型应用镜像:在 AI 框架镜像的基础上,包含完整的工具链和模型应用。

3.2 安装 wsl2

因为 openEuler AI 容器镜像需要硬件支持,而 vmware 不支持安装硬件驱动或获取主机的硬件,因此使用 windows 的 wsl2 (Linux 的 Windows 子系统)来运行 openEuler。

  1. 找到控制面板-程序和功能-启用或关闭Windows功能,选中“适用于Linux的Windows子系统”,然后点击确定

  2. 在 Microsoft Store 里搜索 openEuler,下载 openEuler 24.03, 然后打开

  3. 创建账号

  4. 确认版本

    cat /etc/os-release
    

  1. 查看 NVIDIA 驱动
    nvidia-smi
    
    可以看到主机的显卡

  1. 配置 wslconfig

    在路径 %UserProfile% 下创建 .wslconfig 文件。 例如 C:\Users\SamDong,
    SamDong 替换为自己的用户名,添加为以下内容。这样可以让 wsl2 从默认的 NAT 连接改为镜像网络模式,直接共用 Windows 宿主机的物理网卡。

    [wsl2]
    networkingMode=mirrored
    

    然后在 PowerShell 中重启 wsl2

    wsl --shutdown
    

3.3 安装和配置 AI 容器镜像

  1. 安装 docker

    # 更换为腾讯云镜像源并使用 CentOS 8 的镜像
    sudo tee /etc/yum.repos.d/docker-ce.repo <<-'EOF'
    [docker-ce-stable]
    name=Docker CE Stable - Tencent Cloud
    baseurl=https://mirrors.cloud.tencent.com/docker-ce/linux/centos/8/x86_64/stable
    enabled=1
    gpgcheck=1
    gpgkey=https://mirrors.cloud.tencent.com/docker-ce/linux/centos/gpg
    EOF
    
    # 删掉旧缓存
    sudo dnf clean all
    
    # 建立新的缓存
    sudo dnf makecache
    
    # 精准安装
    sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin --exclude=docker-ce-rootless-extras
    
    # 设置开机自启
    sudo systemctl enable --now docker
    
  2. 配置 yum

     curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
     sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
    
  3. 安装 nvidia-container-toolkit, nvidia-container-runtime

    sudo yum install -y nvidia-container-toolkit nvidia-container-runtime
    
  4. 修改 /etc/docker/daemon.json 为以下内容

    {
        "registry-mirrors": [
            "https://docker.m.daocloud.io",
            "https://huecker.io"
        ],
        "exec-opts": ["native.cgroupdriver=systemd"],
        "runtimes": {
            "nvidia": {
                "path": "nvidia-container-runtime",
                "runtimeArgs": []
            }
        }
    }
    

    重启服务

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  5. 容器镜像名称

    目前,openEuler 已发布支持 Ascend 和 NVIDIA 平台的容器镜像,获取路径如下:

    • openeuler/cann 存放 SDK 类镜像,在 openEuler 基础镜像之上安装 CANN 系列软件,适用于 Ascend 环境。

    • openeuler/cuda 存放 SDK 类镜像,在 openEuler 基础镜像之上安装 CUDA 系列软件,适用于 NVIDIA 环境。

    • openeuler/pytorch 存放 AI 框架类镜像,在 SDK 镜像基础之上安装 PyTorch,根据安装的 SDK 软件内容区分适用平台。

    • openeuler/tensorflow 存放 AI 框架类镜像,在 SDK 镜像基础之上安装 TensorFlow,根据安装的 SDK 软件内容区分适用平台。

    • openeuler/llm 存放模型应用类镜像,在 AI 框架镜像之上包含特定大模型及工具链,根据安装的 SDK 软件内容区分适用平台。

  6. 拉取镜像

    # image 为仓库名,如 openeuler/cann,tag 为目标镜像的 TAG
    docker pull image:tag
    

    拉取基础 SDK 环境

    sudo docker pull hub.oepkgs.net/openeuler/cuda:13.0.0-oe2403lts
    
  7. 使用docker run 命令启动容器

    docker run --gpus all -d -ti image:tag
    

    启动 cuda

    sudo docker run --gpus all -d -ti hub.oepkgs.net/openeuler/cuda:13.0.0-oe2403lts
    
  8. 测试容器

    sudo docker ps
    

```bash
# 把 b9271959a790 换成你的 CONTAINER ID
sudo docker exec -it b9271959a790  nvidia-smi
```

可以看到输出成功,代表成功运行容器。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。