iSula轻量级容器技术入门(实践)
实验环境介绍
我们以华为云ECS openEuler 22.03 64bit with ARM为实验演示环境,由于是在虚拟机上进行实验,安全要求不是很严格,为方便起见,我们以root用户登录进行演示。
以下是实验环境的一些展示:
作为开发者,我们首先安装开发工具:
🔔注意
如果在安装的过程中出现“Error: GPG check FAILED”错误则可在yum install命令后增加--nogpgcheck选项,例如:
iSulad轻量级容器引擎实践
iSulad的安装、配置和启动
请参照iSulad代码仓的README文件进行安装,下文是从YUM(Yellow dog Updater, Modified)软件仓库安装该软件的一个示例。
安装成功后,需要先配置好容器镜像的注册地址,以“hub.oepkgs.net”为例:
配置情况如下所示:
💡Tips
hub.oepkgs.net为openEuler社区与中科院软件所共建的、开源免费的容器镜像仓库。在该网站可以搜索到可用于该实验的容器镜像。
下面检查配置文件格式是否正确:
一般来说,如果配置文件的内容能正确显示出来,即表示其格式合法。
现在需要重新启动isulad:
查看isulad运行状况:
如果显示输出有“active (running)”的字样则表示启动成功。
注意:有时需要按“q”或“Q”键从查看信息的状态中退出。
iSulad容器与镜像管理
iSulad提供了两个管理镜像和容器的操作接口:
- CLI:命令行接口。本文主要以此讲解iSulad容器与镜像生命周期管理。
- CRI:容器运行时接口。iSulad可以通过CRI接口与kubernetes集成,本文对此不做叙述,有兴趣者可以参考k8s_integration。
运行容器busybox
我们通过运行容器busybox展示iSulad容器与镜像生命周期管理。
🎶步骤 1:isula run等命令
我们首先用isula run命令直接运行容器busybox:
输出如下所示:
由于这是第一次运行,所以会拉取busybox的镜像,然后运行它的一个实例,并且调用echo命令打印hello world字符串。
查看镜像:
输出如下所示:
现在,我们使用isula run -it命令再次运行容器busybox:
参数解释:
- -i:即使没有连接到容器的标准输入,也要保持容器的标准输入打开。
- -t:等同于“--tty”,为容器分配伪终端。
这时,我们会进入容器里的命令行交互界面:
如上所示,我们可以在里面执行命令、并通过exit命令退出容器。
使用isula run -itd命令运行容器busybox:
参数解释:
输出如下:
该容器在后台运行。
进入容器内部的命令行界面:
在容器内部的命令行,可以通过exit命令退出容器。虽然已经退出了该容器的命令行交互界面,但该容器实例仍然在运行:
输出如下:
现在我们通过isula attach命令接入容器:
同样也可以通过exit命令退出,但是这一次该容器实例也会终止运行。
🎶步骤 2:isula create等命令
以isula create命令创建容器并指定容器的名字:
启动容器:
执行容器中的命令:
当容器业务结束需要释放资源时,可删除该容器。删除容器时,需要先停止容器。
停止容器:
由于容器实例已经停止运行,所以利用isula ps命令无法查找到它,这时我们可以用isula ps -a命令查看所有已创建的容器(包括处于“running”状态的容器):
输出如下:
删除所有容器:
这时用isula ps和isula ps -a都看不到任何容器,这两个命令的输出都如下所示:
这时可以删除busybox镜像(删除容器镜像前要先删除它的所有实例):
当然可以再次拉取镜像:
输出如下:
🎶步骤 3:更多命令
显示系统范围的信息:
更多信息,请查看帮助:
运行容器openeuler:24.03
我们通过运行容器openeuler:24.03展现如何将容器中的数据在主机上永续留存。
我们创建一个“iSula”目录作为我们的工作目录:
🎼主题 1:宿主机与容器间互相拷贝文件
输出如下所示:
我们可以从宿主机(host)上拷贝文件到还未启动的容器:
启动刚刚创建的容器:
查看拷贝到容器中的文件:
查看容器中操作系统的版本信息:
输出如下:
现在我们进入容器内部:
在容器内部创建文件后退出容器:
在宿主机环境中将容器中的文件拷贝到主机:
查看文件内容:
停止容器:
删除容器:
🎼主题2:挂载本地卷到容器
iSula管理的容器销毁后,容器内自身所有的数据都会被销毁。如果用户希望容器销毁后依然保留数据,则需要有一种持久化数据的机制。iSula允许将主机上的文件、目录或卷在容器运行时挂载到容器内。
使用create和run创建并运行容器时,可以使用-v或者--volume参数将主机上的文件、目录或者卷挂载到容器内用于数据持久化。
我们先在宿主机上创建目录和文件:
然后启动一个容器:
这时会进入容器内部的命令行/ # 我们在容器中执行命令:
上面最后一行退出容器后,我们将此容器删除:
再(在主机)查看文件内容:
输出如下:
可见将此容器删除后,宿主机上的文件依然存在,说明容器数据持久化成功。因此,我们可以通过将此目录挂载给新的容器,实现数据业务的恢复。而除了-v参数可以为容器挂载本地持久化存储卷以外,还可以使用--mount参数挂载。
比如将上述宿主机的“my-volume1”文件夹挂载给一个新容器:
启动容器:
进入容器内部以交互式命令行方式执行命令:
该命令执行成功后会进入容器内部,我们在其命令行界面上执行命令:
最后一行命令输出如下:
可见数据业务恢复成功。
在容器中命令行中输入命令退出容器:
退出该容器实例后在主机环境停止该容器并将其删除:
最后删除镜像:
使用isula-build构建容器镜像
到目前为止,我们使用的容器镜像都是从hub.oepkgs.net下载的已经构建好的容器镜像,下面我们尝试使用iSula提供的容器镜像构建工具isula-build,构建自己的容器镜像并运行。
安装isula-build
🎶步骤 1:检查yum源
如果输出:
也就是“update”赫然纸上,这表明[update]节的enable=1,这正是我们需要的。
🎶步骤 2:用yum命令安装isula-build
🎶步骤 3:安装docker-runc
isula-build构建Dockerfile内的RUN指令时依赖可执行文件runc,我们可以通过安装docker-runc来获取runc二进制:
🎶步骤 4:用systemctl start命令启动
🎶步骤 5:查看版本
本例输出如下:
🎶步骤 6:修改配置
修改/etc/isula-build/registries.toml,将hub.oepkgs.net加入到isula-build可搜索的镜像仓库列表里:
修改后的内容如下:
当然,如果有不同的镜像仓库也可以配置不同的镜像仓库。
然后需要重启isula-build服务:
查看配置:
本例输出如下:
在Search Registries 配置项里看到”hub.oepkgs.net”赫然纸上。
至此,isula-build安装完成。
构建容器镜像并导出到isulad
我们构建容器镜像并将其导出到本地isulad容器引擎的存储中。
🎶步骤 1:创建Dockerfile
编辑的内容如下所示:
现在编辑Dockerfile中出现的hello.sh脚本,它将被加到原有的镜像中以构建出我们自己的镜像:
编辑的内容如下所示:
还需要修改文件属性:
🎶步骤 2:构建容器镜像
用isula-build构建我们自己的容器镜像并导出到isulad,镜像命名为hello-isula-build:v0.1:
执行过程如下所示:
🎶步骤 3:查询构建出来的镜像并运行容器
输出如下所示:
因为构建过程使用了-o参数导出构建的镜像到本地isulad容器引擎的存储中,所以用isula命令也可直接查看镜像并使用镜像创建容器:
输出如下所示:
运行容器:
我们使用自己构建出来的容器镜像来运行容器,按照预期,容器进程会打印出“hello, isula-build!”:
输出:
🎶步骤 4:导出镜像为压缩包
可以将本地构建的镜像导出为tar格式压缩包:
执行过程如下:
查看导出的文件:
🎶步骤 5:从压缩包导入镜像
为了验证导入镜像功能,我们删除先通过Dockerfile创建的镜像。
查看容器ID:
输出如下:
删除容器:
删除镜像:
导入镜像:
输出如下:
查看导入的镜像:
输出如下:
运行该镜像的容器实例:
输出:
删除镜像:
🗒️Tips
在这里我们没有使用isula-build ctr-img load -i hello-isula-build.tar命令导入镜像,读者有兴趣的话可以自己通过实践体会它与isula load -i hello-isula-build.tar命令的区别。
🎶步骤 6:更多信息
可以通过帮助获取更多信息:
isula-build的镜像导出方式
在openEuler操作系统中,isula-build ctr-img build是iSula容器镜像构建工具的核心命令,用于根据Dockerfile构建容器镜像并支持多种导出方式。一般来书,其导出方式有:
- 导出到isula-build的本地持久化目录中
- 导出到本地压缩包(前文已有示例)
- 导出到Docker Daemon
- 导出到远端仓库
- 导出到本地iSulad容器引擎的存储中(前文已有示例)
通过isula-build的帮助命令可以查看这些导出方式:
输出如下所示:
可以参照以上信息作进一步研究。
FAQ
❔📃 FAQ
Q:在运行isula-build命令时(比如说isula-build ctr-img images)出现以下错误:
A:这通常是isula-build服务没有启动导致的,启动该服务即可:
附录A iSulad架构简介

