使用iSula生态链进行容器镜像构建和运行
发表于 2023/07/22
0
尊敬的鲲鹏开发者你好,随着大多数企业开始全面拥抱容器化,容器的规模和密度愈加扩大,为了让用户能够更快速、更轻量的使用容器,我们提出了iSula生态链解决方案,您可以阅读本文进行isula生态链的快速入门。
本文主要介绍了以下知识:
(1)了解和掌握iSulad容器引擎基本操作指令
(2)了解和掌握isula-build进行容器镜像的构建
(3)感受到相比于docker,iSulad在性能上的优势
基础技能:
(1)了解常用的Linux操作命令
isula生态链基础知识
1.什么是isula生态链
iSulad 是华为自主研发的通用容器引擎,旨在统一的架构设计来满足 CT 和 IT 领域的不同需求。相比 Golang 编写的 Docker,轻量级容器具有轻、灵、巧、快的特点,不受硬件规格和架构 的限制,底噪开销更小,可应用领域更为广泛。作为 iSulad 生态的一员, isula-build 承载了镜像构建、管理、分发等功能,它提供了安全、快速的容器镜像构建能力。isula-build 与 isulad等一系列组件一起,构成了 iSula 品牌容器全栈解决方案。
使用iSula生态链进行容器镜像构建和运行
iSula自动调优实验需要在鲲鹏平台上完成,主要包括三部分内容,
(1)使用iSulad运行容器,
(2)使用isula-build构建容器镜像,
(3)iSulad与docker性能对比
1.准备工作
申请鲲鹏远程实验室资源
实验过程需要在鲲鹏平台上完成,为了方便开发者在鲲鹏环境上进行开发,鲲鹏在鲲鹏社区中提供了鲲鹏远程实验室资源供各位开发者免费申请。
为了兼顾所有鲲鹏开发者的开发体验,鲲鹏远程实验室中提供了云开发环境(开发态模式)和远程服务器(黑框模式)。本文涉及案例会在云开发环境上进行,开发者在申请云开发环境后可以直接通过在线IDE的方式打开页面进行操作。降低了开发者在鲲鹏上的开发门槛。
首先我们访问鲲鹏社区的远程实验室页面https://www.hikunpeng.com/zh/developer/cloud-lab,申请云开发环境:
之后输入自己的邮箱地址,选择openEuler 20.03 LTS-SP1系统,点击提交进行申请。
申请成功后我们点击“打开在线IDE”按钮,进入云开发环境中,云开发环境给大家提供了在线Vscode页面,方便我们直接在鲲鹏上进行开发。

进入在线IDE页面后,点击侧边栏第一个图标后依次点击“终端”、“新建终端”。

