【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】