MENU

基于OpenEuler的iSulad容器引擎部署实践手册

• October 23, 2025 • Read: 3 • 编码👨🏻‍💻

一、环境信息

名称版本
OpEneuler22.03 LTS SP4
iSulad2.1.5
OCI1.0.1
CNI1.5.0

二、iSulad介绍

2.1 iSulad 是什么?

iSulad 是一个由华为开源并贡献给开放原子开源基金的轻量级、符合行业标准的容器运行时引擎。它的名字源自英文 “Lightweight” 和 “Daemon” 的组合,意为“轻量的守护进程”,这直接点明了其核心设计目标:高性能、低损耗、高安全性

iSulad 是云原生计算基金会(CNCF)的开放容器倡议(OCI)标准的实现,能够运行标准的容器镜像。

2.2 诞生背景与设计目标

在容器技术发展的早期,Docker 是事实上的标准。但随着 Kubernetes 和云原生生态的成熟,社区发现 Docker 的“一体化”架构(集成了运行时、镜像构建、网络、存储等)显得臃肿,并且存在以下问题:

  1. 单一故障点:Docker Daemon 守护进程如果崩溃,会影响所有容器。
  2. 安全性:庞大的守护进程拥有过高权限,攻击面较大。
  3. 灵活性不足:难以替换其中的某个组件(如网络、运行时)。

为了解决这些问题,社区开始推崇“关注点分离”的架构。Kubernetes 推出了 CRI 标准,将容器运行时与 kubelet 解耦。iSulad 正是在这种背景下诞生的,它被设计为:

  • 专一的运行时:只专注于管理容器的生命周期(创建、运行、停止、删除)。
  • 兼容开放标准:原生支持 OCI(镜像与运行时标准)和 CRI(Kubernetes 容器运行时接口)。
  • 面向云原生:为 Kubernetes 和大规模数据中心环境量身定制。

2.3 核心架构与特点

2.3.1 轻量级与高性能

  • iSulad 本身用 C 语言实现,资源占用(CPU、内存)极低,启动速度非常快。
  • 相比于用 Go 语言实现的 Docker Daemon 或 containerd,它的内存开销可以小一个数量级,这对于资源敏感的边缘计算、物联网或高密度部署场景至关重要。

2.3.2 模块化设计

这是 iSulad 最核心的设计理念。它将功能解耦为多个独立的模块:

  • 容器运行时核心:iSulad 守护进程本身。
  • 网络:通过 CNI 接口与外部网络插件(如 Calico、Flannel)集成。
  • 存储:通过 CSI 接口与外部存储插件集成。
  • 镜像管理:最初支持 LCR(另一个轻量级组件),但现在更主流的用法是将 iSulad 作为 containerd 或 Docker 的一个 shim 运行时。在这种情况下,镜像管理、存储等高级功能由 containerd/Docker 负责,iSulad 只专注于运行容器,从而变得更轻量。

2.3.3 高安全性

iSulad 在设计之初就深度集成了多种安全特性,这也是它的一大亮点:

  • 内核安全能力:原生支持 SELinux、AppArmor、Seccomp 等。
  • 硬件虚拟化支持:可以与 Kata Containers 等安全容器运行时无缝集成,让每个容器运行在一个独立的轻量级虚拟机中,提供更强的硬件级隔离。
  • 权限管理:支持基于能力的细粒度权限控制。

2.3.4 丰富的接口支持

iSulad 提供了多种方式供用户交互:

  • 命令行工具isula命令,用法与 docker命令非常相似,例如 isula run, isula ps,降低了用户的学习成本。
  • RESTful API:提供了 REST API,便于与其他系统集成。
  • CRI 接口:这是最重要的接口。Kubernetes 的 kubelet 可以通过 CRI 接口直接与 iSulad 通信,使其可以完全替代 Docker 或 containerd,成为 Kubernetes 的容器运行时。

2.3.5 iSulad 与 Docker 的对比

特性iSuladDocker
架构理念模块化、专一、符合开放标准一体化、大而全
核心职责纯粹的容器生命周期管理容器生命周期、镜像构建、网络、存储等
资源占用极低,轻量级相对较高
安全性深度集成多种安全机制,支持安全容器支持标准安全机制,但守护进程攻击面较大
网络/存储通过 CNI/CSI 插件化实现,灵活内置一套,也可通过插件扩展
与 Kubernetes 集成原生通过 CRI 接口,路径短,高效早期通过 dockershim(已废弃),现在主要通过 CRI 到 containerd
适用场景云原生、边缘计算、IoT、高密度部署、对安全和性能要求高的场景个人开发、测试、CI/CD,以及需要一体化解决方案的场景

