测试开发之路 (工具篇)--Docker

news2024/11/27 16:34:19

目录

前言

什么是 docker

在 demo 中学习

mysql

更复杂点的场景


前言

Docker是一种开源的容器化平台,它可以帮助开发人员和测试人员更轻松地构建、部署和运行应用程序。在测试开发中,Docker可以提供许多便利和优势。

什么是 docker

官网上和各类文章中都对 docker 作出了明确的阐释,但是这些定义过于专业和高大上了。所以他姥爷这个土鳖就用俺们村的大白话给大家说一下。

Docker 这个单词英文原意是码头工人,搬运工的意思,这个搬运工搬运的是各种应用。docker 是一种容器技术。有的小伙伴们不了解什么是容器的话就把它当虚拟机吧。虽然 docker 不是虚拟机,但是大家可以把它当成虚拟机用。我们把各种应用(例如我们测试环境中的各种服务)制作成镜像(镜像制作很简单),docker 这个搬运工要搬运的东西就是这个镜像,它可以启动一个或者 N 个容器并把镜像搬运进去,这就是为什么我在《环境管理》那篇分享中可以一下子启动近 30 套测试环境的原因。只要我有镜像,在任何有 docker 服务的机器中都可以迅速拉起 N 套测试环境来。

在 demo 中学习

干说概念性的东西容易让人懵逼。我们还是像学习编程从 hello world 开始一样,我们先演示一个 demo,从迅速搭建一个 test link 应用开始。

mysql

首先我们需要一个 mysql 服务来存储 test link 的数据。按照上面说的,我们需要一个 mysql 镜像。 那么我们如何制作镜像呢? docker 的好处之一就是共享,他人制作的镜像我们可以下载下来直接使用。怎么做呢? 我们可以去 docker hub 中直接搜寻 mysql 的官方镜像

具体的使用细节官方镜像附带的说明中写的很清楚,很简单。我们来用一下吧。首先是下载 mysql 5.5 的镜像。命令如下:

docker pull mysql:5.5

运行过后我们下载了镜像. docker pull 这条命令就是在 docker hub 上搜寻并下载一个镜像。接下来我们运行一下 docker images | grep mysql 来查看本地下载的 mysql 镜像。docker images 的意思就是列出所有的镜像。

OK,我们有了 mysql 的镜像了,那么我们怎么使用这个镜像呢。 来来来,我们关键的地方到了。请看下面的脚本

export name=testlink_mysql
export ip=172.27.1.221

docker rm -f $name
docker run --name=$name -e MYSQL_ROOT_PASSWORD=root -itd -v /home/testlink_data:/var/lib/mysql --net=none  mysql:5.5

pipework br0 $name $ip/20@172.27.0.1

接下来我们讲解一下这些命令。从 docker rm -f 开始把,这条命令是删除一个容器,还记得什么是容器么? 容器是镜像的载体。我们的镜像要放在容器里运行的。所以如果有同名的容器我们先删除它,当然这一步不是必须得。 接下来我们看 docker run 的命令, 这条命令就是用镜像去启动一个容器,命令的最后的那个 mysql:5.5 就是镜像的名称(我们之前用 docker pull 下载的),是不是很简单。这样我们就启动了这个 mysql 的服务了。当然中间有一些参数我来详细的讲解一下。

  1. --name:定义容器的名称。我们可以通过 docker ps 来查看所有容器。
  2. -e: 启动容器时向容器内传递一个环境变量,这个参数可以有多个。 这是非常重要的一个参数,有些时候我们在制作镜像的时候并不清楚一些行为到底要怎么定义,需要在启动容器的时候决定。例如这个例子里我们用-e 向 mysql 容器传递了 root 的密码。mysql 容器在启动的时候会读取这个环境变量并设置 root 密码
  3. -v: 这同样是一个很重要的参数,它是一个挂载的概念。是在主机和容器间共享数据的方式。用:分割,左边是宿主机的文件目录,右边是容器的目录。这个参数在我们做数据备份的时候很有用。在这个例子我把 mysql 存储数据的目录挂载到了主机的一个目录里。这样就算容器被人不小心删除了,数据也不会丢失的。
  4. --net:这个参数指定 docker 的网络模式,我一般设置为 none,因为我要分配固定 ip 最后一个命令,pipework,它是一个第三方的工具,可以给容器分配固定 ip。有兴趣的可以在网上搜一下这个工具的使用。

