docker
概念
首先明白三个概念:
- Image 镜像,相当于一个root文件系统;
- Container 容器,镜像和容器的关系,就像类和对象的关系,镜像是静态的,容器是运行之后的镜像,是动态的;
- Repository 仓库,可以看成一个代码控制中心,用来保存镜像
虚拟化技术最重要的是:隔离,但是docker是不隔离内核的,所以后端的兼容性测试不能用docker来做;
docker可做分布式UI自动化,github上有开源方案,docker-selenium
一个容器只能包含一个镜像,一个镜像却可以用多个容器启动多次
作用:
- 搭建测试环境(将代码打包成镜像进行发布)
- 搭建各类基础服务 禅道 jira testlink jenkins 测试脚本依赖
- 搭建测试执行环境
隔离
- Namespace:名称空间,隔离网络、进程、文件目录等
- Cgroups:隔离资源,如cpu、内存、I/O等
- 联合文件系统:定制镜像中的目录(你只能看到联合文件系统规定的目录)
安装
安装docker
yum -y install docker # 安装
systemctl start docker # 启动
ystemctl enable docker # 加入开机启动
docker version # 验证安装
安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose # 下载 docker-compose
chmod +x /usr/local/bin/docker-compose # 给启动权限
docker-compose --version # 验证安装
配置加速器
阿里云-->搜索“容器与镜像服务”-->进入“镜像加速器”-->复制私有加速链接
# 在/etc/docker/daemon.json文件中添加参数,没有该文件则自己创建一个
{
"registry-mirrors" : ["https://docker.mirrors.ustc.edu.cn"] # 第一种,中国科技大学,有点慢
}
{
"registry-mirrors" : ["阿里云私有加速链接"] # 第二种,阿里云加速器,有点快,推荐使用
}
# 重启docker
systemctl daemon-reload
systemctl restart docker
常用命令
docker images -a # 查看本地镜像
docker pull redis # 下载最新官方redis镜像
docker ps # 查看正在运行的容器
docker stop redis # 停止正在运行的redis容器
docker start redis # 启动停止的容器
docker rm -f redis # 强制删除正在运行的redis容器
docker rmi -f redis # 强制删除redis镜像
docker rmi -s $(docker images -qa) # 删除全部镜像
docker logs -f redis # 查看redis容器日志
docker save redis > redis.tar # 将镜像保存为一个tar包
docker load < redis.tar # 读取tar包的镜像
# 第一次启动容器
docker run -d --name lxjenkins -p 8081:8080 -v /home/jenkins:/var/jenkins_home jenkins/jenkins
# -d 后台运行
# --name="容器新名字":为容器指定一个名称
# -p 指定端口映射 把宿主机的8081端口映射到容器的8080端口
# -v 把宿主机的目录挂载到要启动的容器上去
# -e 指定环境变量
docker start redis # 启动redis容器
docker restart redis # 重启redis容器
镜像信息