三、iSulad部署

3.1 前置环境[可选]

#挂载iSula默认存储路径[可选]
iSula的默认工作路径在/var/lib/isula ,最好不修改默认存储路径,可以做软链接

#建立工作目录
$ mkdir /home/application/

#格式化磁盘
$ mkfs.ext4 /dev/sdb

#磁盘永久挂载
$ vim /etc/fstab
...
/dev/sdb  /home/application  ext4 defaults 0 0
...


#使挂载生效
$ mount -a


# 创建docker 工作目录
$ mkdir -p /home/application/isula


#创建软链接
$ ln -s /home/application/isula /var/lib/

3.2 使用yum安装iSulad

  • (推荐)使用yum安装iSulad,参考命令如下:
#安装
$ yum install -y iSulad

#查看版本
[root@localhost ~]# isula version
Client:
  Version:      2.1.5
  Git commit:   5ebca976dd591a5676527be1bde950e5ce93eac0
  Built:        2025-01-08T17:42:13.924990065+08:00

Server:
  Version:      2.1.5
  Git commit:   5ebca976dd591a5676527be1bde950e5ce93eac0
  Built:        2025-01-08T17:42:13.924990065+08:00

OCI config:
  Version:      1.0.1
  Default file: /etc/default/isulad/config.json

3.3 安装CNI 网络插件

为啥需要单独安装 CNI 网络插件

Docker 采用的是“一体化”架构,“all-in-one”的设计理念,它内置了一个名为 libnetwork的网络库和默认的 bridge驱动。当你安装 Docker 时,网络功能已经包含在内。默认会创建一个 docker0的网桥,并自动为容器分配 IP 地址。

而isulad被设计为一个纯粹的、轻量级的容器运行时。它的核心职责是管理容器的生命周期(创建、运行、暂停、销毁等),确保容器以隔离的方式运行。它刻意地将网络、存储等高级功能从核心引擎中剥离出去。网络功能被看作是一个独立的、可插拔的模块。

CNI(Container Network Interface)是一个由 CNCF 维护的标准接口规范。它定义了容器运行时如何与网络插件交互。
iSulad 通过实现 CRI(Container Runtime Interface)接口,可以无缝地与 Kubernetes 集成。而 Kubernetes 的网络模型正是基于 CNI 的。因此,iSulad 使用 CNI 是为了更好地融入云原生生态体系(尤其是 Kubernetes)。Kubernetes 本身不管理网络,它要求每个节点上的容器运行时(如 iSulad、containerd)通过 CNI 插件来为 Pod 设置网络。

所以,当你为 iSulad 安装并配置好 CNI 插件(如 bridge、host-local,或更复杂的 Calico、Flannel)后,它就能提供与 Docker 同等甚至更强大的网络能力。

  • CNI 网络插件地址: https://github.com/containernetworking
  • 经过测试建议安装v0.9.0及以上版本的CNI插件,这里以v1.5.0版本为例。

    【ps:当iSulad=2.1.5的时候,CNI 1.5.0 以上的版本安装报错】

#创建 CNI 二进制存放路径
$ mkdir -p /opt/cni/bin/

#x86架构
$ wget https://github.com/containernetworking/plugins/releases/download/v1.5.0/cni-plugins-linux-amd64-v1.5.0.tgz

#解压
$ tar -xf cni-plugins-linux-amd64-v1.5.0.tgz -C /opt/cni/bin/

$ ls -l /opt/cni/bin/
总用量 81536
-rwxr-xr-x 1 1001 127  4272394  5月 20  2024 bandwidth
-rwxr-xr-x 1 1001 127  4787319  5月 20  2024 bridge
-rwxr-xr-x 1 1001 127 11430474  5月 20  2024 dhcp
-rwxr-xr-x 1 1001 127  4422354  5月 20  2024 dummy
-rwxr-xr-x 1 1001 127  4943785  5月 20  2024 firewall
-rwxr-xr-x 1 1001 127  4344044  5月 20  2024 host-device
-rwxr-xr-x 1 1001 127  3679567  5月 20  2024 host-local
-rwxr-xr-x 1 1001 127  4440601  5月 20  2024 ipvlan
-rw-r--r-- 1 1001 127    11357  5月 20  2024 LICENSE
-rwxr-xr-x 1 1001 127  3750042  5月 20  2024 loopback
-rwxr-xr-x 1 1001 127  4478854  5月 20  2024 macvlan
-rwxr-xr-x 1 1001 127  4228716  5月 20  2024 portmap
-rwxr-xr-x 1 1001 127  4600833  5月 20  2024 ptp
-rw-r--r-- 1 1001 127     2343  5月 20  2024 README.md
-rwxr-xr-x 1 1001 127  3956598  5月 20  2024 sbr
-rwxr-xr-x 1 1001 127  3223795  5月 20  2024 static
-rwxr-xr-x 1 1001 127  4503238  5月 20  2024 tap
-rwxr-xr-x 1 1001 127  3837627  5月 20  2024 tuning
-rwxr-xr-x 1 1001 127  4439832  5月 20  2024 vlan
-rwxr-xr-x 1 1001 127  4102988  5月 20  2024 vrf

