转载

Docker在开发、测试中的应用

传统的软件开发、测试、运维需要三个团队在三个不同的环境中进行,而三个环境的不同引发了很多的问题。如:工作内容的重复;开发环境中可运行的程序在测试和运维环境下却未必正常;开发人员提交代码前的测试不充分而引入新的BUG,没有有效的机制进行提交前的充分测试;测试出的BUG因为环境的复杂使得开发人员难以复现等等。

Docker的出现让一切都不同以往,Docker可以将系统与应用打包成一个镜像,可以根据Dockerfile和一个简单的构建命令轻易的重现开发和测试的环境。将Docker引入持续集成构建系统中,保证了开发、测试、运维环境的统一。结合Github和Jenkins可以实现自动化测试和自动部署。现已有很多基于Docker容器技术的开发、测试、运维一站式解决方案。Docker相关产品应用的出现使得Docker的使用越来越方便。

开源项目Jenkins是一个开放易用的持续集成平台,可用于执行和监控重复性的工作,可以方便的安装第三方插件。其主要功能:

  • 持续的软件版本发布/测试项目;
  • 监控外部调用执行的工作;

BuildPipeline:这是Jenkins的一个插件,它可以将多个需要协同工作的Jenkins任务按照流水线进行排序,将各任务间的关系变为可视化的图表,使得部署流程清晰可见。

通过Docker可以将每一个任务模块化,并通过Dockerfile制作有针对性的镜像来运行任务,并可以通过管道获取各任务的执行时间和结果,为产品的成功发布奠定基础。接下来就是根据自身情况合理的利用和调度Docker。

Docker对测试的影响

  • 让单元测试运行的更顺畅;
    单元测试驱动开发是一个很好的应用程序开发方式,单元测试往往也是和代码一起被提交到代码仓库中。但是很多单元测试通常依赖于很多其他服务,而这些服务的标准化配置往往是一个难点,如数据库的搭建、防火墙的配置等。而Docker容器则可以将这些配置一起打包到新的镜像中,从而轻松的完成这些测试。
  • 让虚拟机不再困扰集成测试和功能测试;
    为降低成本,过去很多不同业务的测试会运行在同一个虚拟机中,这样的测试环境并不纯粹。而通过Docker则可以在数秒内部署出一套清洁的测试环境,包括微服务的架构的测试环境,同时这些测试环境是可以共享的。
  • 测试团队和客户无需再配置冗长的配置文件;
    通常软件的复杂度越高,其环境配置也就越复杂,传统的测试通常需要先根据用户文档进行环境配置,而且还不一定一次性成功,错误的环境配置也更容易报出Bug。而Docker则可以通过打包镜像保证开发、测试、运维环境的一致性,包括配置文件、路径、权限等。
  • 可以轻易复现Bug场景;
    传统开发过程中,客户的环境往往无法共享给开发团队,导致Bug的复现出现困难,不得不通过客户的log进行分析。而Docker则可以通过镜像立刻复现客户的运行场景,更快的定位问题。
  • Dockerfile可以构建流程清晰可见;
    Dockerfile是描述Docker镜像构建步骤的一个文档,从FROM开始,每一步都是以上一步指令产生的镜像为基础,执行当前的命令,然后将执行结束后的整个环境打包成一个新的镜像层并添加到基础镜像之后。以哪个镜像为基础,又先后对该镜像进行了哪些操作都清晰可见,而镜像的构建又是严格依照该文件描述的步骤进行,所以说,只要Dockerfile相同,依据其所构建的镜像也是相同的,当然,前提条件是你的基础镜像也相同。
  • 成熟的测试套件和工具可以通过镜像共享;
    软件厂商发布的测试套件和工具可以直接打包进镜像进行发布。环境的配置直接使用镜像即可,而不再是根据用户手册进行配置。

Docker技术适用范围

Docker的目标:Build,Ship,and Run Any App,Anywhere;即在任何地方构建、部署、运行任何应用程序。

但是Docker依然有它自身的局限性:

  • 因为容器与主机公用内核,所以如果容器需要使用不同的内核版本,主机内核就需要做同步变更;
  • 不能修改内核参数或自主定制内核;
  • 对内核版本有依赖,Docker通常需要3.10或以上版本的内核;
  • 在容器中加载或卸载内核模块会影响到主机和其他容器;
  • 跨主机通信能力不足;
  • 无法像qemu一样模拟嵌入式系统运行环境;

虽然某些旧版本内核也可以运行Docker,但是Docker官方对这类内核不提供支持,而这类内核很可能潜在诸多问题。另外,运行Docker对很多内核编译选项有要求,基于旧版本内核的Linux发行版不一定开启了这些编译选项,可能需要用户重新编译内核才能运行。

Jenkins + Docker自动化环境配置

##搭建Jenkins环境##

  • 方法一:直接在主机中配置Jenkins环境;
    wget -qO - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | apt-key add - && echo 'deb http://pkg.jenkins-ci.org/debian binary/' | tee /etc/apt/sources.list.d/jenkins.list && apt-get update && apt-get -y install jenkins
  • 方法二:使用Docker镜像配置Jenkins环境;

    拉取Jenkins镜像

    $ docker pull jenkins

    启动jenkins容器

    $ docker run -d -p 49001:8080 --name jenkins-demo jenkins

    在浏览器中访问容器所在宿主机ip:49001即可进入Jenkins页面

    大多数工具基本都是这两种安装方式。

构建Gitlab环境

Gitlab类似于Github,是一个项目管理程序,可以浏览源代码、管理缺陷和注释,不同的是Github私有项目收费,而Gitlab则是搭建在自己的服务器上的。具体操作请参照 Gitlab官方网站 。当然你也可以选择Github,很多有名的开源项目都是放在Github上的,你也可以找到更多的帮助和说明文档。

配置Jenkins环境

需要的Jenkins控件(系统管理 - 管理插件):

  • GIT client plugin:1.18.0
  • GIT plugin:2.4.0
  • Gitlab Merge Request Builder:1.2.2
  • GitLab Plugin:1.1.25
  • SCM API Plugin

如果需要更多的Jenkins控件请点击 这里 。

接下来需要配置Jenkins的从节点。在从节点主机上安装Java包:

apt-get -y install default-jre

Jenkins主节点是Jenkins Web Server所在的主机,负责测试任务的调度,不负责测试用例的执行。而从节点接受主节点的调度,负责测试用例的执行。

配置Gitlab中的项目参数

Jenkins中的常用Docker插件

  • Docker build step plugin:可以添加Docker命令到构建步骤中;
  • CloudBees Docker Build and Publish plugin:提供通过Dockerfile构建工程的能力并将制作好的镜像发布到Docker仓库中;
  • Docker Plugin:可以使用Docker主机动态分配的容器作为Jenkins的从节点;
  • Kubernetes Plugin:通过由Kubernetes管理的多个Docker主机系统来动态分配的容器作为Jenkins的从节点;
  • Docker Commons Plugin:为其他与Docker相关的插件提供API;
原文  http://dockone.io/article/1467
正文到此结束
Loading...