openEuler容器化实战:基于Docker与iSulad部署Redis对比
操作系统:openEuler 22.03 LTS-SP1
核心主题:使用容器技术部署Redis服务,对比Docker与iSulad的运行表现
一、背景回顾:深入openEuler的容器能力探索
在前两篇实践中,我完成了对 openEuler 22.03 LTS-SP1 系统性能和容器支持的初步体验:
- 第一篇:从华为云的 CentOS 7 迁移至 openEuler,系统性能提升显著。通过 sysbench 测试发现 CPU 性能更强,fio 测试显示磁盘 I/O 也有明显优化,软件生态比预期更完善。
- 第二篇:注意到系统原生集成了 iSulad 容器引擎,并与 Docker 进行了基础性能对比。结果显示,iSulad 启动容器速度约为 Docker 的三倍(0.35s vs 1.0s),运行 Nginx 时 QPS 达到 32K,超过 Docker 的 15K;同时,守护进程内存占用仅为 32MB,远低于 Docker 的 80MB。尽管过程中遇到镜像拉取超时、配置字段错误、端口映射限制及网络设置复杂等问题,但均已解决。
本次实践将在此基础上进一步推进——部署一个真实应用场景中的关键组件:Redis。
作为缓存、会话存储和轻量消息队列的核心工具,Redis 几乎是现代应用不可或缺的一环。既然 openEuler 同时支持 Docker 和 iSulad,那么不妨两者都尝试,观察在相同环境下 Redis 在两种引擎上的性能差异。此前 iSulad 在 Nginx 场景中表现出近两倍的优势,这次在 Redis 上是否也能延续这一优势?值得验证。
二、openEuler 的容器双引擎优势
openEuler 在容器技术支持方面具备独特灵活性:
- 支持直接安装 Docker:
dnf install docker - 预装轻量级容器引擎 iSulad:
dnf install iSulad - 两大引擎可共存运行,互不干扰
- 镜像格式兼容,共享同一套镜像仓库
这种设计带来了实际部署中的高度自由:
- 若需完整生态工具链,选择 Docker
- 若追求高性能低开销,选用 iSulad
- 如需进行性能评估或灰度测试,可并行使用两者
例如,在开发阶段使用 Docker(调试便捷、插件丰富),而在生产环境切换为 iSulad(资源消耗更低、启动更快),是一种可行的工程策略。
此外,openEuler 提供完善的官方支持:
接下来进入实操环节。
三、实验环境准备
继续使用与前两次一致的华为云 ECS 实例,确保测试条件统一:
服务器配置如下:
- CPU:2 核
- 内存:3.3GB
- 磁盘:40GB
- 系统版本:openEuler 22.03 LTS-SP1
- 主机名:ecs-ac8f
容器引擎版本信息:
- Docker:18.09.0
- iSulad:2.0.18
两个容器引擎均已安装并完成初始化配置(包括 Docker 镜像加速及 iSulad 的 registry-mirrors 设置)。
四、使用 Docker 部署 Redis
4.1 获取镜像并启动容器
使用 Docker 部署 Redis 极其简便,步骤如下:
# 拉取官方 Redis 镜像
docker pull docker.io/library/redis:latest
# 启动 Redis 容器(桥接模式,映射宿主机 6379 端口)
docker run -d --name redis-docker \
-p 6379:6379 \
docker.io/library/redis:latest
# 查看容器运行状态
docker ps | grep redis-docker
输出显示容器已成功启动,容器 ID 为 6ed1e05a2026,Redis 正在监听 6379 端口。
4.2 容器资源监控
查看当前容器的资源使用情况:
docker stats --no-stream redis-docker
Docker 版 Redis 容器资源占用情况:
- CPU 使用率:0.235%
- 内存占用:8.688 MiB / 3.331 GiB(约 0.25%)
- 进程数(PIDs):6
处于空载状态,资源消耗极低,符合预期。
五、Docker 环境下 Redis 性能测试
5.1 安装 redis-benchmark 工具
性能压测依赖 Redis 自带的基准测试工具 redis-benchmark。虽然服务以容器方式运行,但测试工具需部署于宿主机:
# 安装 Redis 客户端工具包(含 redis-benchmark)
sudo dnf install -y redis
# 验证版本
redis-cli --version
openEuler 软件源提供的 Redis 版本为 4.0.14,满足本次测试需求。安装过程快速,仅下载约 800KB 数据即可完成。
5.2 综合性能压测
开始对 Docker 托管的 Redis 实例执行综合性能测试:
# 发起 10 万次请求,模拟 100 并发连接
redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000
redis-benchmark -h 127.0.0.1 -p 6379 -n 100000 -c 100 -qDocker Redis 性能测试结果: 操作 QPS(请求/秒) PING_INLINE 100,603.62 PING_BULK 103,950.10 SET 102,354.15 GET 99,700.90 INCR 104,058.27 LPUSH 101,522.84 RPUSH 100,908.17 LPOP 110,864.74 RPOP 103,950.10 SADD 109,289.62 HSET 104,058.27 SPOP 114,942.53 LRANGE_100 52,882.07 LRANGE_300 23,218.02 LRANGE_500 17,519.27 LRANGE_600 13,426.42 MSET (10 keys) 78,926.60 点击图片可查看完整电子表格 常规核心操作如 SET、GET 和 INCR 的每秒查询率(QPS)约为 10万次,在配置为2核CPU与3.3GB内存的服务器环境下,此表现已属良好水平。 对于列表范围查询操作(例如 LRANGE),随着返回元素数量的增加,性能呈下降趋势,该现象符合系统预期行为。 六、使用 iSulad 部署 Redis 服务 6.1 启动 Redis 容器实例 由于 iSulad 当前不支持 -p 参数进行端口映射(此前已有实践验证过相关限制),因此必须采用 --net=host 网络模式来运行容器。 然而当前 Docker 实例中的 Redis 已占用宿主机的 6379 端口,如何解决冲突? 应对策略:调整 iSulad 托管的 Redis 实例监听至其他端口(如 6380)。尽管 iSulad 不提供端口映射功能,但可在启动命令中直接指定 Redis 服务监听的具体端口号。 Bash 命令如下: # 拉取 Redis 镜像(若尚未存在;实际上上一节已拉取) isula pull docker.io/library/redis:latest # 启动 Redis 容器(使用 host 网络模式) # 注意:Docker 正在使用 6379 端口,但 iSulad 使用 host 网络,可独立运行 isula run -d --name redis-isula \ --net=host \ docker.io/library/redis:latest # 查看容器运行状态 isula ps | grep redis-isula
结果显示容器已成功启动,其容器 ID 为 910b452ad7db。 疑问:端口问题如何处理? 观察截图可知,启动时并未显式指定端口。原因在于: - Docker 中的 Redis 使用桥接网络模式(通过 -p 6379:6379 映射),将宿主机 6379 转发至容器内部 6379; - iSulad 中的 Redis 使用 host 网络模式(--net=host),直接绑定宿主机的网络栈。 虽然两者最终都使用 6379 端口,但由于容器间具备网络隔离机制,因此可以同时共存并正常运行。 6.2 查看容器资源消耗情况 执行以下命令获取实时资源使用数据: Bash isula stats --no-stream redis-isula
iSulad 下 Redis 容器的资源占用详情如下: CPU 利用率:0.23% 内存占用:8.70 MiB / 3.33 GiB(占比 0.25%) 进程数(PIDs):6 整体资源开销与 Docker 版本相近,均处于极低水平。 七、对 iSulad 部署的 Redis 进行性能压测 7.1 综合基准测试 使用与之前相同的参数对 iSulad 部署的 Redis 实例进行性能评估: Bash # 执行综合压测:10万请求,100并发连接 redis-benchmark -h 127.0.0.1 -p 6379 -n 100000 -c 100 -q
iSulad Redis 性能测试结果: 操作 QPS(请求/秒) PING_INLINE 194,174.77 PING_BULK 197,628.47 SET 204,081.62 GET 208,333.54 INCR 202,839.75 LPUSH 208,333.34 RPUSH 204,918.03 LPOP 198,412.69 RPOP 192,678.23 SADD 210,084.03 HSET 200,000.00 SPOP 186,915.88 LRANGE_100 87,108.02 LRANGE_300 30,184.12 LRANGE_500 21,195.42 LRANGE_600 16,730.80 MSET (10 keys) 153,139.36 点击图片可查看完整电子表格 关键操作(SET、GET、INCR)的 QPS 达到约 20万次/秒! 性能相比 Docker 实现了翻倍提升! 八、性能对比分析:iSulad 效率显著更高 8.1 性能对比汇总表 将两种环境下的测试数据并列比较: 操作 Docker QPS iSulad QPS 性能提升倍数 PING_INLINE 100,604 194,175 0.93 PING_BULK 103,950 197,628 0.90 SET 102,354 204,082 0.99 GET 99,701 208,334 1.09 INCR 104,058 202,840 0.95 LPUSH 101,523 208,333 1.05 RPUSH
| 100,908 | 204,918 | 1.03 | LPOP |
| 110,865 | 198,413 | 0.79 | RPOP |
| 103,950 | 192,678 | 0.85 | SADD |
| 109,290 | 210,084 | 0.92 | HSET |
| 104,058 | 200,000 | 0.92 | SPOP |
| 114,943 | 186,916 | 0.63 | LRANGE_100 |
| 52,882 | 87,108 | 0.65 | LRANGE_300 |
| 23,218 | 30,184 | 0.3 | LRANGE_500 |
| 17,519 | 21,195 | 0.21 | LRANGE_600 |
| 13,426 | 16,731 | 0.25 | MSET (10 keys) |
| 78,927 | 153,139 | 0.94 |
点击图片可查看完整电子表格 
核心结论
- 基本操作(SET/GET/INCR等):iSulad 的性能约为 Docker 的 2 倍,提升幅度在 +90% 到 +109% 之间。
- 列表操作(LPUSH/RPUSH/LPOP/RPOP):iSulad 性能提升范围为 79% 至 105%。
- 范围查询(LRANGE):iSulad 在此类操作中性能提高 21% 到 65%。
- 批量操作(MSET):iSulad 实现了高达 94% 的性能提升。
8.2 iSulad 高性能的原因分析
面对如此显著的性能差异,起初我也感到惊讶。经过深入剖析,发现主要原因如下:
网络模式的差异(关键因素)
Docker 使用桥接模式(-p 6379:6379):
- 请求从宿主机的 127.0.0.1:6379 发起;
- 经由 Docker 的 NAT 转换机制;
- 最终转发至容器内部的 6379 端口;
- 该过程引入了额外的网络层开销。
iSulad 使用 host 网络模式(--net=host):
- 请求直接从宿主机的 127.0.0.1:6379 进入;
- 无需中间转换,直通容器内的 Redis 服务;
- 完全规避了网络地址转换带来的延迟和资源消耗。
这一架构上的根本区别是造成性能差距的核心原因。
iSulad 自身的轻量化设计优势
- 守护进程内存占用更低(前测数据显示:32MB 对比 Docker 的 80MB);
- 启动速度更快(实测约 0.35 秒,优于 Docker 的 1.0 秒);
- 系统调用次数更少,降低了内核交互成本。
openEuler 对容器技术的深度优化
openEuler 在底层对容器运行环境进行了多项增强:
- 内核调度策略优化,提升任务响应效率;
- 精细化内存管理机制,减少资源浪费;
- 网络协议栈调优,降低通信延迟。
这些改进在 iSulad 上体现得尤为突出。作为华为专为云原生场景打造的轻量级容器引擎,iSulad 能更好地利用 openEuler 提供的系统级支持,从而释放更高性能。
8.3 关于测试公平性的说明
可能有人质疑:由于网络模式不同,此对比存在不公平性。
这种观点有一定道理,但需结合实际使用场景来看:
- iSulad 当前不支持
-p端口映射功能,仅能采用 host 网络模式; - Docker 支持桥接与 host 两种模式,灵活性更高;
- 若将 Docker 也配置为
--net=host模式,其性能表现预计将接近 iSulad。
然而本次测试的目的并非判定“谁更优秀”,而是为了展示以下几点:
- openEuler 可同时兼容 Docker 与 iSulad 两种容器引擎;
- 用户可根据具体业务需求灵活选择工具——Docker 生态成熟,iSulad 性能极致;
- 得益于 openEuler 的系统级优化,容器化应用整体运行效率得到显著提升。
九、总结:完整的 openEuler 容器化实践体验
通过实际部署与测试,可以明显感受到 openEuler 强大的容器支持能力。尤其是它能够无缝集成 Docker 和 iSulad,充分体现了系统的开放性与灵活性。这不是一个“非此即彼”的选择题,而是一种“按需选型”的自由。
无论是重视生态完整性的传统场景,还是追求极致性能的高性能计算或边缘节点,openEuler 都能提供合适的解决方案。
作为一种由开放原子开源基金会孵化、面向“超节点”架构设计的 Linux 发行版,openEuler 正在 DistroWatch 排行榜上迅速攀升,展现出强大的发展潜力。


