一、前言
安装方式可以采用:CentOS7和Ubuntu;
我们的电脑通常安装的是 Windows 操作系统:Windows 下有 Windows 2003, Windows 2007, Win7,Win10;
还有其他操作系统:Linux,Dos,Mac,Unix等。
Linux 系统,就有2个系列的概念:debian 系和 redhat 系统。
debian系主要有Debian,Ubuntu,Mint等及其衍生版本;
redhat系主要有RedHat,Fedora,CentOs等。
所以,CentOS 是 Linux操作系统的一个品牌。
二、docker介绍
Docker是DotCloud开源的、可以将任何应用包装在Linux container中运行的工具。Docker基于Go语言开发,Docker可以自动化打包和部署任何应用,方便地创建一个轻量级私有PaaS云,也可以用于搭建开发测试环境以及部署可扩展的web应用等。
2.1Docker vs VM
从下图可以看出,VM是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。但Docker目前还不够完善,比如隔离效果不如VM,共享宿主机操作系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。
个人理解,如果不对,欢迎留言纠正:docker是一个容器,基于镜像工作的,每一个软件其实就是一个镜像,镜像好比是类,容器好比是对象,类可以创建n个对象,在不同的对象里工作,比如mysql镜像,可以创建多个容器,同时运行多个mysql,或者同时运行mysql、SQL server;
三、本文介绍在centos上安装docker
3.1yum配置
yum是centos的命令语法
linux服务器采用ares测试环境ip-可以通过home-cmdb查看
首先需要切换root身份》sudo -i,可以发现命令行的身份由lcsuper转换成了root
3.1.1检查下内核版本uname -r
只要大于3.10即可
3.1.2然后执行yum update 命令
is this ok [y/d/n]:选择y-yes
如图所示complete表示成功
3.1.3 安装需要的软件包
yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
》yum install -y yum-utils device-mapper-persistent-data lvm2
3.1.4 设置yum源为阿里云
》yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.2 yum安装docker
3.2.1可以查看所有仓库中所有docker版本:
yum list docker-ce --showduplicates | sort -r
如果不指定docker-ce版本那么直接安装最新版本
如果指定版本的命令是:docker-ce-18.09.1
》yum -y install docker-ce(安装社区版)
3.2.2安装错误卸载docker
如果安装错误,可以卸载,先查看安装的版本内容:命令yum list installed | grep docker
然后执行移除的命令:yum remove docker.x86_64 docker-client.x86_64 docker-common.x86_64 -y
多个软件用空格分隔,一起移除
3.2.3安装成功docker-ce
3.2.4查看centos版本
rpm -q centos-release
3.2.5docker 配置国内镜像源(从 ustc 拉取镜像)
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
docker 从 docker hub 拉取镜像,因为是从国外获取,速度较慢。可以通过配置国内镜像源的方式,从国内获取镜像,提高拉取速度。
查看etc下有没有docker文件:
cd /etc
ls
首先创建docker文件
命令:mkdir -p /etc/docker
mkdir -p xx/yy的好处就是一次可以创建多级文件夹,若xx文件夹不存在,则先创建xx文件夹,然后在xx文件夹下创建yy文件夹
然后编辑文件:vim /etc/docker/daemon.json
点击键盘:insert进入输入状态
输入:{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}
然后esc,再输入:wq回车则保存成功
3.3docker的启动与停止
3.3.1启动docker
命令:systemctl start docker
3.3.2查看启动状态
命令:systemctl status docker
出来的Active(running)就说明你的docker安装成功,你可以自己安装你自己需要使用的工具了
3.3.3设置开机自动启动命令:
systemctl enable docker.service
验证docker是否启动成功可以通过:docker run hello-world
因为没有该镜像,所以自动从远程拉取镜像,再次执行则返回:hello成功
3.3.5停止docker命令
systemctl status docker
3.4镜像命令
3.4.1查看镜像
命令:docker images
repository:资料库即镜像名称
TAG:标签即版本
IMAGEID:镜像id
CREATED:镜像创建时间
SIZE:镜像大小
这些镜像都是存储在docker宿主机的/var/lib/docker目录下
3.4.2搜索镜像
如果需要从网络中搜索镜像们可以通过以下命令搜索
docker serch 镜像名称
3.4.3拉取镜像
docker pull 镜像名称
3.4.4删除镜像
docker rmi 镜像id
3.4.5删除所有镜像
docker rmi 'docker images -q'
3.5容器命令
3.5.1查看正在运行的容器
docker ps
查看所有容器
不管运行没有,都会查到
docker ps -a
查看最后一次运行的容器
docker ps -l
查看停止的容器
docker ps -f status=exited
3.5.2创建与启动容器
docker run
-i:表示运行容器
-t:表示容器启动后会进入其命令行,加入这两个参数后,容器创建就登陆进去,即分配一个伪终端,即交互式创建容器;
-d:表示后台运行容器,-t是命令行ip变成了容器的id,无法操作宿主机的应用了;
--name:为创建的容器命名
-v:目录映射关系
-p:端口映射
交互式创建容器:
docker run -i -t --name 镜像名称:TAG /bin/bash
-i和-t的作用是进入交互模式。/bin/bash的意思就是使用容器的命令行来输入命令。执行结果如下:
name名称不填则会自动生成一个名称
docker run -i -t --name=mysql mysql:latest /bin/bash
或者
docker run -it --name mysql mysql:latest /bin/bash
root@7d150a0fb029:/#
root后面跟的就是容器id,表明你已经进入容器,可以输入命令了,你可以输入一些常用命令试试:
exit可以退出容器
docker run -di --name=mysql2 mysql:latest
这是后台运行容器mysql
登陆容器用命令:docker exec -it mysql2 /bin/bash
exec 是进入已经存在的容器
四、docker部署jmeter
4.1DockerFile
4.1.1什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
4.1.2使用 Dockerfile 定制镜像
命令介绍官网:https://www.runoob.com/docker/docker-dockerfile.html
在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:
进入docker目录
新建Dockerfile:mkdir Dockerfile,
然后进入Dockerfile目录,
编辑Dockerfile:vim Dockerfile
输入内容如下:
#jdk的镜像,定制的镜像都是基于 FROM 的镜像,为基础镜像,jdkopenjdk:8-jre-sli可以查看宿主机多有镜像
FROM openjdk:8-jre-slim
#镜像的作者
MAINTAINER cici
#定义Jmeter版本的变量
ARG JMETER_VERSION=5.4.1
#安装实用程序,apt-get,是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。
#在shell 格式中,您可以使用 (反斜杠)将一条 RUN 指令继续到下一行
RUN apt-get clean &&
apt-get update &&
apt-get -qy install
wget
telnet
iputils-ping
unzip
# Install JMeter,tar -xvzf解压tar.gz gz包,并指定到具体目录-c,rm是linux删除文件,wget是下载文件,地址是jmeter官方下载jmeter历史版本的地址;
RUN mkdir /jmeter
&& cd /jmeter/
&& wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
&& tar -xvzf apache-jmeter-$JMETER_VERSION.tgz -C /jmeter
&& rm apache-jmeter-$JMETER_VERSION.tgz
# Set ENV JMeter的环境变量设置
ENV JMETER_HOME /jmeter/apache-jmeter-$JMETER_VERSION/
ENV PATH $JMETER_HOME/bin:$PATH
#拷贝宿主机上的jmeter插件到镜像中,对于 COPY命令来说,如果要把本地的文件拷贝到镜像中,那么本地的文件必须是在上下文目录中的文件
##WORKDIR 命令为后续的 RUN、CMD、COPY、ADD 等命令配置工作目录。也就是把当前目录即Dockerfil下的jar包copy到ext目录下;
#workdir $JMETER_HOME/lib/ext/
#copy JMeterPlugins-Extras.jar .
#copy JMeterPlugins-Standard.jar .
workdir $JMETER_HOME/
#将文件从Dockerfile copy到相对jmeter_home的绝对路径lib//ext下
copy JMeterPlugins-Extras.jar lib/ext/
copy JMeterPlugins-Standard.jar lib/ext/
copy 新建文本文档.txt bin/
copy dcjmt0415.jmx bin/
apt-get install为了在容器中安装软件
编辑容器文件方式:
进入容器,直接和宿主机一样,使用vim命令编辑文件。
注:如果vim命令没有,可以使用yum -y install vim或者apt-get install vim命令安装。
sudo apt-get install -y
这里主要将的就是-y选项,添加这个选项就相当于不需要重复地确认安装
sudo apt-get install -q
即-quiet,静默安装,当然也不是完全静默,会将低等级的log信息屏蔽。
sudo apt-get remove
既然有安装就会有卸载,remove指令就是卸载,值得注意的是,remove仅仅卸载软件,但是并不卸载配置文件
sudo apt-get purge
卸载指令,同时卸载相应的配置文件
Dockerfile命令的ADD和cpy的区别:
ADD可以将宿主机Dockerfile文件copy到指定目录,它可以copy压缩包并解压,然后把压缩包删除
copy不能将压缩包解压缩
例如:
workdir /jmeter/
#将当前宿主机的Dockerfile下的123.tgz文件copy到workdir根目录下,构建镜像后进入容器的根目录可以看到123.tgz变成了123文件夹
ADD ./123.tgz ./
CMD/entrypoint都是在容器run启动时执行的命令,后面跟的是参数/命令行,cmd如果启动容器时指定了其他命令,则cmd不生效,但是entrypoint可以生效;
下图copy的文件地址必须是Dockfile下的,否则会提示找不到文件,以下是错误的copy示范
这里的.指的是打包当前路径下的所有文件,后面的.不要漏了,指的是在当前宿主机Dockerfile目录下构建,否则报错;
4.1.3打包镜像
docker build -t dkmt .
4.1.4 查看镜像是否打包成功
docker images | grep dcjmt
4.1.5推送镜像到docker hub远程仓库
将镜像push到镜像仓库,那么所有人都能获取了,前提需要登陆docker hub镜像仓库
仓库用户名需要登录docker-hub注册
https://hub.docker.com/signup
注册成功那么需要docker login 登录一下才能push到仓库
需要先将镜像打标,才能push
tag后面是镜像名称和版本,然后用户名/镜像名称和版本
docker tag dcjmt dctercc/dcjmt:5.4.1
docker push dctercc/dcjmt:5.4.1
查看镜像:docker images
4.1.6准备jmeter脚本和参数文件
运行jmeter需要容器中有.jmx脚本
方法1:脚本可以提前把文件拖到linux的/tmp目录下,
cp到宿主机的Dockerfile目录下
然后在Dockerfile编辑里,放到工作目录apache-jmeter-5.4.1的bin目录下
如果有参数变量还需要准备参数文件同jmx文件,这个文件的路径必须和csv配置的路径一样
在容器中/jmeter就是根目录
方法2:从宿主机拷文件到容器里面
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
docker cp /etc/docker/Dockerfile/1/123.txt dcjmt3name:/jmeter/apache-jmeter-5.4.1/bin
不管容器有没有启动,拷贝命令都会生效
4.1.7启动已经存在的容器
docker start 容器id,然后用exec命令来选择是交互式还是守护式操作容器
run -it/di是基于镜像创建容器并启动,所以登陆已存在的容器是先启动容器然后exec登陆
echo命令和cat命令解释:
echo 123>123.txt是将123内容写入文件中
cat是输出文件内容
然后构建镜像,运行容器,然后进入bin目录:cd bin查看是否有文件验证
4.1.8运行jmeter脚本命令
有文件那么用jmeter脚本命令运行就会在指定目录生成测试脚本
4.1.9生成报告从容器里面拷文件到宿主机
这里是具体的文件可以用这个命令,如果是文件夹需要压缩后再cp
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt
将test1/下面的文件压缩为test1.zip的压缩包,/表示目录下的所有文件
zip -q -r test1.zip test1/
五、docker部署jmeter分布式
参考教程:https://developer.aliyun.com/article/769520
我们在同一主机中创建所有容器。
例如,JMeter和JMeter slave都在同一台机器上运行。因此,所有系统资源将由这些容器共享。
5.1搭建slave机
sudo命令:
sudo -i 直接运行sudo命令加-i参数
sudo su 运行sudo命令给su命令提权,运行su命令。
sudo -i 运行结果 PWD=/root
sudo su 运行结果 PWD=/home/用户名(当前用户主目录)
5.1.1配置slave镜像文件
5.1.2构建镜像
docker build -t dcjmtslave7 .
docker tag dcjmtslave7 dctercc/dcjmtslave7:5.4.1
docker push dctercc/dcjmtslave7:5.4.
提示java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
说明Dockerfile文件中没有开启server.rmi.ssl.disable
方法如下:
-Jserver.rmi.ssl.disable=true
5.1.3查看端口号是否被占用命令
netstat -ntpl |grep 60005
查询结果没有,则说明没有在占用
5.1.4启动slave机
docker run -it --name slave9 dctercc/dcjmtslave8:5.4.1 /bin/bash
运营之后jmeter-server就起来了
我们可以看下docker ps
5.1.5查看容器ip
需要登陆容器查看
采用后台登陆的方式
docker inspect --format='{{.NetworkSettings.IPAddress}}' slave10
或者查看容器的全部信息
docker inspect slave10
或者运行以下命令查看全部容器的ip
sudo docker inspect --format '{{ .Name }} => {{ .NetworkSettings.IPAddress }}' $(sudo docker ps -a -q)
5.1.4退出容器命令
exit
或者Ctrl+P+Q
5.2搭建master容器
在基础镜像的容器中做的修改,都不会影响镜像的内容
所以如果想引用基础镜像做了修改后的容器,那么就需要复制容器才行;
ls -a1指令指的是查看当前目录下所有含隐藏文件
退出编辑Dockerfile界面用ctrl+z
5.2.1配置master机镜像文件
如果运行容器时提示-D无效的话,可以把entrypoint去掉,直接通过外部编辑jmeter.properties,再cp到容器中也一样的效果
5.2.2运行启动镜像文件
5.2.3测试是否引用成功
将测试脚本cp到容器中
docker cp /etc/docker/Dockerfile/dcjmt0415.jmx master2:/jmeter/apache-jmeter-5.4.1/bin
csv文件
docker cp /etc/docker/Dockerfile/新建文本文档.txt master2:/jmeter/apache-jmeter-5.4.1/bin
容器执行脚本
jmeter -n -t bin/dcjmt0415.jmx -l bin/log4.jtl -e -o bin/test4
5.3分布式运行
1.将jmeter.properties中的server.rmi.ssl.disable=true
2.将remote_hosts=172.17.0.3:1088,172.17.0.4:1088配置
端口可不填
3.将测试脚本.jmx文件copy到master/slave的bin目录
通过先把文件拖拽到linux的tmp里面,再cp到宿主机的Dockerfile目录下,然后从这个目录cp到容器中
csv参数文件同理也cp到容器中
-R后面需要跟具体的slave机ip
-r指的全部的slave机
jmeter -n -t dcjmt0415.jmx -l log7.jtl -e -o test7 -r
5.3.1生成的报告
docker cp master5:/jmeter/apache-jmeter-5.4.1/bin/test7 /etc