OK,运行这个脚本后,我们的数据库服务就搭建好了。是不是很简单。你不是运维的同学,你不必懂 mysql 得配置,你只需要下载官方镜像直接使用就可以了。

test link

接下来我们搞一搞 test link 吧。同样现在 docker hub 上搜一下有没有人已经做好了 test link 的镜像。很幸运的我发现也是有的。我们运行一下 docker pull otechlabs/testlink 下载即可。我们同样用下面的命令启动 test link 容器

export name=testlink_new
export ip=172.27.1.220

docker rm -f $name
docker run -itd --name=$name --hostname=$name --net=none -v /home/testlink_upload:/var/testlink testlink

pipework br0 $name $ip/20@172.27.0.1

命令跟上面 mysql 一样,也很简单,唯一需要注意的是我挂载目录的位置是 test link 保存附件的文件夹,testlink 不是所有数据都保存在数据库里的,所以这部分也要挂载出来保存。容器启动后,我们使用 ip 登录 test link,见证奇迹的时刻就到了。剩下的你只需要根据 test link 的页面配置一下数据库了。到这里我们就搭建了一个在测试工作中很常见的用例管理工具。当然到了这里我们还有些不太完美。就是到了这里我们的数据虽然都挂载到宿主机上保存了。但是 test link 的配置缺没有,这是容器启动后,我们在页面上配置的。这部分的信息我们没有保存。所以我们需要修改一下镜像了。如下:

FROM otechlabs/testlink

ADD files /var/www/testlink

这是一个 Dockerfile,制作镜像的语法文件。我们使用 Dockerfile 的语法来扩展一个镜像。 第一行的 FROM 命令大家看到了,说明是继承自另一个镜像的。也就是说我们对 test link 镜像做扩展。熟悉编程的小伙伴们理解起来一定很容易,你就把它当成面向对象语言中的继承就行了。 接下来我们用 ADD 命令,把宿主机中的 files 文件夹下所有的文件都 copy 到镜像中的/var/www/testlink 文件夹中。 这里说一下我把 test link 的 config 文件存在了 files 文件中,所以也就是说 config 文件现在被 copy 到了 test link 容器里了。接下来我们运行一个简单的命令构建镜像。

docker build -t testlink .

这是构建一个惊险的命令,要在 Dockerfile 的目录下执行。这样我们新的镜像就做好了。我们用新的镜像代替之前启动 test link 的旧镜像。一切就 OK 了,完美了。test link 的配置文件也就存到了镜像里了。

这是一个搭建 test link 的简单应用。我们经理了下载官方镜像并使用的过程,扩展镜像满足我们自己需要的过程。 我们可以用这个思想搭建各种基础服务。那下面我们再说复杂一点的场景

更复杂点的场景

现在说说我们的测试环境,要搭建测试环境肯定就没有那么成熟的镜像给我们用了。我们需要自己专门定制一个镜像出来,首先我们要做一个基础镜像,解决依赖的问题,例如我们的产品是 java 的项目,那我们要装:maven,jdk,git,ssh 等等。下面看一下 Dockerfile 的例子:

FROM docker.io/ludalex/docker-java7-maven-aws-git
MAINTAINER sungaofei(sungaofei@4paradigm.com)

ADD files /root

RUN apt-get update \
    && apt-get install wget -y \
    && apt-get install -y openssh-server \
    && /etc/init.d/ssh start \
    && apt-get install -y oracle-java7-set-default \
    && cd /tmp \
    && wget http://apache.claz.org/thrift/0.9.3/thrift-0.9.3.tar.gz \
    && tar -zxvf thrift-0.9.3.tar.gz \
    && cd thrift-0.9.3 \
    && ./configure && make \
    && make install \
    && cd /opt \
    && mkdir web \

大家看到首先我还是继承了一个从 docker hub 上下载的基础镜像,通过名字就可以看出来,这个基础镜像里已经有了 maven,git 之类的东西。但还不够,我们需要再下载一点东西。RUN 这个命令就是执行 shell 命令的。 它最大的作用就是安装一些依赖包。在 RUN 里面,最常用的就是 apt-get 了。上面的例子我下载并安装了 ssh 的组件包,jdk7,thrift 的 RPC 框架包等等。然后再运行一个 docker built -t 我们就做好这个基础镜像了,这解决了我们的依赖问题。以后再制作任何 java 镜像我们都可以通过扩展这个基础镜像来做。
接下来我们看一下部署镜像的 Dockerfile