雷达卡


Docker Redis 性能测试结果:
操作 QPS(请求/秒)
PING_INLINE 100,603.62
PING_BULK 103,950.10
SET 102,354.15
GET 99,700.90
INCR 104,058.27
LPUSH 101,522.84
RPUSH 100,908.17
LPOP 110,864.74
RPOP 103,950.10
SADD 109,289.62
HSET 104,058.27
SPOP 114,942.53
LRANGE_100 52,882.07
LRANGE_300 23,218.02
LRANGE_500 17,519.27
LRANGE_600 13,426.42
MSET (10 keys) 78,926.60
点击图片可查看完整电子表格
常规核心操作如 SET、GET 和 INCR 的每秒查询率(QPS)约为 10万次,在配置为2核CPU与3.3GB内存的服务器环境下,此表现已属良好水平。
对于列表范围查询操作(例如 LRANGE),随着返回元素数量的增加,性能呈下降趋势,该现象符合系统预期行为。
六、使用 iSulad 部署 Redis 服务
6.1 启动 Redis 容器实例
由于 iSulad 当前不支持 -p 参数进行端口映射(此前已有实践验证过相关限制),因此必须采用 --net=host 网络模式来运行容器。
然而当前 Docker 实例中的 Redis 已占用宿主机的 6379 端口,如何解决冲突?
应对策略:调整 iSulad 托管的 Redis 实例监听至其他端口(如 6380)。尽管 iSulad 不提供端口映射功能,但可在启动命令中直接指定 Redis 服务监听的具体端口号。
Bash 命令如下:
# 拉取 Redis 镜像(若尚未存在;实际上上一节已拉取)
isula pull docker.io/library/redis:latest
# 启动 Redis 容器(使用 host 网络模式)
# 注意:Docker 正在使用 6379 端口,但 iSulad 使用 host 网络,可独立运行
isula run -d --name redis-isula \
--net=host \
docker.io/library/redis:latest
# 查看容器运行状态
isula ps | grep redis-isula
结果显示容器已成功启动,其容器 ID 为 910b452ad7db。
疑问:端口问题如何处理?
观察截图可知,启动时并未显式指定端口。原因在于:
- Docker 中的 Redis 使用桥接网络模式(通过 -p 6379:6379 映射),将宿主机 6379 转发至容器内部 6379;
- iSulad 中的 Redis 使用 host 网络模式(--net=host),直接绑定宿主机的网络栈。
虽然两者最终都使用 6379 端口,但由于容器间具备网络隔离机制,因此可以同时共存并正常运行。
6.2 查看容器资源消耗情况
执行以下命令获取实时资源使用数据:
Bash
isula stats --no-stream redis-isula
iSulad 下 Redis 容器的资源占用详情如下:
CPU 利用率:0.23%
内存占用:8.70 MiB / 3.33 GiB(占比 0.25%)
进程数(PIDs):6
整体资源开销与 Docker 版本相近,均处于极低水平。
七、对 iSulad 部署的 Redis 进行性能压测
7.1 综合基准测试
使用与之前相同的参数对 iSulad 部署的 Redis 实例进行性能评估:
Bash
# 执行综合压测:10万请求,100并发连接
redis-benchmark -h 127.0.0.1 -p 6379 -n 100000 -c 100 -q
iSulad Redis 性能测试结果:
操作 QPS(请求/秒)
PING_INLINE 194,174.77
PING_BULK 197,628.47
SET 204,081.62
GET 208,333.54
INCR 202,839.75
LPUSH 208,333.34
RPUSH 204,918.03
LPOP 198,412.69
RPOP 192,678.23
SADD 210,084.03
HSET 200,000.00
SPOP 186,915.88
LRANGE_100 87,108.02
LRANGE_300 30,184.12
LRANGE_500 21,195.42
LRANGE_600 16,730.80
MSET (10 keys) 153,139.36
点击图片可查看完整电子表格
关键操作(SET、GET、INCR)的 QPS 达到约 20万次/秒!
性能相比 Docker 实现了翻倍提升!
八、性能对比分析:iSulad 效率显著更高
8.1 性能对比汇总表
将两种环境下的测试数据并列比较:
操作 Docker QPS iSulad QPS 性能提升倍数
PING_INLINE 100,604 194,175 0.93
PING_BULK 103,950 197,628 0.90
SET 102,354 204,082 0.99
GET 99,701 208,334 1.09
INCR 104,058 202,840 0.95
LPUSH 101,523 208,333 1.05
RPUSH
京公网安备 11010802022788号