- REPOSITORY :镜像仓库 / 镜像名称
- TAG:版本号,不选择则默认下载最新版本
- IMAGE ID:镜像ID
- CREATED:镜像发布时间
- SIZE:镜像大小
配置私有仓库
docker pull registry # 拉镜像
docker run -d -p 5000:5000 registry # 运行
vim /etc/docker/daemon.json
{
"insecure-registries" : ["172.17.63.191:5000"] # 加上这一句,指定仓库的所在ip
}
# 重启docker 如果不生效试试其他的重启方法
service docker restart
搭建服务
testlink
# 下载两个镜像
docker pull bitnami/mariadb
docker pull bitnami/testlink
# 启动 mariadb
docker run -d --name mariadb -e ALLOW_EMPTY_PASSWORD=yes -e MARIADB_USER=bn_testlink -e MARIADB_DATABASE=bitnami_testlink -v /home/bigllxx/test/mysql:/var/lib/mysql -p 8088:3306 bitnami/mariadb:latest
# -e ALLOW_EMPTY_PASSWORD=yes 环境变量传参,允许密码为空
# -e MARIADB_USER=bn_testlink 环境变量传参,指定用户名
# -e MARIADB_DATABASE=bitnami_testlink 环境变量传参,数据库实例名称
docker exec -it mariadb bash # 进入mariadb容器
env # 查看该容器环境变量
# 启动testlink
docker run -d --name testlink -P 8099:80 -P 444:443 -e ALLOW_EMPTY_PASSWORD=yes -e TESTLINK_DATABASE_USER=bn_testlink -e TESTLINK_DATABASE_NAME=bitnami_testlink --link mariadb bitnami/testlink:latest
# --link 连接两个容器,原理:向testlink容器注入了bitnami容器的环境变量,但是这个命令只能连接同一台服务器的容器,如果要实现不同机器之间容器的连接,可以不使用link,直接-e加环境变量就可以
# docker-compose使用
# 把 docker run 的命令行转换为配置文件执行,通常在多个服务(容器)之间需要关联时使用
# 新建文件夹
mkdir /home/bigllxx/compose/testlink
# 新建yml文件并配置 !!!开源的镜像,可以直接去docker hub上复制命令下载,下载之后稍微修改就可以
vim docker-compose.yml
services:
mariadb:
image: 'bitnami/maridab:latest' # 镜像名称,注意加上版本号
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MARIADB_USER=bn_testlink
- MARIADB_DATABASE=bitnami_testlink
volumes: # 挂载目录
- 'mariadb_data:/bitnami'
testlink:
image: 'bitnami/testlink:latest'
environment: # 环境变量
- ALLOW_EMPTY_PASSWORD=yes
- TESTLINK_DATABASE_USER=bn_testlink
- TESTLINK_DATABASE_NAME=bitnami_testlink
- MARIADB_HOST=mariadb
- MARIADB_PORT_NUMBER=3306
ports:
- '80:80'
- '443:443'
volumes:
- 'testlink_data:/bitnami'
depends_on: # 相当于 --link
- mariadb
volumes:
mariadb_data:
driver: local
testlink_data:
driver: local
# 运行
docker-compose up -d
prometheus+grafana
# 下载镜像 普罗米修斯、grafana
docker pull prom/prometheus
docker pull grafana/grafana
# 新建配置文件
vim prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
rule_files:
- rules/*.rules
scrape_configs: # 配置的job 会显示在prometheus的首页上
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']
- job_name: 'cadvisor'
static_configs:
- targets: ['localhost:8091']
# 在同一目录下新建启动脚本
vi start_pro.sh
docker rm -f prometheus
docker run --name=prometheus -d -p 9090:9090 -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
# 运行启动脚本
sh start_pro.sh
# 启动grafana 账号/密码 admin
docker run -d -p 17220:3000 --name grafana grafana/grafana:latest
# 配置数据源
# Comfiguration --> Data Sources --> Add data sources --> 选择第一个 --> url http://39.102.82.225:9090(普罗米修斯的地址+端口)
# 下载仪表板模板 进入官网grafana.com --> Grafana --> Dashboards --> 进入一个仪表板 复制ID --> 回到grafana,点击 + 号 --> import --> 粘贴ID并Load --> Prometheus Data Source 选择为 Prometheus --> 点击import, 大功告成
Node Export
# 下载
wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
# 解压:
tar -xf node_exporter-0.18.1.linux-amd64.tar.gz
# 修改文件名
mv node_exporter-0.18.1.linux-amd64 node_exporter
# 新建 sh 启动文件:
vim start_node_export.sh
nohup ./node_exporter/node_exporter >> node_exporter.log 2>&1 &
# 启动 node_export
sh start_node_export.sh
# 验证是否启动成功 成功后刷新grafana,可以看到服务器的性能数据了
ps -ef | grep node
监测mysql
# 下载mysql、mysqld-exporter
docker pull mysql:5.7
docker pull prom/mysqld-exporter
# 启动mysql
docker run --name some-mysql -v /root/mysql/test/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
# 启动prom/mysqld-exporter
docker run -d --name mysql-exporter -p 9104:9104 -e DATA_SOURCE_NAME="root:123456@(39.102.82.225:3306)/mysql" prom/mysqld-exporter
# 配置仪表盘
# 进入官网grafana.com --> Grafana --> Dashboards --> 找到mysql prometheus 并复制编号 --> 回到grafana,点击 + 号 --> import --> 粘贴ID并Load --> Prometheus Data Source 选择为 Prometheus --> 点击import, 大功告成
搭建 selenium-hub
UI自动化的浏览器集群,原理,driver调用selenium hub ,selenium hub 把请求分发给下面的多个node ,由node去启动浏览器
# 下载镜像
docker pull selenium/hub:3.7.1
docker pull selenium/node-chrome-debug:3.7.1-beryllium # 有debug后缀的镜像,可以支持VNC连接浏览器
# 启动 hub
docker run --name=hub -p 5001:4444 -d selenium/hub:3.7.1-beryllium
# 启动 node
docker run --name=chrome -p 5902:5900 -e NODE_MAX_INSTANCES=6 -e NODE_MAX_SESSION=6 -e NODE_REGISTER_CYCLE=5000 -e DBUS_SESSION_BUS_ADDRESS=/dev/null -v /dev/shm:/dev/shm --link hub -d selenium/node-chrome-debug:3.7.1-beryllium
# -e NODE_MAX_INSTANCES=6 -e NODE_MAX_SESSION=6 指定了这个node注册了多少个浏览器
# 启动之后访问http://39.102.82.225:5001,进入控制台,可以看到浏览器已被启动
# 下载VNC并连接39.102.82.225:5902 VNC密码是:secret
搭建open STF
STF移动设备管理平台,可实现一百六十多台移动设备管理,依赖的东西很多。且容易出现问题,推荐使用docker安装,因为yum太慢了,把所有依赖拉下来都得两天。git仓库: https://github.com/openstf/stf
https://www.cnblogs.com/smfx1314/p/11112037.html 端口相关
ps:最好在Mac本或者Linux虚拟机上搭,云服务器不好搞。除非能把手机插到云服务器上。。。
# android sdk 安装
mkdir /opt/android_sdk # 创建存放目录
wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip # 下载压缩包
unzip sdk-tools-linux-4333796.zip # 解压
vim /etc/profile # 配置环境变量
export ANDROID_HOME="/opt/android_sdk"
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$PATH"
source /etc/profile # 刷新环境变量
sdkmanager --list # 查看已安装信息(是否安装成功)
sdkmanager "build-tools;26.0.0" # 安装build-tools
adb # 检查是否安装成功
docker pull openstf/stf:latest # stf镜像
docker pull sorccu/adb:latest # adb镜像 本地安装了adb就不用搞这个镜像了
docker pull rethinkdb:latest # rethinkdb镜像
systemctl stop firewalld.service # 关闭防火墙
systemctl disable firewalld.service # 禁止开机启动
firewall-cmd --add-port=7100/tcp --permanent # 开放7100端口号
docker run -d --name rethinkdb -v /opt/rethinldb:/data --net host rethinkdb rethinkdb --bind all --cache-size 8192 --http-port 8090 # 启动rethinkdb数据库
docker run -d --name adbd --privileged -v /dev/bus/usb:/dev/bus/usb --net host sorccu/adb:latest # 启动adb,建议adb本地安装吧,就不需要搞这个容器了
docker run -d --name stf --net host openstf/stf stf local --public-ip 192.168.2.72 # 启动stf,后面的ip为本机局域网的ip地址,直接通过 局域网ip:7100就可以访问
# 之后插上手机,打开调试模式,手机会自动装一个stfservice,如果没有装上,请百度手动安装方法
# 不要想着在云服务器上搭一个stf,然后在本机上插手机进行管理,我不确定是否支持,就算支持也需要联系网管做内网穿透
# 连接局域网其他pc上的手机:1、目标pc开启5037端口;2、服务器连接目标pc;3、目标pc连接手机
adb kill-server # 目标pc关闭adb
adb nodaemon server -a -P 5037 # 目标pc对外开放5037端口
docker exec -it stf /bin/sh # 进入容器中
stf local --public-ip 192.168.2.72 --allow-remote # 运行stf服务,ip为上面stf启动时的ip,之后会打印出多行日志,选择与下面日志相近的,修改一下(1、前面加上stf;2、public-ip修改为本机局域网ip;3、adb-host修改为目标pc的ip),如下
stf provider --name localhost.localdomain --min-port 7400 --max-port 7700 --connect-sub tcp://127.0.0.1:7114 --connect-push tcp://127.0.0.1:7116 --group-timeout 900 --public-ip 192.168.2.72 --storage-url http://localhost:7100/ --adb-host 192.168.2.42 --adb-port 5037 --vnc-initial-size 600x800 --mute-master never --allow-remote
打包并运行一个spring boot镜像
- 创建一个存放镜像的目录(镜像空间)
- 将jar包拷贝到该目录下
- 在此目录下新建一个Dockerfile文件,并写好脚本
- 打包镜像到私人仓库,在Dockerfile目录执行命令 docker build -t xxx .
- 运行 docker run xxx
Dockerfile脚本:
# 文件名必须使用Dockerfile
# 基于什么运行,如果本地仓库不存在,将会去官网下载
FROM java:8
# 向docker添加jar /解压jar后的文件存放目录
ADD esdemo-0.0.1-SNAPSHOT.jar /esdemo-0.0.1-SNAPSHOT.jar
# 端口号/协议
EXPOSE 8080/tcp
# 可以理解为 java-jar esdemo-0.0.1-SNAPSHOT.jar
ENTRYPOINT["java","-jar","esdemo-0.0.1-SNAPSHOT.jar"]

浙公网安备 33010602011771号