FROM 4paradigm/dango2.0-test-base-new
ADD files /root

ENTRYPOINT ["/root/entrypoint.sh"]

可以看到这个镜像貌似没干什么。但是,恩? ENTRYPOINT 是个什么鬼? 这个很重要,非常重要。大家记住了,这是启动容器后第一个运行的命令。也就是说,它是容器的启动命令,它是容器启动后干的第一个事。我们通常把启动服务的脚本放在这里。我们同 ADD 命令把一些启动脚本放在容器的/root 目录下。然后通过 ENTRYPOINT,运行启动脚本。我们来看一下 entrypoint.sh 这个脚本都干了什么

cd /root
echo "setup is running"

# deploy simba
cd /opt/web

git clone git@git.4paradigm.com:prophet/simba.git


cd /opt/web/simba
git checkout ${simba_branch}

if [ -n ${simba_commit_id} ]
then
    echo "reset to commit_id ${simba_commit_id}"
    git reset ${simba_commit_id}
fi

mvn -DskipTests clean package -U

cd /opt/web
./startserver.sh

中间我删除了一些干扰代码,真实的情况比这个复杂些。看到这个脚本里我们拉取了 git 上的代码。编译并运行了启动脚本。大家注意这里我读取了一些环境变量,例如${simba_branch},这就是通过启动容器的时候(也就是 docker run)的 -e 的参数传递进来的环境变量。 这样我们就做到了容器的参数化。接下来我们运行 docker run 就可以了,我们的这个 java 项目的测试环境的搭建起来了。当然我中间刻意忽略了一些细节免得大家被干扰。但是我们用 docekr 搭建测试环境的流程大概就是这样的了。

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)

相信能使你更好的进步!

点击下方小卡片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/769745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware Cloud Director 10.5 - 领先的云服务交付平台

VMware Cloud Director 10.5 - 领先的云服务交付平台 Support for vSphere 8.0U1 & NSX 4.1 请访问原文链接:https://sysin.org/blog/vmware-cloud-director-10/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.or…

【ShenYu系列】ShenYu的SPI实现源码分析

前言 前面我已经介绍【面试系列】详细拆解Java、Spring、Dubbo三者SPI机制的原理,当已经有了合适的实现,shenyu自身的SPI和上面的有啥区别,值得玩味。 什么是SPI SPI就是Service Provider Interface,直译"服务提供方接口&…

go+vue+wails写一个简单的密码加密器

git仓库 gitee: malred/password-generator-wails-vue gitee: malred/password-generator-wails-vue github: https://github.com/malred/password-generator-wails-vue wails是什么 我们用它来套壳前端项目(vue),打包成桌面端…

Java虚拟机——类加载机制概述 类加载的时机

在Class文件中描述的各类信息,最终都需要加载到虚拟机中之后才能被运行和使用。本章将会介绍虚拟机如何加载这些Class文件,Class文件中的信息进入到虚拟机后会发生什么变化。类加载机制:Java虚拟机把描述类的数据从Class文件加载到内存&#…

【ArcGIS】shp导入报错ORA-00911无效字符

这个当个问题记录以下,就是shp文件名或者字段名有非正常字符,修改下名称重新导入即可; 直接改shp没法修改字段,会报错,需要先转化为gdb文件,然后在修改

【Spring】Spring AOP入门及实现原理剖析

文章目录 1 初探Aop1.1 何为AOP?1.2 AOP的组成1.2.1 切面(Aspect)1.2.2 连接点(Join Point)1.2.3 切点(Pointcut)1.2.4 通知(Advice) 1.3 AOP的使用场景 2 Spring AOP入门2.1 添加 Spring AOP 框架⽀持2.2 定义切面和切点2.3 定义相关通知 3 Spring AOP实现原理3.1 …

tauri自定义窗口window并实现拖拽和阴影效果

需求说明 由于官方提供的窗口标题并不能实现我的需求,不能很好的实现主题切换的功能,所以根据官方文档实现了一个自定义的窗口,官方文档地址:Window Customization | Tauri Apps 但是实现之后, 没有了窗体拖拽移动的…

linux系统编程-进程

目录 1 程序和进程 1.1 并发 1.3 多道程序设计 1.4 CPU 和 MMU 1.5 进程控制块 PCB 1.6 进程状态 1.7 环境变量 1.8 setenv 函数 2. 进程控制 2.1 fork 函数 2.2 循环创建 n 个子进程 2.3getpid 函数 2.4 getppid 函数 2.5 getuid 函数 2.6 getgid 函数 2.7 进…