进入到终端页面后,点击最大化面板大小,可放大面板。
最后面板如图所示,实验环境准备完毕。
2.使用iSulad运行容器
下面我们安装并使用iSulad容器引擎。通过本节的学习,相信您能够掌握使用iSulad容器引擎相关命令的使用方法。
(1)安装iSulad
步骤 1 用yum命令安装iSulad
yum install -y iSulad
如下所示,安装成功。
说明:我们安装iSulad之后,相应的iSulad服务会自动启动。
(2)配置镜像仓库
步骤 1 安装JSON格式数据处理工具
yum install -y jq
出现如下输出表示安装成功:
步骤 2 修改isulad的配置文件
将原始配置文件做好备份:
cp /etc/isulad/daemon.json/etc/isulad/daemon.json.origin
修改配置文件:
vi /etc/isulad/daemon.json
使用方向键定位到"registry-mirrors"一行的结尾,敲击键盘A字母键进入编辑模式,添加"hub.oepkgs.net"后,按Esc键退出编辑模式。
然后按住shift键后连续敲击两次Z键保存修改并退出。
在上述文件中,我们设"registry-mirrors"的值为"hub.oepkgs.net"。(hub.oepkgs.net为openEuler社区与中科院软件所共建的、开源免费的容器镜像仓库)
步骤 3 检查配置文件合法性:
使用cat命令配合管道命令符|以及jq命令将iSulad配置文件内容daemon.json输出到控制台。
cat /etc/isulad/daemon.json | jq
使用以上命令能够正确显示配置文件的内容,如下所示,表示配置文件正确修改(jq是命令行下的JSON字符串处理工具,如果能够正确显示表示配置文件格式正确)。
使用systemctl restart 命令重启iSulad:
systemctl restart isulad
查看iSulad服务状态:
systemctl status isulad
(3)运行容器openeuler:20.09
步骤 1 创建容器并启动
创建容器:
isula create -it openeuler/openeuler:20.09
由于没有运行容器,所以利用isula ps命令无法找到刚刚创建的容器:
isula ps
可以使用isula pa -a命令可以找到刚刚创建的容器:
isula ps -a
使用isula start命令加上图中的CONTAINER ID(即图中红框内的字符串)来启动对应的容器:
isula start “CONTAINER ID”
说明:启动容器时,可以只使用容器ID的前四位来启动
使用isula ps命令来查看已经启动的容器:
isula ps
使用isula exec命令来在容器中执行 cat /etc/os-release命令,打印容器中的os-release文件信息:
isula exec “CONTANINER ID” cat /etc/os-release
步骤 2 直接运行容器并输出镜像版本信息。
我们可以使用isula run命令来直接运行容器并在容器中执行命令cat /etc/os-release:
isula run openeuler/openeuler:20.09 cat /etc/os-release
同样我们可以看到和步骤1相同的输出。
步骤 3 交互式运行
在isula run命令的基础上添加-it参数可以进入容器中的交互式终端并在容器中执行各种命令:
isula run -it openeuler/openeuler:20.09
我们可以看到进入容器中后,命令行前缀改变:
我们可以尝试在容器中执行ls命令列出文件以及ifconfig命令查看网卡信息:
ls
ifconfig
在容器中执行命令来在容器中执行打印容器镜像版本的命令:cat /etc/os-release,然后输入exit命令并回车退出容器后,再次执行cat /etc/os-release进行对比。容器内的系统版本为openEuler 20.09,而退出容器后的系统版本为我们ECS的系统版本openEuler 20.03(LTS-SP1),表示我们的命令是在容器中运行的。
cat /etc/os-release
exit
cat /etc/os-release
步骤 4 暂停/恢复一个容器
使用pause命令暂停一个容器内的所有进程:
isula pause “CONTAINER ID”
说明:CONTANINER ID即为步骤1中的容器ID,输入命令时需要将“CONTANINER ID”替换为容器ID。若您忘记了容器ID,可以再次通过isula ps命令找到它。
pause命令执行完成之后,使用ps命令查看容器的状态,可以发现容器的状态变为Paused:
isula ps
使用unpause命令恢复一个容器并使用ps命令查看,可以发现容器的状态又恢复为正常的运行状态:
isula unpause “CONTAINER ID”
isula ps
步骤 5 先停止,再删除一个容器
使用stop命令停止一个容器:
isula stop “CONTAINER ID”
返回容器ID表明,容器被正确暂停。
使用rm命令删除该容器:
isula rm “CONTAINER ID”
返回容器ID表明容器被正确删除。
此时,您可以再次使用isula start命令启动容器
isula start “CONTAINER ID”
得到提示信息“No such container:”。这是因为容器已经彻底删除,您已经无法再对它进行任何操作。如果您想要再此启动一个容器,需要从步骤1开始重新创建容器。
步骤 6 先将关联到镜像的容器销毁
由于在步骤2,3中,我们分别启动了一个容器,在删除镜像前,需要将容器删除。
使用isula ps -a命令可以查询到当前所有创建的容器:
isula ps -a
可以通过命令组合将所有的容器删除:
isula rm -f $(isula ps -aq)
再次执行isula ps -a命令,所有容器都已删除:
isula ps -a
此时,没有容器被显示出来:
步骤 7 查看并删除镜像
使用isula images命令来查看镜像:
isula images
使用isula rmi命令来删除镜像:
isula rmi openeuler/openeuler:20.09
再次执行isula images命令来查看容器镜像,发现openeuler/openeuler:20.09镜像已经被删除。
isula images
注意:如果这一步骤失败,请先将所有容器删除之后再运行该步骤。
3.使用isula-build构建容器镜像
目前为止,我们使用的容器镜像都是从hub.oepkgs.net下载的已经构建好的容器镜像,下面我们尝试使用iSula提供的容器镜像构建工具isula-build,构建自己的容器镜像并运行。通过本节的学习,相信您能够了解iSula生态链工具下,镜像从isula-build构建到使用iSulad执行的整个过程。
(1)安装isula-build
步骤 1 安装isula-build
yum install -y isula-build
安装完成后,使用systemctl start 命令启动isula-build:
systemctl start isula-build
之后执行systemctl status isula-build命令,Active字段显示为atcive(runing)则表示isula-build安装运行成功,然后需要按下按键q或者Q退出:
systemctl status isula-build
步骤 2 安装docker-runc
说明:isula-build 构建 Dockerfile 内的 RUN 指令时依赖可执行文件 runc ,需要 isula-build 的运行环境上预装好 runc:
yum install -y docker-runc
(2)构建容器镜像并导入到iSulad
步骤 1 创建构建镜像所需要的Dockerfile
Dockerfile为包含一系列命令的用于构建容器镜像的配置文件,我们先创建我们的测试目录并进入该目录:
mkdir test-isula-build && cd test-isula-build
再使用vi Dockerfile命令编写Dockerfile,该命令会为我们创建了一个新的Dockerfile文件:
vi Dockerfile
敲击字母A键进入编辑模式,输入以下字符到文件中。然后,按Esc键退出编辑模式,最后按住shift键并双击两次Z键保存退出:
FROM hub.oepkgs.net/openeuler/openeuler:20.09
COPY hello.sh /usr/bin/
CMD ["sh","-c","/usr/bin/hello.sh"]
说明:FROM命令为以该镜像为基础镜像构建我们的镜像,COPY命令为拷贝构建目录下的hello.sh文件到我们镜像的/usr/bin目录,CMD为我们镜像容器启动后运行的入口命令执行hello.sh脚本。
步骤 2 创建hello.sh脚本
接下来,创建我们需要的hello.sh文件,使用以下命令:
vi hello.sh
敲击字母A键进入编辑模式,输入以下字符到文件中。然后,按Esc键退出编辑模式,最后按住shift键并双击两次Z键保存退出:
#!/bin/bash
echo "hello, isula-build"
为文件添加可执行权限,以能够直接运行该文件:
chmod +x hello.sh
使用ls -l命令,查看我们刚刚创建的文件:
ls -l
可以看到我们创建的dockerfile以及hello.sh文件:
执行ls -l命令查看我们创建的文件,其中hello.sh在行首第四个字符有x可执行权限,即代表文件权限添加成功。
步骤 3 构建容器镜像
用isula-build构建我们自己的容器镜像,镜像命名为hello-isula-build:v0.1。其中ctr-img 子命令包含全部容器镜像管理命令,其中的build子命令为容器镜像构建,-f参数用于指定Dockerfile文件,并使用-o参数导出构建的镜像到isulad容器引擎。
isula-build ctr-img build -f Dockerfile -o isulad:hello-isula-build:v0.1 .
注意:不要忘记添加最后的“.”,该字符表示我们构建所使用的目录为当前目录。
步骤 4 查询构建出来的容器镜像
使用isula-build ctr-img images命令查询:
isula-build ctr-img images
同样地,因为容器镜像导出到了isulad中,使用isula images命令同样可以查询到该镜像。
isula images
步骤 5 运行构建好的镜像
使用isula run命令加上我们构建出来的镜像名hello-isula-build:v0.1来运行镜像容器:
isula run hello-isula-build:v0.1
运行的结果,便是执行我们上述定义的hello.sh脚本,输出hello, isula-build的字样。
【问题】Isula-build还支持其他的导出方式吗?
【答案】在前述步骤中构建了自己的容器镜像hello-isula-build:v0.1,并将容器镜像导出到isulad启动容器。isula-build除了能将容器镜像导出到isulad之外,还可以:
(1)导出到远端仓库
(2)导出到docker daemon
(3)导出到本地压缩包
(4)导出到isula-build的本地存储
可以通过isula-build的命令行帮助,查看这些导出方式:
4.iSulad与docker性能对比
和docker相比,iSulad是通过C/C++实现的轻量级容器引擎,底噪开销更小,具备更少的资源占用、更快的容器启动速度等优势。下面,我们将尝试使用iSulad运行多个容器,并与docker进行对比。通过本节的学习,相信您能够更加深刻的体会到iSulad容器的优势。
(1)测试iSulad的性能
步骤 1 下载测试镜像
此处,我们仍以openeuler/openeuler:20.09镜像为例,测试iSulad的性能。
isula pull openeuler/openeuler:20.09
说明:pull镜像需要将/etc/isulad/daemon.json文件中的"registry-mirrors"字段配置为"hub.oepkgs.net",并重启isulad。该步骤在前述实验中已经讲解,此处不再展开叙述。
步骤 2 编写获取时间的脚本
为了对iSulad的性能进行量化,让您有一个直观的感受,我们需要对创建、启动、停止、删除容器的时间进行计算。
首先编写一个获取时间的脚本,本文件已经预置在了云开发环境中,可以直接复制get_time.sh文件;
cp /opt/iSula/get_time.sh ./
说明:该脚本负责计算start与end之间的时间差,单位为ms。
步骤 3 编写iSulad并发操作容器的脚本
通过并发创建、启动、停止、删除100个容器,计算所需要消耗的时间,来度量iSulad的性能。
编写获取时间的脚本, 本文件已经预置在了云开发环境中,可以直接复制isula_performance.sh文件;
cp /opt/iSula/isula_performance.sh ./
步骤 4 运行脚本
将get_time.sh脚本与isula_performance.sh两个脚本文件放在同一目录下,然后执行脚本。
bash isula_performance.sh
该脚本会依次并发创建、启动、停止、删除100个容器,并在运行过程中输出容器的ID、Name等信息。最后,该脚本会输出执行的时间。
说明:机器的性能对运行时间有较大的影响,建议在执行该脚本时,不再执行其他的任务。此外,可以通过多次执行该脚本,取平均值的方法,减小误差。
(2)测试docker的性能
步骤 1 用yum命令安装docker
yum install docker
说明:我们安装docker之后,相应的docker服务会自动启动。
检查docker服务是否正常启动
systemctl status docker
使用命令systemctl status docker检查,相应的Active字段为: active (running),即代表docker已成功安装且正常启动,然后需要按下按键q或者Q退出查看。
步骤 2 配置镜像仓库
docker有默认的镜像仓库,不过为了保证与iSulad下载的是同一镜像,我们将docker的镜像仓库也设置为hub.oepkgs.net。
vim /etc/docker/daemon.json
敲击字母A键进入编辑模式,输入以下字符到文件中。
{
"registry-mirrors": [
"https://hub.oepkgs.net"
]
}
然后,按Esc键退出编辑模式,最后按住shift键并双击两次Z键保存退出。
说明:docker daemon.json配置文件默认是不存在的,需要我们自己创建。
修改完成之后,重启docker服务,并查看docker服务是否正常启动。
systemctl restart docker
systemctl status docker
使用命令systemctl status docker检查相应的Active字段为: active (running),即代表docker启动成功, 然后需要按下按键q或者Q退出。
步骤 3 下载测试镜像
使用docker下载openeuler/openeuler:20.09镜像。
docker pull openeuler/openeuler:20.09
通过docker images命令可以查看到openeuler/openeuler:20.09镜像,即代表镜像下载成功。
步骤 4 编写docker并发操作容器的脚本
通过并发创建、启动、停止、删除100个容器,计算所需要消耗的时间,来度量docker的性能, 本文件已经预置在了云开发环境中,可以直接复制docker_performance.sh文件;
cp /opt/iSula/docker_performance.sh ./
步骤 5 运行脚本
将get_time.sh与docker_performance.sh两个文件放在同一目录下,执行脚本。
bash docker_performance.sh
该脚本会依次并发创建、启动、停止、删除100个容器,并在运行过程中输出容器的ID、Name等信息。最后,该脚本会输出执行的时间。
说明:机器的性能对运行时间有较大影响,建议在执行该脚本时,不执行其他的任务。此外,可以通过多次执行该脚本,取平均值的方法,避免某次测试的误差。
步骤6 实验结果对比
将iSulad的运行结果与docker的运行结果进行对比,您会发现iSulad对容器的操作速度更快,性能更好。
恭喜
到这里整个实验流程就已经结束了,通过上面的实验可以了解怎么使用isulad运行容器以及使用isula-build构建容器镜像。除了上述学习内容,我们还提供了很多辅助学习资源(课程/实验/文档/文章),希望能帮助到您更好的使用isula生态链:
使用iSula生态链进行容器镜像构建和运行(课程):https://www.hikunpeng.com/zh/learn/experiments/detail/T221111002
isulad官方代码仓库:https://gitee.com/openeuler/iSulad
Isula-build官方代码仓库:https://gitee.com/openeuler/isula-build
isulad详细命令使用(文档):https://docs.openeuler.org/en/docs/22.03_LTS_SP1/docs/Container/isulad-container-engine.html
https://docs.openeuler.org/en/docs/22.03_LTS_SP1/docs/Container/isula-build.html
本页内容