为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 <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 向最近创建的容器传递环境变量。我们在此做了如下配置:
  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