3.4 配置daemon.json配置文件

  • 配置 CNI
$ vim /etc/isulad/daemon.json
    ...
    "cni-bin-dir": "/opt/cni/bin",
    "cni-conf-dir": "/etc/cni/net.d",
    ...

cni-bin-dir为cni二进制文件的目录,不配置默认为/opt/cni/bincni-conf-dir为网络配置文件的目录,不配置默认为/etc/cni/net.d。若使用默认的目录,可不配置daemon.json文件,直接启动isulad。

  • 配置镜像仓库地址【镜像加速地址】
$ vim /etc/isulad/daemon.json
    ...
  "registry-mirrors": [
    "https://docker.hpcloud.cloud",
    "https://docker.m.daocloud.io",
    "https://docker.mybacc.com",
    "https://docker.1panel.live",
    "http://mirrors.ustc.edu.cn",
    "https://docker.chenby.cn",
    "http://mirror.azure.cn",
    "https://dockerpull.org",
    "https://dockerhub.icu",
    "https://hub.rat.dev",
    "https://proxy.1panel.live",
    "https://docker.1panel.top",
    "https://docker.m.daocloud.io",
    "https://docker.1ms.run",
    "https://docker.ketches.cn"
  ],
    ...

3.5 重启 isulad并开机自启

$ systemctl restart isulad.service
$ systemctl enable isulad.service

四、iSulad 容器管理

4.1 容器基本操作

4.1.1 创建容器

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

语法:

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

常用参数:

  • --name=NAME:指定容器名称
  • -i, --interactive:保持容器的标准输入打开
  • -t, --tty:分配一个伪终端
  • -d, --detach:后台运行容器
  • -e, --env:设置环境变量
  • -p, --publish:端口映射,需要配置CNI 网络,并创建网桥
  • -v, --volume:挂载卷
  • --rm:容器退出时自动删除

示例:

# 创建一个基础容器
$ isula create --name mycontainer busybox

# 创建一个交互式容器
$ isula create -it --name interactive-container busybox /bin/sh

# 创建容器并设置环境变量
$ isula create --name env-container -e ENV_VAR=value busybox

# 创建容器并挂载目录
$ isula create --name data-container -v /host/data:/container/data busybox

4.1.2 启动容器

isula start 命令用于启动一个或多个已创建的容器。

语法:

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

常用参数:

  • -a, --attach:附加到容器的标准输入、输出和错误流
  • -i, --interactive:保持标准输入打开

示例:

# 启动容器
$ isula start mycontainer

# 启动容器并附加到终端
$ isula start -a mycontainer

# 启动多个容器
$ isula start container1 container2 container3

4.1.3 运行容器

isula run 命令相当于 create + start 的组合,直接创建并启动容器。

语法:

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

示例:

# 运行一个简单的容器
$ isula run busybox echo "Hello iSulad"

# 以交互模式运行容器
$ isula run -it busybox /bin/sh

# 后台运行容器
$ isula run -d --name web-server nginx


# 运行容器并挂载目录
$ isula run -it -v /home/data:/data busybox /bin/sh

4.1.4 停止容器

isula stop 命令用于停止一个或多个正在运行的容器。

语法:

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

常用参数:

  • -t, --time:等待容器停止的时间(秒),默认为10秒

示例:

# 停止容器
$ isula stop mycontainer

# 停止容器并指定等待时间
$ isula stop -t 30 mycontainer

# 停止多个容器
$ isula stop container1 container2 container3

4.1.5 重启容器

isula restart 命令用于重启容器。

语法:

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

示例:

# 重启容器
$ isula restart mycontainer

# 重启多个容器
$ isula restart container1 container2