如上图“iSulad Architecture”所示,iSulad容器引擎主要包括以下几个模块:
- 通信模块:支持gRPC/RESTFUL两种通信方式,提供对外通信的能力;
- 镜像模块:支持OCI标准镜像,提供content/metadata、rootfs及snapshot管理能力;
- 运行时模块:支持轻量级Runtime(lcr)和OCI标准的Runtime(runc,kata等);
从接口划分:
- 北向接口:提供CLI(Command Line Interface)接口和CRI接口;
- 南向接口:提供统一的Runtime管理接口Plugin,支持lcr和OCI两种类型的Runtime;
附录B iSulad代码仓
🔗iSulad代码仓
iSula轻量级容器技术入门(实践)
实验环境介绍
我们以华为云ECS openEuler 22.03 64bit with ARM为实验演示环境,由于是在虚拟机上进行实验,安全要求不是很严格,为方便起见,我们以root用户登录进行演示。
以下是实验环境的一些展示:
作为开发者,我们首先安装开发工具:
🔔注意
如果在安装的过程中出现“Error: GPG check FAILED”错误则可在yum install命令后增加--nogpgcheck选项,例如:
iSulad轻量级容器引擎实践
iSulad的安装、配置和启动
请参照iSulad代码仓的README文件进行安装,下文是从YUM(Yellow dog Updater, Modified)软件仓库安装该软件的一个示例。
安装成功后,需要先配置好容器镜像的注册地址,以“hub.oepkgs.net”为例:
cp /etc/isulad/daemon.json{,.before} vi /etc/isulad/daemon.json # 在此处配置“registry-mirrors” cat /etc/isulad/daemon.json配置情况如下所示:
...... "registry-mirrors": [ "hub.oepkgs.net" ], ......💡Tips
hub.oepkgs.net为openEuler社区与中科院软件所共建的、开源免费的容器镜像仓库。在该网站可以搜索到可用于该实验的容器镜像。
下面检查配置文件格式是否正确:
一般来说,如果配置文件的内容能正确显示出来,即表示其格式合法。
现在需要重新启动isulad:
查看isulad运行状况:
如果显示输出有“active (running)”的字样则表示启动成功。
注意:有时需要按“q”或“Q”键从查看信息的状态中退出。
iSulad容器与镜像管理
iSulad提供了两个管理镜像和容器的操作接口:
运行容器busybox
我们通过运行容器busybox展示iSulad容器与镜像生命周期管理。
🎶步骤 1:
isula run等命令我们首先用
isula run命令直接运行容器busybox:输出如下所示:
由于这是第一次运行,所以会拉取busybox的镜像,然后运行它的一个实例,并且调用echo命令打印hello world字符串。
查看镜像:
输出如下所示:
现在,我们使用
isula run -it命令再次运行容器busybox:参数解释:
这时,我们会进入容器里的命令行交互界面:
如上所示,我们可以在里面执行命令、并通过
exit命令退出容器。使用
isula run -itd命令运行容器busybox:参数解释:
输出如下:
该容器在后台运行。
进入容器内部的命令行界面:
在容器内部的命令行,可以通过
exit命令退出容器。虽然已经退出了该容器的命令行交互界面,但该容器实例仍然在运行:输出如下:
现在我们通过
isula attach命令接入容器:同样也可以通过
exit命令退出,但是这一次该容器实例也会终止运行。🎶步骤 2:
isula create等命令以
isula create命令创建容器并指定容器的名字:启动容器:
执行容器中的命令:
当容器业务结束需要释放资源时,可删除该容器。删除容器时,需要先停止容器。
停止容器:
由于容器实例已经停止运行,所以利用
isula ps命令无法查找到它,这时我们可以用isula ps -a命令查看所有已创建的容器(包括处于“running”状态的容器):输出如下:
删除所有容器:
这时用
isula ps和isula ps -a都看不到任何容器,这两个命令的输出都如下所示:这时可以删除busybox镜像(删除容器镜像前要先删除它的所有实例):
当然可以再次拉取镜像:
输出如下:
🎶步骤 3:更多命令
显示系统范围的信息:
更多信息,请查看帮助:
运行容器openeuler:24.03
我们通过运行容器openeuler:24.03展现如何将容器中的数据在主机上永续留存。
我们创建一个“iSula”目录作为我们的工作目录:
🎼主题 1:宿主机与容器间互相拷贝文件
输出如下所示:
我们可以从宿主机(host)上拷贝文件到还未启动的容器:
启动刚刚创建的容器:
查看拷贝到容器中的文件:
查看容器中操作系统的版本信息:
输出如下:
现在我们进入容器内部:
在容器内部创建文件后退出容器:
在宿主机环境中将容器中的文件拷贝到主机:
查看文件内容:
停止容器:
删除容器:
🎼主题2:挂载本地卷到容器
iSula管理的容器销毁后,容器内自身所有的数据都会被销毁。如果用户希望容器销毁后依然保留数据,则需要有一种持久化数据的机制。iSula允许将主机上的文件、目录或卷在容器运行时挂载到容器内。
使用create和run创建并运行容器时,可以使用-v或者--volume参数将主机上的文件、目录或者卷挂载到容器内用于数据持久化。
我们先在宿主机上创建目录和文件:
然后启动一个容器:
这时会进入容器内部的命令行
/ #我们在容器中执行命令:上面最后一行退出容器后,我们将此容器删除:
再(在主机)查看文件内容:
输出如下:
可见将此容器删除后,宿主机上的文件依然存在,说明容器数据持久化成功。因此,我们可以通过将此目录挂载给新的容器,实现数据业务的恢复。而除了-v参数可以为容器挂载本地持久化存储卷以外,还可以使用--mount参数挂载。
比如将上述宿主机的“my-volume1”文件夹挂载给一个新容器:
启动容器:
进入容器内部以交互式命令行方式执行命令:
该命令执行成功后会进入容器内部,我们在其命令行界面上执行命令:
最后一行命令输出如下:
可见数据业务恢复成功。
在容器中命令行中输入命令退出容器:
退出该容器实例后在主机环境停止该容器并将其删除:
最后删除镜像:
使用isula-build构建容器镜像
到目前为止,我们使用的容器镜像都是从hub.oepkgs.net下载的已经构建好的容器镜像,下面我们尝试使用iSula提供的容器镜像构建工具isula-build,构建自己的容器镜像并运行。
安装isula-build
🎶步骤 1:检查yum源
如果输出:
也就是“update”赫然纸上,这表明[update]节的enable=1,这正是我们需要的。
🎶步骤 2:用yum命令安装isula-build
🎶步骤 3:安装docker-runc
isula-build构建Dockerfile内的RUN指令时依赖可执行文件runc,我们可以通过安装docker-runc来获取runc二进制:
🎶步骤 4:用systemctl start命令启动
🎶步骤 5:查看版本
本例输出如下:
🎶步骤 6:修改配置
修改/etc/isula-build/registries.toml,将hub.oepkgs.net加入到isula-build可搜索的镜像仓库列表里:
cp /etc/isula-build/registries.toml{,.before} vi /etc/isula-build/registries.toml # 在此修改文件内容 cat /etc/isula-build/registries.toml修改后的内容如下:
当然,如果有不同的镜像仓库也可以配置不同的镜像仓库。
然后需要重启isula-build服务:
查看配置:
本例输出如下:
General: MemTotal: 2.57 GB MemFree: 1.91 GB SwapTotal: 0 B SwapFree: 0 B OCI Runtime: runc DataRoot: /var/lib/isula-build/ RunRoot: /var/run/isula-build/ Builders: 0 Goroutines: 11 Experimental: false Store: Storage Driver: overlay Backing Filesystem: extfs Registry: Search Registries: hub.oepkgs.net Insecure Registries:在Search Registries 配置项里看到”hub.oepkgs.net”赫然纸上。
至此,isula-build安装完成。
构建容器镜像并导出到isulad
我们构建容器镜像并将其导出到本地isulad容器引擎的存储中。
🎶步骤 1:创建Dockerfile
编辑的内容如下所示:
现在编辑Dockerfile中出现的hello.sh脚本,它将被加到原有的镜像中以构建出我们自己的镜像:
编辑的内容如下所示:
还需要修改文件属性:
🎶步骤 2:构建容器镜像
用isula-build构建我们自己的容器镜像并导出到isulad,镜像命名为hello-isula-build:v0.1:
执行过程如下所示:
🎶步骤 3:查询构建出来的镜像并运行容器
输出如下所示:
因为构建过程使用了-o参数导出构建的镜像到本地isulad容器引擎的存储中,所以用isula命令也可直接查看镜像并使用镜像创建容器:
输出如下所示:
运行容器:
我们使用自己构建出来的容器镜像来运行容器,按照预期,容器进程会打印出“hello, isula-build!”:
输出:
🎶步骤 4:导出镜像为压缩包
可以将本地构建的镜像导出为tar格式压缩包:
执行过程如下:
查看导出的文件:
🎶步骤 5:从压缩包导入镜像
为了验证导入镜像功能,我们删除先通过Dockerfile创建的镜像。
查看容器ID:
输出如下:
删除容器:
删除镜像:
导入镜像:
输出如下:
查看导入的镜像:
输出如下:
运行该镜像的容器实例:
输出:
删除镜像:
🗒️Tips
在这里我们没有使用
isula-build ctr-img load -i hello-isula-build.tar命令导入镜像,读者有兴趣的话可以自己通过实践体会它与isula load -i hello-isula-build.tar命令的区别。🎶步骤 6:更多信息
可以通过帮助获取更多信息:
isula-build的镜像导出方式
在openEuler操作系统中,isula-build ctr-img build是iSula容器镜像构建工具的核心命令,用于根据Dockerfile构建容器镜像并支持多种导出方式。一般来书,其导出方式有:
通过isula-build的帮助命令可以查看这些导出方式:
输出如下所示:
Build container images Usage: isula-build ctr-img build [FLAGS] PATH Examples: isula-build ctr-img build -f Dockerfile . isula-build ctr-img build -f Dockerfile -o docker-archive:name.tar:image:tag . isula-build ctr-img build -f Dockerfile -o docker-daemon:image:tag . isula-build ctr-img build -f Dockerfile -o docker://registry.example.com/repository:tag . isula-build ctr-img build -f Dockerfile -o isulad:image:tag . isula-build ctr-img build -f Dockerfile --build-static='build-time=2020-06-30 15:05:05' . Flags: --build-arg stringArray Arguments used during build time --build-static listopts Static build with the given option --cap-add stringArray Add Linux capabilities for RUN command -f, --filename string Path for Dockerfile --iidfile string Write image ID to the file -o, --output string Destination of output images --proxy Inherit proxy environment variables from host (default true) -t, --tag string Add tag to the built image Global Flags: -D, --debug Open debug mode -h, --help Print usage --log-level string Log level to be used. Either "debug", "info", "warn" or "error" (default "error") --timeout string Timeout for connecting to daemon -v, --version Version for isula-build client可以参照以上信息作进一步研究。
FAQ
❔📃 FAQ
Q:在运行
isula-build命令时(比如说isula-build ctr-img images)出现以下错误:A:这通常是isula-build服务没有启动导致的,启动该服务即可:
附录A iSulad架构简介
如上图“iSulad Architecture”所示,iSulad容器引擎主要包括以下几个模块:
从接口划分:
附录B iSulad代码仓
🔗iSulad代码仓