docker對(duì)網(wǎng)絡(luò)和程序速度的影響解讀
前言
程序即可以部署在容器內(nèi),也可以部署在docker容器中,那么兩者有什么區(qū)別?
部署在容器中相對(duì)于直接部署在宿主機(jī)上,網(wǎng)絡(luò)速度是否會(huì)變慢?程序運(yùn)行是否會(huì)慢?
環(huán)境說(shuō)明
測(cè)試使用的服務(wù)器是百度智能云輕量級(jí)服務(wù)器,2核4G,6M寬帶。

- 系統(tǒng): centos 7.9
- docker版本: Docker version 20.10.13, build a224086
- springboot版本: 2.7.3
- JDK版本: 均為JDK8 (大版本相同避免了JDK大升級(jí)對(duì)程序運(yùn)行產(chǎn)生較大影響,也是為了盡量公平)
網(wǎng)絡(luò)延遲測(cè)試
兩個(gè)標(biāo)簽窗口,上圖直接使用宿主機(jī)進(jìn)行ping 命令,下圖docker的容器內(nèi)進(jìn)行ping命令,同時(shí)ping同一個(gè)ip地址。

根據(jù)多次ping命令的觀察,可以發(fā)現(xiàn)在docker容器內(nèi)進(jìn)行ping命令速度比宿主機(jī)內(nèi)慢0.1~0.2 ms。
結(jié)論:docker 對(duì)網(wǎng)絡(luò)的影響很小,大約比主機(jī)慢0.1~0.2毫秒。
程序速度測(cè)試
程序運(yùn)行速度的是,我們使用springboot 的web方式測(cè)試,代碼是生成一個(gè)倒序的數(shù)組,例如5,4,3,2,1,通過(guò)冒泡排序算法對(duì)數(shù)組排序(從小到大),得出排序所消耗的時(shí)間。
注意:
這里不使用隨機(jī)算法產(chǎn)生數(shù)組作為待排序樣本,是為了保證每次排序的樣本數(shù)組是完全一樣,保證每次測(cè)試公平。
代碼如下:
@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+",耗時(shí):"+(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包,分別直接部署在宿主機(jī)和docker容器內(nèi)。



為了避免不確定因素,我們需要多次測(cè)試,求平均值。
測(cè)試num=100000,將10萬(wàn)個(gè)數(shù)字進(jìn)行排序。
注:
為了避免服務(wù)器不同時(shí)刻,可能cpu負(fù)載不一樣,測(cè)試采用的交替方式,即一次宿主機(jī),一次docker,降低可能存在的不同時(shí)刻主機(jī)負(fù)載的問(wèn)題。
| 編號(hào) | 宿主機(jī)模式(ms) | docker模式(ms) |
|---|---|---|
| 1 | 4590 | 4869 |
| 2 | 4585 | 4647 |
| 3 | 4792 | 4750 |
| 4 | 5116 | 4615 |
| 5 | 5087 | 5087 |
| 6 | 5063 | 5372 |
| 7 | 4978 | 5120 |
| 8 | 5516 | 5098 |
| 9 | 5125 | 5076 |
| 10 | 5346 | 5331 |
| 平均耗時(shí) | 5012 | 5002 |
平均值計(jì)算:去掉一個(gè)最大,去掉一個(gè)最小,求平均數(shù)。
總結(jié):
- 宿主機(jī)和 docker容器運(yùn)行程序的兩種方式,宿主機(jī)并沒(méi)有優(yōu)勢(shì),docker容器運(yùn)行的方式會(huì)盡可能爭(zhēng)取主機(jī)的資源,雖然從平均值看,docker運(yùn)行的模式比宿主機(jī)直接運(yùn)行還快一點(diǎn),但是從單次比較,宿主機(jī)最快的一次運(yùn)行4590毫秒,而docker最快的一次是4647毫秒,這又反向說(shuō)明docker模式的并不一定比主機(jī)模式快,所以docker的平均運(yùn)行比宿主機(jī)快屬于運(yùn)行誤差,不能佐證docker在速度上優(yōu)于主機(jī)。
- 所以主機(jī)運(yùn)行模式和docker容器模式在程序運(yùn)行效率上沒(méi)有明顯的差異。
關(guān)于網(wǎng)上的結(jié)論
在做這個(gè)測(cè)試之前,網(wǎng)上的結(jié)論是物理機(jī)比docker快很多,或者快百分之多少,但是似乎都是以聽(tīng)說(shuō)的方式得到的結(jié)論。這里試驗(yàn)的目的為了以實(shí)際數(shù)據(jù)來(lái)得出結(jié)論,而不是靠猜測(cè)或者聽(tīng)別人說(shuō)。也非常希望有人以
實(shí)際的試驗(yàn)結(jié)論進(jìn)行辯駁,歡迎用事實(shí)依據(jù)的方法糾正。
上述試驗(yàn)僅供參考。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談關(guān)于Docker容器互聯(lián)的初步實(shí)踐
這篇文章主要介紹了淺談關(guān)于Docker容器互聯(lián)的初步實(shí)踐,本文介紹了使用網(wǎng)橋(bridge)來(lái)對(duì)容器進(jìn)行互聯(lián),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
docker容器非root用戶(hù)提權(quán)的問(wèn)題解決
本文主要介紹了docker容器非root用戶(hù)提權(quán)的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
國(guó)內(nèi)可用的Docker鏡像源測(cè)試指南
在使用 Docker 時(shí),由于網(wǎng)絡(luò)原因,直接從 Docker Hub 拉取鏡像可能會(huì)遇到速度緩慢甚至無(wú)法訪問(wèn)的情況,因此,使用國(guó)內(nèi)的 Docker 鏡像源可以顯著提升鏡像拉取速度,本文將介紹如何選擇和測(cè)試國(guó)內(nèi)可用的 Docker 鏡像源,需要的朋友可以參考下2025-02-02
docker compose方式如何安裝ClickHouse數(shù)據(jù)庫(kù)
這篇文章主要介紹了docker compose方式如何安裝ClickHouse數(shù)據(jù)庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04