4.1.6 删除容器

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

语法:

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

常用参数:

  • -f, --force:强制删除正在运行的容器
  • -v, --volumes:删除与容器关联的卷

示例:

# 删除已停止的容器
$ isula rm mycontainer

# 强制删除正在运行的容器
$ isula rm -f mycontainer

# 删除多个容器
$ isula rm container1 container2 container3

# 删除所有已停止的容器
$ isula rm $(isula ps -aq --filter status=exited)

4.2 容器查看与监控

4.2.1 查看容器列表

isula ps 命令用于列出容器。

语法:

isula ps [OPTIONS]

常用参数:

  • -a, --all:显示所有容器(默认只显示运行中的)
  • -q, --quiet:只显示容器ID
  • --filter:根据条件过滤容器
  • --format:格式化输出

示例:

# 查看正在运行的容器
$ isula ps

# 查看所有容器
$ isula ps -a

# 只显示容器ID
$ isula ps -q

# 根据状态过滤容器
$ isula ps --filter status=running
$ isula ps --filter status=exited

# 根据名称过滤容器
$ isula ps --filter name=web

4.2.2 查看容器详细信息

isula inspect 命令用于查看容器的详细信息。

语法:

isula inspect [OPTIONS] CONTAINER [CONTAINER...]

示例:

# 查看容器详细信息
$ isula inspect mycontainer

# 查看多个容器信息
$ isula inspect container1 container2

# 格式化输出特定字段
$ isula inspect --format='{{.State.Status}}' mycontainer

4.2.3 查看容器日志

isula logs 命令用于查看容器的日志输出。

语法:

isula logs [OPTIONS] CONTAINER

常用参数:

  • -f, --follow:实时跟踪日志输出
  • -t, --timestamps:显示时间戳
  • --tail:显示最后N行日志
  • --since:显示指定时间之后的日志

示例:

# 查看容器日志
$ isula logs mycontainer

# 实时跟踪日志
$ isula logs -f mycontainer

# 显示最后10行日志
$ isula logs --tail 10 mycontainer

# 显示带时间戳的日志
$ isula logs -t mycontainer

4.2.4 查看容器资源使用情况

isula stats 命令用于显示容器的资源使用统计信息。

语法:

isula stats [OPTIONS] [CONTAINER...]

常用参数:

  • --no-stream:只显示一次统计信息,不持续更新

示例:

# 查看所有运行容器的资源使用情况
$ isula stats

# 查看指定容器的资源使用情况
$ isula stats mycontainer

# 只显示一次统计信息
$ isula stats --no-stream

4.2.5 查看容器内进程

isula top 命令用于查看容器内运行的进程。

语法:

isula top CONTAINER [ps OPTIONS]

示例:

# 查看容器内进程
$ isula top mycontainer

# 查看容器内进程的详细信息
$ isula top mycontainer aux

4.3 容器交互操作

4.3.1 进入容器

isula exec 命令用于在运行的容器中执行命令。

语法:

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

常用参数:

  • -i, --interactive:保持标准输入打开
  • -t, --tty:分配一个伪终端
  • -d, --detach:后台执行命令
  • -u, --user:指定用户
  • -w, --workdir:指定工作目录

示例:

# 进入容器的shell
$ isula exec -it mycontainer /bin/sh

# 在容器中执行命令
$ isula exec mycontainer ls -la

# 以指定用户身份执行命令
$ isula exec -u root mycontainer whoami

# 在指定工作目录执行命令
$ isula exec -w /tmp mycontainer pwd

4.3.2 附加到容器

isula attach 命令用于附加到正在运行的容器。

语法:

isula attach [OPTIONS] CONTAINER

示例:

# 附加到容器
$ isula attach mycontainer

4.3.3 容器文件操作

isula cp 命令用于在容器和主机之间复制文件或目录。

语法:

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

示例:

# 从容器复制文件到主机
$ isula cp mycontainer:/app/config.txt ./config.txt

# 从主机复制文件到容器
$ isula cp ./data.txt mycontainer:/app/data.txt

# 复制目录
$ isula cp mycontainer:/app/logs ./logs
$ isula cp ./config mycontainer:/app/config

4.4 容器网络管理

4.4.1 使用native网络

native网络的使用与docker相似,下面展示一些简单的操作流程。

  • 创建网络 支持指定 IP 网段,isula network create -d bridge --subnet "10.22.33.0/24" --gateway "10.22.33.1" srebro
#直接创建不指定 ip 网段
$ isula network create srebro

