OpenEuler容器化实践
OpenEuler容器化实践
一、 实验目的
- 什么是容器化:学会容器化是什么,了解标准化规范(OCI)。
- iSulad 容器实践:了解什么是 iSula,学会使用 iSulad。
- 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基金会主导下的轻量级的开源管理项目。旨在为容器格式和运行时构建开放的行业标准。
- OCI Runtime Spec(运行时规范):定义了如何根据配置及文件系统包启动一个容器。
- 例如:
runc(Docker使用),lcr(iSula使用)。
- 例如:
- 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 的安装和配置
-
下载iSulad (iSulad的安装、升级、卸载均需要使用root权限)
yum install -y iSulad -
启动 iSulad
systemctl start isulad -
配置镜像
vim /etc/isulad/daemon.json修改的镜像仓库如下,可自行配置其它的镜像仓库
"registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.1panel.live", "https://hub.rat.dev" ] -
重启iSulad
systemctl restart isulad
2.4 iSulad 的 docker 镜像管理
-
登录到镜像仓库
isula login命令用于登录到镜像仓库。登录成功后可以使用isula pull命令从该镜像仓库拉取镜像。如果镜像仓库不需要密码,则拉取镜像前不需要执行该命令。
isula login [OPTIONS] SERVER -
从镜像仓库退出登录
isula logout命令用于从镜像仓库退出登录。退出登录成功后再执行isula pull命令从该镜像仓库拉取镜像会因为未认证而拉取失败。
isula logout SERVER -
从镜像仓库拉取镜像到本地。
isula pull [OPTIONS] NAME[:TAG]拉取 nginx 镜像.
isula pull nginx -
查看镜像
isula tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]查看镜像是否拉取成功。
isula images
-
添加镜像标签
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 结果,可以看到可以随意修改名字和标签

-
删除镜像
删除一个或多个镜像。
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 的容器管理
-
创建容器
isula create 命令用于创建一个新的容器。容器引擎会使用指定的容器镜像创建容器读写层,或者使用指定的本地rootfs作为容器的运行环境。创建完成后,会将容器的ID输出到标准输出,后续可以使用isula start 命令启动该容器。新创建的容器状态为inited状态。
isula create [OPTIONS] IMAGE [COMMAND] [ARG...]先拉取镜像 busybox ,再创建容器
isula pull busybox isula create busybox可以看到输出了容器的 id

-
启动容器
isula start命令用于启动一个或多个容器。
isula start [OPTIONS] CONTAINER [CONTAINER...]使用之前输出的容器 id 启动容器
isula start f8331d7c7506da30799c0bda3a3324ede8c36986481f22f96e0f22415d62a8f7 -
运行容器
isula run命令用于创建一个新的容器。会使用指定的容器镜像创建容器读写层,并且为运行指定的命令做好准备。创建完成后,使用指定的命令启动该容器。run命令相当于create然后start容器。
isula run [OPTIONS] ROOTFS|IMAGE [COMMAND] [ARG...]运行容器 busybox
isula run -itd busybox -
接入容器
isula attach 命令用于将当前终端的标准输入、标准输出和标准错误连接到正在运行的容器。
原生 docker attach 容器会直接进入容器,而isulad attach 容器后需要敲一个回车才进入。
isula attach [OPTIONS] CONTAINER进入 busybox
isula attach 9817c89fd2f564c4a940d96134cf2f5043953643b51fa9ea23ad90b649858e6a可以看到 busybox 的目录

-
重命名容器
isula rename [OPTIONS] OLD_NAME NEW_NAME重命名为 my_busybox
isula rename 9817c89fd2f564c4a940d96134cf2f5043953643b51fa9ea23ad90b649858e6a my_busybox -
查询单个容器信息
isula inspect提供了容器的详细信息。
isula inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]查询 busybox
isula inspect busybox

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

-
在容器中执行新命令
isula exec 命令用于正在运行的容器中运行一个新命令。新执行的命令将在容器的默认目录中运行。如果基础镜像指定了自定义目录,则将使用该目录。
isula exec [OPTIONS] CONTAINER COMMAND [ARG...]查看 busybox 的目录
isula exec my_busybox ls

-
停止容器
isula stop命令用于停止一个或多个运行中的容器。首先向容器中的首进程会发送SIGTERM信号,在指定时间(默认为10s)内容器未停止时,会发送SIGKILL。
isula stop [OPTIONS] CONTAINER [CONTAINER...]停止 busybox
isula stop my_busybox -
强制停止容器
isula kill命令用于强制停止一个或多个运行中的容器。
isula kill [OPTIONS] CONTAINER [CONTAINER...] -
重启容器
isula restart 用于重启一个或者多个容器。
isula restart [OPTIONS] CONTAINER [CONTAINER...]重启 busybox
isula restart my_busybox -
查看容器中的进程信息
isula top用于查看容器中的进程信息。
isula top [OPTIONS] container [ps options]查看 busybox
isula top my_busybox

-
查看容器中使用的资源
isula stats用于实时显示资源使用的统计信息。
isula stats [OPTIONS] [CONTAINER...]查看 busybox
isula stats my_busybox

-
获取容器日志
isula logs用于获取容器的日志。
isula logs [OPTIONS] [CONTAINER...]查看 busybox
isula logs my_busybox

-
容器与主机之间的数据拷贝
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

-
暂停容器中的所有进程
isula pause用于暂停一个或者多个容器中的所有进程。
isula pause [OPTIONS] CONTAINER [CONTAINER...] -
恢复容器中的所有进程
isula unpause用于恢复一个或者多个容器中的所有进程, 为isula pause的逆过程。
isula unpause [OPTIONS] CONTAINER [CONTAINER...] -
删除容器
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 能力。 -
功能描述
- openEuler 已兼容 CANN、CUDA 等硬件SDK,以及 TensorFlow、PyTorch、MindSpore 等相应的 AI 框架软件,支持 AI 应用在 openEuler 上高效开发与运行。
- 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。
-
找到控制面板-程序和功能-启用或关闭Windows功能,选中“适用于Linux的Windows子系统”,然后点击确定

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

-
创建账号

-
确认版本
cat /etc/os-release

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

-
配置 wslconfig
在路径 %UserProfile% 下创建 .wslconfig 文件。 例如 C:\Users\SamDong,
SamDong 替换为自己的用户名,添加为以下内容。这样可以让 wsl2 从默认的 NAT 连接改为镜像网络模式,直接共用 Windows 宿主机的物理网卡。[wsl2] networkingMode=mirrored然后在 PowerShell 中重启 wsl2
wsl --shutdown
3.3 安装和配置 AI 容器镜像
-
安装 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 -
配置 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 -
安装 nvidia-container-toolkit, nvidia-container-runtime
sudo yum install -y nvidia-container-toolkit nvidia-container-runtime -
修改 /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 -
容器镜像名称
目前,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 软件内容区分适用平台。
-
-
拉取镜像
# image 为仓库名,如 openeuler/cann,tag 为目标镜像的 TAG docker pull image:tag拉取基础 SDK 环境
sudo docker pull hub.oepkgs.net/openeuler/cuda:13.0.0-oe2403lts -
使用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 -
测试容器
sudo docker ps

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

可以看到输出成功,代表成功运行容器。
- 点赞
- 收藏
- 关注作者





评论(0)