一、前言
安裝方式可以采用: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\tgz包,並指定到具體目錄-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


