docker对网络和程序速度的影响解读

 更新时间:2025年01月02日 11:23:04   作者:后会无期77  
本文通过对比分析,测试了在宿主机和Docker容器中部署Spring Boot程序的性能差异,在网络延迟方面,Docker容器比宿主机慢0.1~0.2毫秒,在程序运行速度方面,宿主机和Docker容器的平均运行时间相近,单次运行时间存在较大差异,无法确定Docker容器在速度上优于宿主机

前言

程序即可以部署在容器内,也可以部署在docker容器中,那么两者有什么区别?

部署在容器中相对于直接部署在宿主机上,网络速度是否会变慢?程序运行是否会慢?

环境说明

测试使用的服务器是百度智能云轻量级服务器,2核4G,6M宽带。

  • 系统: centos 7.9
  • docker版本: Docker version 20.10.13, build a224086
  • springboot版本: 2.7.3
  • JDK版本: 均为JDK8 (大版本相同避免了JDK大升级对程序运行产生较大影响,也是为了尽量公平)

网络延迟测试

两个标签窗口,上图直接使用宿主机进行ping 命令,下图docker的容器内进行ping命令,同时ping同一个ip地址。

根据多次ping命令的观察,可以发现在docker容器内进行ping命令速度比宿主机内慢0.1~0.2 ms。

结论:docker 对网络的影响很小,大约比主机慢0.1~0.2毫秒。

程序速度测试

程序运行速度的是,我们使用springboot 的web方式测试,代码是生成一个倒序的数组,例如5,4,3,2,1,通过冒泡排序算法对数组排序(从小到大),得出排序所消耗的时间。

注意:

这里不使用随机算法产生数组作为待排序样本,是为了保证每次排序的样本数组是完全一样,保证每次测试公平。

代码如下:

    @GetMapping("/test/{num}")
    public String test(@PathVariable("num") int num){
        long s=System.currentTimeMillis();
        int[] arr=new int[num];
       for(int i=num;i>0;i--){
           arr[num-i]=i;
       }
        //System.out.println(Arrays.toString(arr));
        BubbleSortMethod(arr);//冒泡排序
       // System.out.println(Arrays.toString(arr));
        long e=System.currentTimeMillis();
        return "排序:"+num+",耗时:"+(e-s)+" ms";
    }

    public static int[] BubbleSortMethod(int[] arr){
        int temp = 0;
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length-1 -i; j++) {
                if (arr[j] > arr[j+1]){
                    temp  = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        return arr;
    }

将程序打包为jar包,分别直接部署在宿主机和docker容器内。

为了避免不确定因素,我们需要多次测试,求平均值。

测试num=100000,将10万个数字进行排序。

注:

为了避免服务器不同时刻,可能cpu负载不一样,测试采用的交替方式,即一次宿主机,一次docker,降低可能存在的不同时刻主机负载的问题。

编号宿主机模式(ms)docker模式(ms)
145904869
245854647
347924750
451164615
550875087
650635372
749785120
855165098
951255076
1053465331
平均耗时50125002

平均值计算:去掉一个最大,去掉一个最小,求平均数。

总结:

  • 宿主机和 docker容器运行程序的两种方式,宿主机并没有优势,docker容器运行的方式会尽可能争取主机的资源,虽然从平均值看,docker运行的模式比宿主机直接运行还快一点,但是从单次比较,宿主机最快的一次运行4590毫秒,而docker最快的一次是4647毫秒,这又反向说明docker模式的并不一定比主机模式快,所以docker的平均运行比宿主机快属于运行误差,不能佐证docker在速度上优于主机。
  • 所以主机运行模式和docker容器模式在程序运行效率上没有明显的差异。

关于网上的结论

在做这个测试之前,网上的结论是物理机比docker快很多,或者快百分之多少,但是似乎都是以听说的方式得到的结论。这里试验的目的为了以实际数据来得出结论,而不是靠猜测或者听别人说。也非常希望有人以

实际的试验结论进行辩驳,欢迎用事实依据的方法纠正。

上述试验仅供参考。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker容器进入的4种方式(小结)

    Docker容器进入的4种方式(小结)

    本文主要介绍了Docker容器进入的4种方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Docker 查看镜像信息的方法

    Docker 查看镜像信息的方法

    这篇文章主要介绍了Docker 查看镜像信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 浅谈关于Docker容器互联的初步实践

    浅谈关于Docker容器互联的初步实践

    这篇文章主要介绍了浅谈关于Docker容器互联的初步实践,本文介绍了使用网桥(bridge)来对容器进行互联,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • docker容器非root用户提权的问题解决

    docker容器非root用户提权的问题解决

    本文主要介绍了docker容器非root用户提权的问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • docker如何使用阿里加速器的方法

    docker如何使用阿里加速器的方法

    本篇文章主要介绍了docker如何使用阿里加速器的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 国内可用的Docker镜像源测试指南

    国内可用的Docker镜像源测试指南

    在使用 Docker 时,由于网络原因,直接从 Docker Hub 拉取镜像可能会遇到速度缓慢甚至无法访问的情况,因此,使用国内的 Docker 镜像源可以显著提升镜像拉取速度,本文将介绍如何选择和测试国内可用的 Docker 镜像源,需要的朋友可以参考下
    2025-02-02
  • docker compose方式如何安装ClickHouse数据库

    docker compose方式如何安装ClickHouse数据库

    这篇文章主要介绍了docker compose方式如何安装ClickHouse数据库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • docker 搭建单机PostgreSQL操作详解

    docker 搭建单机PostgreSQL操作详解

    本文通过实际案例操作演示了如何基于Docker搭建pg的完整过程,并补充了pg数据库操作的常用命令和授权命令,感兴趣的朋友一起看看吧
    2025-04-04
  • Docker如何批量删除images

    Docker如何批量删除images

    这篇文章主要介绍了Docker如何批量删除images问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • docker search命令的具体使用

    docker search命令的具体使用

    本文主要介绍了docker search命令的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论