分表后mybatis-plus删除操作失效等问题处理

因为重构dao层&#xff0c;问题太多了&#xff0c;于是想着另起一个章节。 3 mybatis封装对象的问题 直接使用mybatis自身的对象&#xff0c;会有问题&#xff0c;他的列表对象会设置一个id&#xff0c;导致后续的工程会出问题 <select id"getStatementDefaultEquation…

基于SpringBoot+vue的银行OA系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

使用Electron包装ruoyi-ui/ruoyi-vue实践总结

背景&#xff1a;最近公司新起的项目&#xff0c;由于工期、资源等原因&#xff0c;采用ruoyi框架快速实现开发&#xff0c;由于需要构建客户端&#xff0c;所以借助electron来实现。 electron 是使用javascript html css来构建跨平台的桌面应用程序。 官网地址&#xff1a;简介…

ModelWhale 基于 AI for Science 助力航遥中心基础设施建设

2023 年 3 月&#xff0c;科技部会同自然科学基金委启动“人工智能驱动的科学研究&#xff08;AI for Science&#xff09;”专项部署工作。科技部新一代人工智能发展研究中心主任赵志耘认为&#xff0c;AI for Science 将突破传统科学研究能力瓶颈&#xff0c;成为全球科研新范…

【2023-07-18】jsvmp逆向profileData

加密逻辑 注册gid需要用到profileData&#xff0c;profileData的加密逻辑是将一个46对键值对的json经过bas64编码后进行des加密&#xff0c;这46对键值对都是环境和设备相关的一些参数&#xff0c;要完整还原profileData还需要将这些参数的生成逻辑进行还原。 变量名说明key…

Python开发项目基于卷积神经网络的车牌识别仿真软件设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

ICASSP2023论文解读|如何检测会议记录中的待办事项?

得益于语音识别技术的发展&#xff0c;人工智能可以帮助人们记录会议&#xff0c;自动检测与会后行动项关联的会议内容&#xff0c;并进行总结。 行动项识别对于管理会后待办任务至关重要。 针对对于行动项识别任务&#xff0c;相关数据集稀缺且规模小。因此&#xff0c;达摩…

酷炫无敌!10分钟学会制作3D园区大屏,职场新人也能秒变大神!

近年来随着大数据的飞速发展&#xff0c;各大行业都进行了一定的产业革新&#xff0c;智慧园区也逐渐进入企业视野并成为主流&#xff0c;不论大小企业&#xff0c;领导老板都要求员工制作出智慧园区的酷炫大屏&#xff0c;不顾及其中的技术难度&#xff0c;只想看到最终成果&a…

2023隐私计算大会亮点前瞻:《隐私计算应用 面向政务场景的应用要求》标准解读预告

7月26日&#xff0c;2023隐私计算大会将于青岛正式扬帆&#xff0c;本次大会将齐聚业内专家大咖共论行业最新进展&#xff0c;洞察未来发展趋势&#xff0c;共同推进隐私计算行业蓬勃发展。 本次大会将正式公开发布《隐私计算应用研究报告&#xff08;2023&#xff09;》、“隐…

J2EEJSP自定义标签库01out标签if标签

目录 一.什么是标签 二.JSP自定义标签库 2.1 JSP标签库是什么 2.2 处理流程 2.3 如何自定义标签 2.4 标签类型 三.开发示例 3.1 out标签 1.创建助手类 2.编写tld&#xff08;标签库的描述&#xff09;文件&#xff0c;&#xff08;必须放在WEB-INF目录或其目录下&a…

LCD—STM32液晶显示(3.NOR FLASH时序结构体)

目录 LCD结构体配置 NOR FLASH时序结构体 FSMC的NOR FLASH初始化结构体 LCD结构体配置 NOR FLASH时序结构体 与控制SRAM时一样&#xff0c;控制FSMC使用NOR FLASH存储器时主要是配置时序寄存器以及控制寄存器&#xff0c;利用ST标准库的时序结构体以及初始化结构体可以很方便地…

第六章:string类

系列文章目录 文章目录 系列文章目录前言为什么学习string类C语言中的字符串ASCIIUnicode**UTF-8**UTF-16UTF-32 GBK 标准库中的string类string类总结 string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作3. string类对象的访问及遍历操作4. string类对…