為JMeter使用者和測試者準備的六種Docker映象
【51CTO.com快譯】眾所周知,一套好的容器會像一把瑞士軍刀那樣,有著一整套非常實用的工具集可供使用。如果您是一名Apache JMeter™和Docker的使用者,那麼擁有一套可用於效能測試的Docker映象和容器是非常必要的。本文將向您推薦6種可用於效能測試的Docker映象。
在開始之前,為了簡化維護、隔離系統、並提高安全性,請您直接通過Docker來安裝這些工具,而不要將它們安裝到您的計算機環境中。你可以通過連結:https://www.blazemeter.com/blog/make-use-of-docker-with-jmeter-learn-how?utm_source=blog&utm_medium=BM_blog&utm_campaign=top-6-docker-images-for-jmeter-users-and-performance-testers,來了解更多如何在本地安裝Docker。
1. 無GUI的JMeter(https://hub.docker.com/r/vmarrazzo/jmeter/)
JMeter映象能夠建立一個無GUI的JMeter執行容器。通過JMeter映象,使用者沒必要再去設定諸如Java虛擬機器和屬性檔案的環境,而只需要專注於建立測試指令碼和測試資源(如資料檔案)便可。
由於去除了各種GUI、文件和外掛(當然您可以自行新增),JMeter映象顯得十分輕巧,您可以在需要執行JMeter時快速、便捷地使用到它。
我自行開發了一個JMeter映象,它不但功能豐富,而且靈活地適用於各種JMeter的測試專案:
- 輕量級 - 基於Alpine Linux(譯者注:是由社群開發的、面向安全應用的輕量級Linux發行版)和OpenJDK,只有94Mb
- 支援Apache JMeter 4.0 – 這是JMeter的最新版本
- 外掛可擴充套件性 - 您可以動態地通過Docker的卷(volume),向容器的執行新增各種外掛
- JMeter命令列 – 由於映象並不過濾任何JMeter的命令引數,因此它能夠允許多種執行模式
- 分散式模式 –在分散式模式下,該映象可以被用來建立容器叢集
下面讓我們來看幾個例子:
下面示例的命令是操縱一個容器來執行某個jmx指令碼。注意該jmx指令碼必須在與容器相同的機器上被執行。在測試完畢後,容器會停止下來,並在執行機上留下報告和各種日誌檔案。
export timestamp=$(date +%Y%m%d_%H%M%S) && \ export volume_path=<where files are on host> && \ export jmeter_path=/mnt/jmeter && \ docker run \ --volume "${volume_path}":${jmeter_path} \ jmeter \ -n <any sequence of jmeter args> \ -t ${jmeter_path}/<jmx_script> \ -l ${jmeter_path}/tmp/result_${timestamp}.jtl \ -j ${jmeter_path}/tmp/jmeter_${timestamp}.log
第二命令是執行一個作為客戶端的JMeter容器,以傳遞要執行的指令碼。其中引數“-R”傳遞的是JMeter伺服器例項的IP地址。
docker run \ --net $TEST_NET --ip $CLIENT_IP \ -v "${volume_path}":${jmeter_path} \ --rm \ jmeter \ -n -X \ -Jclient.rmi.localport=7000 \ -R $(echo $(printf ",%s" "${SERVER_IPS[@]}") | cut -c 2-) \ -t ${jmeter_path}/<jmx_script> \ -l ${jmeter_path}/client/result_${timestamp}.jtl \ -j ${jmeter_path}/client/jmeter_${timestamp}.log
2. InfluxDB(https://hub.docker.com/_/influxdb/)和Grafana(https://hub.docker.com/r/grafana/grafana/)
InfluxDB和Grafana映象都提供了一種開源的、時序的資料庫功能。這兩種功能強大的Web工具能夠收集結構化的資料,並進行分析。它們既可以被放在一起使用,又可以被單獨使用。
每個InfluxDB資料集都會包含幾個由欄位集和時間戳組成的“鍵-值”對。InfluxDB沒有外部依賴性,卻能提供一個類似於SQL語言的、內建的、以時間為中心(time-centric)的功能。該元件可以被用於收集JMeter的統計資料。
以下命令是在一個定製的Docker網路中執行InfluxDB容器。
docker run --rm \ --name influxdb \ -dit \ --net $TIME_SERIES_NET \ -e INFLUXDB_DB=db0 \ -e INFLUXDB_ADMIN_ENABLED=true \ -e INFLUXDB_ADMIN_USER=admin \ -e INFLUXDB_ADMIN_PASSWORD=passw0rd \ -e INFLUXDB_USER=grafana \ -e INFLUXDB_USER_PASSWORD=dbpassw0rd \ -v $INFLUXDB_VOLUME:/var/lib/influxdb \ influxdb
- --rm 是在完成後自動刪除容器,因此在重新啟動期間並不會保留必要的容器資訊
- --name 是正執行中的容器名稱,可以在Docker網路中被用作域名
- --dit 使用本地shell在後臺執行容器,也能被諸如遠端ssh命令列所使用
- --net 分配一個由Docker處理的虛擬網路
- -e 向最近建立的容器傳遞環境變數。我們在此做了如下配置:
- INFLUXDB_DB - 本地資料庫名稱
- INFLUXDB_ADMIN_ENABLED、INFLUXDB_ADMIN_USER和INFLUXDB_ADMIN_PASSWORD – 為admin配置檔案配置可用性
- INFLUXDB_USER和INFLUXDB_USER_PASSWORD - 配置供Grafana使用的、標準的使用者配置檔案
- -v 在主機上分配一個就算容器重啟,也仍然存在的邏輯卷。使用該卷,我們可以為必要的資料限制磁碟空間
Grafana則是用於資料分析和匯出的強大工具。Grafana並不直接連到JMeter,但它可以通過Docker被加到我們的程序中。
如下命令可以執行Grafana容器:
docker run --rm \ --name=grafana \ -dit \ --net $TIME_SERIES_NET \ -p 3000:3000 \ -e GF_SECURITY_ADMIN_PASSWORD =adminpassw0rd \ -v $GRAFANA_VOLUME:/var/lib/grafana \ grafana/grafana
- --rm 是在完成後自動刪除容器,因此在重新啟動期間並不會保留必要的容器資訊
- --name 是正執行中的容器名稱,可以在Docker網路中被用作域名
- --dit 使用本地shell在後臺執行容器,也能被諸如遠端ssh命令列所使用
- --net 分配一個由Docker處理的虛擬網路
- -e 傳遞GF_SECURITY_ADMIN_PASSWORD,即Grafana UI的密碼
- -v 在主機上分配一個就算容器重啟,也仍然存在的邏輯卷。使用該卷,我們可以為必要的資料限制磁碟空間
當該容器執行時,我們可以將Grafana的配置作為資料來源,來分配給InfluxDB執行。
後臺監聽器(Backend Listener,請參見:https://jmeter.apache.org/usermanual/component_reference.html#Backend_Listener)負責InfluxDB的具體實施,它可以執行與JMeter的整合。所以在測試執行JMeter,上傳其統計資訊到InfluxDB時,以及用Grafana完成測試之後,我們可以按需匯出各種報告。
3.Selenium(https://hub.docker.com/u/selenium/)
Selenium映象提供了一個現成的解決方案,以提高自動化的Web瀏覽器測試。Selenium雖然沒有獨立的映象,但是它提供了適用於不同執行模式的多種映象(如:Selenium Hub和Selenium Node)。
這些映象可以輕鬆地與容器化的JMeter相整合,不過需要具備如下兩個前提條件:
- 為執行中的JMeter安裝 JMeter的WebDriver外掛,請參見:https://www.blazemeter.com/blog/mixing-selenium-into-your-load-scenario?utm_source=blog&utm_medium=BM_blog&utm_campaign=top-6-docker-images-for-jmeter-users-and-performance-testers
- 將JMeter的指令碼配置為RemoteWebDriver
如下命令可以快速地建立一個容器,以供Selenium測試終端(瀏覽器+驅動)。在該測試中,由於選擇了Selenium的除錯映象,我們可以通過VNC協議來觀察測試的執行。
docker run \ -d -p ${port4Driver}:4444 -p ${port4VNC}:5900 \ --shm-size=2g \ selenium/standalone-chrome-debug:3.14.0-beryllium #### OR docker run \ -d -p ${port4Driver}:4444 -p ${port4VNC}:5900 \ --shm-size=2g \ selenium/standalone-firefox-debug:3.14.0-beryllium
4.Jenkins-CI(https://hub.docker.com/r/jenkins/jenkins/)
Jenkins映象通過與現有的、基於Docker的架構相整合,以實現構建上的自動化。Jenkins映象能夠廣泛地被社群所支援,並定期被更新。Jenkins-CI常被作為伺服器端應用執行起來,以管理許多不同的任務。Jenkins-CI可以管理JMeter測試指令碼的排程、執行和結果的歷史資訊。
如下命令可執行一個Jenkins-CI容器:
docker run \ -d \ -v ${jenkins_home}:/var/jenkins_home \ -p 8080:8080 \ jenkins/jenkins:lts
- -d 分離模式
- -v 安裝從主機處掛接的一個卷,並在容器重啟時保留任務的配置
- -p 匯出Jenkins-CI UI用於監聽主機的埠資訊
由於沒有Docker的卷,其配置資料夾在容器停止後將不復存在。因此為了儲存Jenkins-CI的配置資料(或是在版本控制工具中進行跟蹤),我們需要在容器和主機之間對捲進行配置。
Jenkins-CI可以通過如下兩種方式來管理JMeter的執行:
- 通過jmeter-performance-plugin,在Jenkins-CI所執行的相同容器中執行JMeter,具體請參見:https://www.blazemeter.com/blog/how-to-use-the-jenkins-performance-plugin?utm_source=blog&utm_medium=BM_blog&utm_campaign=top-6-docker-images-for-jmeter-users-and-performance-testers
- 呼叫遠端命令執行,以便另一個容器可以處理JMeter的執行
在通過其他工具從同一容器中執行JMeter時,您會碰到的唯一限制便是自己的資源。不過如果您能夠使用一個額外的容器,則會簡化資源處理的相對成本。
5.Taurus(https://hub.docker.com/r/blazemeter/taurus/)
Taurus映象執行的是開源的Taurus。它自動、且恰當地包裝了JMeter、Gatling(https://gatling.io/)、Locust.io(https://locust.io/)、Grinder(http://grinder.sourceforge.net/)和Selenium等工具。因此該映象包括了所有必要的依賴項,同時能夠定期提供更新與支援,讓使用者能夠專注於自身的測試。
如下命令可以用來執行Taurus。
docker run \ --rm \ -v ${scripts_directory}:/bzt-configs \ -v ${artifacts_directory}:/tmp/artifacts \ blazemeter/taurus
- --rm 在執行結束後刪除容器的資料
- -v(第一個) 將Taurus指令碼卷掛載到主機上,並共享輸入指令碼
- -v(第二個) 將Taurus的各個工件掛載到主機上,並共享工件的輸出
6.註冊伺服器(https://docs.docker.com/registry/deploying/)
Docker註冊伺服器是一個用於儲存各種映象的本地映象庫。我們可以用它來集中那些被頻繁使用的Docker映象。籍此,您可以快速地搭建自己的工作網路,並大幅減少在獲取映象上所花費的時間。這是一款官方的Docker映象,因此它作為標準化的Docker元件被官方支援和文件化。另外,它的定期更新不會給專案帶來任何風險。
如下命令可以建立一個執行的容器,以便成為我們工作網路中的一個儲存庫。
docker run -d --rm \ -p 5000:5000 \ -v $REGISTRY_VOLUME:/var/lib/registry \ --restart=always \ --name registry \ registry:2
- -p 釋出主機上的工作埠
- --rm 在終止時移除容器的資訊
- -v 將卷與本地機器相連線,為儲存在Docker映象裡的資料新增一個配置檔案
- --restart 用於在終止的情況下,更改容器的行為。在我的例子中,我將restart設為常規政策
- --name 容器名
一個配置好的容器服務能夠在較短的時間內,以推或拉的方式按需提供一臺儲存伺服器。
如上所述,本文討論了可供JMeter效能測試的一些重要的Docker映象。如果您願意,可以在建立好了自己的JMX檔案之後,將其上傳到BlazeMeter(譯者注:是一個連續性測試平臺,請參見http://info.blazemeter.com/testing-landing-page2?utm_source=blog&utm_medium=BM_blog&utm_campaign=top-6-docker-images-for-jmeter-users-and-performance-testers),以獲取可擴充套件性、高階的分析和各種協作能力。
原文標題:Top 6 Docker Images for JMeter Users and Performance Testers,作者:Vincenzo Marrazzo
【51CTO譯稿,合作站點轉載請註明原文譯者和出處為51CTO.com】