【Docker实例总结】基于Dockerfile+DockerCompose搭建多容器Locust-Master-Slave压测环境

一、搭建环境背景

最近在利用locust编写压测框架,主要用于模拟公司终端的TcpClient向服务端发送注册报文建立长连接,然后每30s发送一次心跳报文用于维持长连接存在,压测框架搭好之后直接在公司电脑上面进行本地化master-slave压测。开发leader的要求是能够模拟10w个长连接,但是我只能实现1w个长连接的建立和维持。所以这个时候就需要使用到容器技术来解决这个问题,通过dockerfile+docker-compose.yml来创建1个master+6个slave容器进行master-slave多机压测,且实现外网访问master查看性能统计信息。

二、准备工作

1、压测框架准备

针对Master以及Slave环境,分别创建了基于locust的Master压测框架以及Slave压测框架

2、镜像打包准备

我基于基础镜像建立了压测框架运行的环境,包含初始化环境、Master环境以及Slave环境,分别commit为如下镜像

【Docker实例总结】基于Dockerfile+DockerCompose搭建多容器Locust-Master-Slave压测环境_第1张图片

 三、编写Dockerfile

1、Master压测环境dockerfile

# 终端TcpClient客户端-Master
FROM luozelin/locust_device_master:v1
LABEL maintainer="luozelin"
# 端口
EXPOSE 8089
# master启动
CMD locust -f /MyProjects/DeviceTcpHttpMaster/RunLab_DeviceTcp_Master.py --master

首先基于镜像,然后暴露端口,最后在容器创建之后执行locust命令开启locust_master

2、Slave压测环境dockerfile

# 终端TcpClient客户端-Slave1
FROM luozelin/locust_device_slave:v1
LABEL maintainer="luozelin"
# slave启动
CMD locust -f /MyProjects/DeviceTcpHttpSlave/RunLab_DeviceTcp_Slave1.py --slave --master-host=172.18.0.2

首先基于镜像,然后在容器创建之后执行locust命令开启locust_slave,并且绑定到master的ip地址(master的ip地址是自定义网段并且给予了固定的ip,这样每次生成的master容器ip地址固定,这样就能在locust命令中将slave与master进行绑定,怎么实现下面将介绍)

四、使用Docker-Compose进行Docker容器生成管控

查看docker-compost.yml文件

version: "2"
services:
  # 终端TcpClient_Master节点
  tcp_client_master:
    image: luozelin/locust_device_master:v1
    build:
      context: .
      dockerfile: dockerfile_master
    container_name: locust_master
    ports:
      - "8089:8089"
    networks: 
      extnetwork:
        ipv4_address: 172.18.0.2

  # 终端TcpClient_Slave1节点
  tcp_client_slave1:
    image: luozelin/locust_device_slave:v1
    build:
      context: .
      dockerfile: dockerfile_slave1
    links: 
      - tcp_client_master
    networks: 
      extnetwork:
        ipv4_address: 172.18.0.3

networks:
  # 网络自定义
  extnetwork:
    ipam: 
      config: 
        - subnet: 172.18.0.0/16
          gateway: 172.18.0.1

上面的docker-compose配置分为两部分,分别为services以及networks,下面分别进行介绍

1、networks网络模块

networks:
  # 网络自定义
  extnetwork:
    ipam: 
      config: 
        - subnet: 172.18.0.0/16
          gateway: 172.18.0.1

networks网络模块可以自定义网段,其中subnet为分支网络,gateway为网关,设置了这个自定义网段之后就可以指定services的ip地址,也是实现多容器locust多机master-slave压测的关键

2、services服务模块,配置了master以及slave服务

services:
  # 终端TcpClient_Master节点
  tcp_client_master:
    image: luozelin/locust_device_master:v1
    build:
      context: .
      dockerfile: dockerfile_master
    container_name: locust_master
    ports:
      - "8089:8089"
    networks: 
      extnetwork:
        ipv4_address: 172.18.0.2

  # 终端TcpClient_Slave1节点
  tcp_client_slave1:
    image: luozelin/locust_device_slave:v1
    build:
      context: .
      dockerfile: dockerfile_slave1
    links: 
      - tcp_client_master
    networks: 
      extnetwork:
        ipv4_address: 172.18.0.3
  • master服务配置了端口映射,因为locust的web模式的默认端口为8089,所以配置8089:8089端口映射,即在外网访问8089端口则会映射到master容器的8089端口上
  • master服务配置了ipv4_address,给予master容器一个固定的ip,这样就可以在slave中进行ip绑定,实现master-slave多机压测
  • slave服务配置了links,使得slave容器可以ping通master容器
  • slave服务配置了ipv4_address,给予slave容器一个固定的ip,并且使得master容器和slave容器在networks指定的自定义网关当中

注意:如果自定义的分支网络已经在使用,则会报错,此时可以用以下方法解决

第一、可以通过docker network ls查看当前所有的网络

第二、找到需要删除的分支网络,使用命令docker network rm 进行分支网络的删除

五、运行docker-compose.yml+dockerfile配置多机压测环境

跳转到docker-compose.yaml所在的文件夹下,使用命令docker-compose up --build自动生成和配置容器

可以看到master和slave容器分别生成,并且slave已经连接到了master节点上,下面我们在本地浏览器使用http://localhost:8089打开master服务

【Docker实例总结】基于Dockerfile+DockerCompose搭建多容器Locust-Master-Slave压测环境_第2张图片

可以看到在本地浏览器可以打开master生成的locust的web端压测服务,并且可以看到图中slave为1,即表示slave容器已经连接到了master容器上,这样就实现了多容器locust-master-slave压测环境了

【Docker实例总结】基于Dockerfile+DockerCompose搭建多容器Locust-Master-Slave压测环境_第3张图片

你可能感兴趣的:(Docker,Locust)