$ isula network ls
NAME                 VERSION         PLUGIN                         
srebro               1.0.0           bridge,portmap,firewall 

#查看网络详情
$ isula network inspect  srebro
[
    {
        "cniVersion": 1.0.0,
        "name": srebro,
        "plugins": [
            {
                "type": bridge,
                "bridge": isula-br0,
                "isGateway": true,
                "ipMasq": true,
                "hairpinMode": true,
                "ipam": {
                    "type": host-local,
                    "routes": [
                        {
                            "dst": 0.0.0.0/0
                        }
                    ],
                    "ranges": [
                        [
                            {
                                "subnet": 192.168.0.0/24,
                                "gateway": 192.168.0.1
                            }
                        ]
                    ]
                }
            },
            {
                "type": portmap,
                "capabilities": {
                    "portMappings": true
                }
            },
            {
                "type": firewall
            }
        ]
    }
]

4.4.3 支持的网络模式

iSulad 支持多种网络模式:

# 使用指定网络
$ isula run -d --name web01 --network srebro -p 80:80 nginx

# 使用主机网络
$ isula run -d --net=host --name web02 nginx

# 不使用网络
$ isula run -d --net=none --name web03 nginx

# 使用容器网络
$ isula run -d --net=container:other-container --name web04 nginx

4.5 容器存储管理

4.5.1 数据卷管理

创建和使用数据卷:

# 创建匿名卷
$ isula run -d -v /data --name app busybox

# 绑定挂载主机目录
$ isula run -d -v /host/data:/container/data --name app busybox

# 只读挂载
$ isula run -d -v /host/data:/container/data:ro --name app busybox

# 挂载多个目录
$ isula run -d \
  -v /host/data:/app/data \
  -v /host/logs:/app/logs \
  --name app busybox

4.5.2 临时文件系统

# 挂载tmpfs
$ isula run -d --tmpfs /tmp --name app busybox

# 指定tmpfs大小
$ isula run -d --tmpfs /tmp:size=100m --name app busybox

4.6 容器安全管理

4.6.1 权限控制

# 以特权模式运行容器
$ isula run -d --privileged --name privileged-app busybox

# 添加特定权限
$ isula run -d --cap-add=NET_ADMIN --name net-app busybox

# 删除特定权限
$ isula run -d --cap-drop=CHOWN --name secure-app busybox

# 以指定用户运行
$ isula run -d --user 1000:1000 --name user-app busybox

4.6.2 资源限制

# 限制内存使用
$ isula run -d -m 512m --name memory-limited busybox

# 限制CPU使用
$ isula run -d --cpus="1.5" --name cpu-limited busybox

# 限制CPU核心
$ isula run -d --cpuset-cpus="0,1" --name cpu-pinned busybox

# 设置CPU权重
$ isula run -d --cpu-shares=512 --name cpu-weighted busybox

4.6.3 安全选项

# 设置SELinux标签
$ isula run -d --security-opt label=level:s0:c100,c200 --name selinux-app busybox

# 禁用SELinux
$ isula run -d --security-opt label=disable --name no-selinux busybox

# 设置AppArmor配置
$ isula run -d --security-opt apparmor=unconfined --name apparmor-app busybox

4.7 容器健康检查

4.7.1 配置健康检查

# 配置HTTP健康检查
$ isula run -d \
  --health-cmd="curl -f http://localhost/ || exit 1" \
  --health-interval=30s \
  --health-timeout=10s \
  --health-retries=3 \
  --name web nginx

# 配置命令健康检查
$ isula run -d \
  --health-cmd="ps aux | grep nginx" \
  --health-interval=30s \
  --name web nginx

# 禁用健康检查
$ isula run -d --no-healthcheck --name web nginx

4.7.2 查看健康状态

# 查看容器健康状态
$ isula inspect --format='{{.State.Health.Status}}' web

# 查看健康检查历史
$ isula inspect --format='{{json .State.Health}}' web

4.8 容器镜像管理

4.8.1 镜像基本操作

# 拉取镜像
$ isula pull nginx:latest

# 查看本地镜像
$ isula images

# 删除镜像
$ isula rmi nginx:latest

# 查看镜像详细信息
$ isula inspect nginx:latest

4.8.2 镜像标签管理

# 给镜像打标签
$ isula tag nginx:latest my-nginx:v1.0

# 删除镜像标签
$ isula rmi my-nginx:v1.0

五、参考

Archives Tip
QR Code for this page
Tipping QR Code