为JMeter用户和测试者准备的六种Docker镜像

发表于:2018-11-19来源:51cto作者:Vincenzo Marrazzo点击数: 标签:Docker
众所周知,一套好的容器会像一把瑞士军刀那样,有着一整套非常实用的工具集可供使用。如果您是一名Apache JMeter?和Docker的用户,那么拥有一套可用于性能测试的Docker镜像和容器是非

众所周知,一套好的容器会像一把瑞士军刀那样,有着一整套非常实用的工具集可供使用。如果您是一名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?<>of?jmeter?args>?\?
??-t?${jmeter_path}/?\?
??-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}/?\?
??-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 向最近创建的容器传递环境变量。我们在此做了如下配置:
  1. INFLUXDB_DB - 本地数据库名称
  2. INFLUXDB_ADMIN_ENABLED、INFLUXDB_ADMIN_USER和INFLUXDB_ADMIN_PASSWORD – 为admin配置文件配置可用性
  3. 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


原文转自:developer.51cto.com/art/201811/587041.htm