关于Docker在测试方面的应用

简介:

简单来看,什么是Docker?

Docker的英文本意是码头工人,也就是搬运工,这种搬运工搬运的是集装箱(Container),集装箱里面装的可不是商品货物,而是任意类型的App,Docker把App(叫Payload)装在Container内,通过Linux Container技术的包装将App变成一种标准化的、可移植的、自管理的组件,这种组件可以在你的笔记本上开发、调试、运行,最终非常方便和一致地运行在生产环境下的各种云机房和服务器上。

Docker的核心底层技术是LXC(Linux Container),Docker在其上面加了薄薄的一层,添加了许多有用的功能。

Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行;
Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主要是聚焦于如何机器启动地更快和耗更少的内存;
Docker为App提供了一种自动化构建机制(Dockerfile),包括打包,基础设施依赖管理和安装等等;
Docker提供了一种类似git的Container版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git那样进行合并;
Docker Container是可重用的,依赖于版本化机制,你很容易重用别人的Container(叫Image),作为基础版本进行扩展;
Docker Container是可共享的,有点类似github一样,Docker有自己的INDEX,你可以创建自己的Docker用户并上传和下载Docker Image;
Docker提供了很多的工具链,形成了一个生态系统;这些工具的目标是自动化、个性化和集成化,包括对PAAS平台的支持等;


Docker 有什么用呢?

从运维的角度来说,你的应用程序一般都需要特定版本的操作系统、应用服务器、 JDK 、数据库服务器,还可能需要调整配置文件和其他一些依赖关系。应用程序可能需要绑定到指定的端口和一定量的内存。这些运行应用程序所需要的组件和配置就是所说的应用程序操作系统。你当然可以写一个包含下载和安装这些组件的安装脚本。 Docker 简化了这个流程,通过创建一个包含应用程序和基础设施的镜像(image),当作一个组件进行管理。这些镜像可以创建 Docker 容器(container),容器运行在 Docker 提供的容器虚拟化平台上。

Docker 的构成
Docker 有两个主要组件:
Docker:开源的容器虚拟化平台
Docker Hub:共享和管理 Docker 镜像的 Saas 平台


Docker 采用 Linux 容器 来提供隔离、沙箱、复制、资源限制、快照和其他的一些优势。镜像是 Docker 的“构建组件”,也是应用操作系统的只读模版。容器是从镜像创建出来的运行状态,是 Docker 的“运行组件”。容器是可以运行、启动、停止、移动和删除的。镜像保存的仓库是 Docker 的“分发组件”。

Docker的镜像与容器
Docker 按启动顺序包含两个组件:
服务端:运行在宿主机上,负责构建、运行和分发 Docker 容器等重要工作
客户端:Docker 二进制程序,接收用户的命令和服务程序进行通信
客户端可以和服务端运行在一台主机上,也可以在不同的主机上。服务端需要用 pull 命令从仓库中拉一个镜像下来。服务端可以从 Docker Hub 或者其他配置的仓库中下载镜像。服务端主机可以从仓库中下载和安装多个镜像。然后客户端就可以用 run命令 来启动容器。客户端与服务端通过socket或者REST API 进行通信。

Docker 的安装
在 CentOS 中安装 Docker:
sudo yum -y install docker-io    #安装 docker
sudo service docker start        #启动 docker 服务
sudo chkconfig docker on         #如果需要 docker 服务为自启动


在Ubuntu/Debian中安装 Docker:
sudo apt-get udpate
sudo apt-get install docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io     #命令自动补全
其它操作系统的安装可以查看官方文档。

Docker的运行与退出
在了解了Image和Container的概念后,我们可以开始下载一个Image,Docker的好处就是提供了一个类似github的Image仓库管理,你可以非常方便pull别人的Image下来运行,例如,我们可以下载一个CentOS Image:
sudo docker pull centos:centos6
这里 centos6是一个 tag,类似于 Git 的 tag,能过它来确定下载的 CentOS 的版本。下载完成后,执行docker images命令来列出你已经下载的 images。

下载之后,我们通过命令行来运行一个容器,命令很简单,例如我们想执行一个 shell 终端:
sudo docker run -i -t centos:centos6 /bin/bash


默认情况下,docker 容器是不提供交互shell 的,也不提供标准输入。可以指定-i选项来提供交互,提供-t 选项来分配一个伪终端。
在 Shell 中你可以做你想做的任意操作,安装软件,编写程序,运行命令等。当你操作后想将结果保存,这时可以用 docker commit 命令将 Container 提交成 Image。哦,假如你这里还处在交互 shell 中,记得先使用 Ctrl+d 或者 exit 命令退出。
sudo docker ps -a


首先执行 ps 命令查看容器ID
然后使用 commit 命令将容器进行保存
sudo docker commit 851d custom/centos-aliyun
容器提交后,执行sudo docker images就能看到刚才提交的容器。


docker端口映射
经常要在 Docker 中开启某些网络服务,需要将 docker 虚拟机的网络端口与宿主机端口连接起来。比如将 docker 中的8080端口映射到宿主机的80端口上:
sudo docker run -p 80:8080 custom/tomcat


宿主机硬盘挂载
这也是常用功能之一,尤其是服务需要记录日志、保存文件等时候。
sudo docker run -i -t -v /host/dir:/container/path ubuntu /bin/bash
以上是把宿主机器的/host/dir 挂载到/container/path 路径上。


容器间共享存储
主要借助于-volumes-from参数实现
COUCH1=$(sudo docker run -d -v /var/lib/couchdb shykes/couchdb:2013-05-03)COUCH2=$(sudo docker run -d -volumes-from $COUCH1 shykes/couchdb:2013-05-03)
这个特性,让人有许多想像空间,比如,一个容器实例用于 Web 存储,另外两个实例用于 Web 请求,实现读写分离。

镜像的导入/导出
方法1: 使用 save/load 命令来实现镜像的导入导出
sudo docker save IMAGENAME | bzip2 -9 -c>img.tar.bz2    #或者你喜欢 tar.gz
sudo docker save IMAGENAME > imageName.tar.gz

镜像导入功能使用 load 命令解压导入即可
sudo docker load < imageName.tar.gz        # 喜欢压缩的同学    bzip2 -d -c <img.tar.bz2 | sudo docker load

方法2: push/pull 将 image 文件推送到Docker Hub上去。这种方法类似于 git。你可以在 Docker Hub 上建立自己的公有或者私有库,适用于远程分享。缺点是,有时 image 文件特别大,需要考虑网络带宽问题。

方法3: 搭建自己的私服repository,将 image 提交到私服,适用于企业网络。

Dockerfile
在 Shell 脚本环境中一步步安装,低效且劳累。Docker 可以通过自定义 Dockerfile 实现自动化构建 docker 镜像的脚本,既方便分享也便于修改与模板化。
# VERSION 1.0.0
# 默认Centos,可以改成你需要的任意镜像FROM centos
# 签名MAINTAINER wupher "wupher@foxmail.com"RUN echo 'We are running some 
# of cool things'RUN yum update RUN yum install -y openssh-serverRUN mkdir -p /var/run/sshd# 设置root ssh远程登录密码RUN echo "root:123456" | chpasswdRUN yum install -y mysql-serverRUN yum install -y java-1.7.0-openjdk# 安装tomcat 等……
# 挂载硬盘,用于保存 logVOLUME ["/var/log/", "/var/volume2"]
# 容器开放22端口EXPOSE 22
# 容器开放 8080端口EXPOSE 8080
# 设置Tomcat初始化运行,SSH终端服务器作为后台运行,这样 docker run image的时候,这些服务就自动启动了ENTRYPOINT service tomcat start && /usr/sbin/sshd -D
完整的 DockerFiler,可以参考官方文档。

应用场景
Docker目前有以下应用场景:
测试:Docker 很适合用于测试发布,将 Docker 封装后可以直接提供给测试人员进行运行,不再需要测试人员与运维、开发进行配合,进行环境搭建与部署。
测试数据分离:在测试中,经常由于测试场景变换,需要修改依赖的数据库数据或者清空变动 memcache、Redis 中的缓存数据。Docker 相较于传统的虚拟机,更轻量与方便。可以很容易的将这些数据分离到不同的镜像中,根据不同需要随时进行切换。
开发:开发人员共同使用同一个 Docker 镜像,同时修改的源代码都被挂载到本地磁盘。不再因为环境的不同而造成的不同程序行为而伤透脑筋,同时新人到岗时也能迅速建立开发、编译环境。
PaaS 云服务:Docker 可以支持命令行封装与编程,通过自动加载与服务自发现,可以很方便的将封装于 Docker 镜像中的服务扩展成云服务。类似像 Doc 转换预览这样的服务封装于镜像中,根据业务请求的情况随时增加和减少容器的运行数量,随需应变。
使用 Docker 来做分步式集群模拟

现有缺陷(截止2014年11月)
无法修改 hosts 文件,不能自己做域名解析。一种常用的方法是安装dnsmasq 。
VM 的系统时间是 UTC 时间,貌似没办法修改。办法倒也不是没有,最常用的办法是将宿主机器的/etc/localtime 映射到镜像的/etc/localtime:ro 上去。但是这只能使镜像与宿主机器保持时区一致,假如希望不同的镜像使用不同时区,只有在每次启动时通过CMD 或者 ENTRPOINT命令来自动调整时区。
目前还没找到办法将 Container 的 IP 改成静态 IP,重启容器的时候,IP 可能会发生变化。
受限于 Lxc,外围环境必须为 Linux,而且内核版本必须大于2.6.27。
现在还不支持内存转储及运行状态导出。

1.Docker的应用场景?
    对企业用户而言:东西虽好,我用不上,关我毛事。也就是说,一定要对自己有用的才能够被使用。
谈到这个问题,就需要看一下Docker的出身,Docker由一家叫做dotCloud的公司2013年3月发布的,而dotCloud是一个PAAS提供商,在docker的博客中,Docker将自己定位为“分发应用的开放平台”,其网站上也明确地提到了Docker的典型应用场景:
  - 对应用进行自动打包和部署(Automating the packaging and deployment of applications)
  - 创建轻量、私有的PAAS环境(Creation of lightweight, private PAAS environments)
  - 自动化测试和持续整合与部署(Automated testing and continuous integration/deployment )
  - 部署和扩展Web应用、数据库和后端服务(Deploying and scaling web apps, databases and backend services)
由此可见,Docker的目的是让用户用简单的“集装箱”方式,快速的部署大量的、标准化的应用运行环境,所以,只要是这类的需求,Docker都比较适合。

2.Docker能否替代虚拟机?
有些激进的言论声称Docker将是现有虚拟机技术的终结者,个人觉得此言论有些浮夸了。Docker是面向应用的,其终极目标是构建PAAS平台,而现有虚拟机主要目的是提供一个灵活的计算资源池,是面向架构的,其终极目标是构建一个IAAS平台,或者是SDDC。
所以,两者并没有直接的冲突,各干各的事儿,只是以前由于容器技术还不成熟,虚拟机技术暂时抢了一部分面向应用的使用需求,随着以后的发展,这些应用场景会逐渐的转向Docker的阵营。
并且,两者相辅相成。Docker的老东家dotCloud的PAAS服务便基于Amazon的AWS服务,因此,虚拟机是Docker的土壤,而Docker则向用户展现了业务。

3.Docker能否满足企业的运维需求?
企业对运维的需求简单来说主要考量稳定性、可管理性,以及业务高可用和可恢复能力三个方面。


      从稳定性上看,Docker在6月10日发布了1.0版本,把该版本称为一个“里程碑”,并声称“1.0的发布表明在质量、功能完整、后台兼容和 API 稳定性方面已经提升了一个级别,达到企业 IT 标准”。但在此之前,dotCloud一直警告用户“不要在生产环境中运行 Docker ”,在RHEL 7中,Docker的版本为0.11.1,这是1.0发布前的RC版本,虽然红帽会将之后的Docker更新和补丁修复更新到0.11版本中,但是,企业客户在使用这样一个较新的软件版本时,仍需承担不小的稳定性风险的。而在很多企业客户的软件版本选择规范上,都有“需采用已经发布超过半年的稳定版本”的要求。


可管理性方面,企业的IT运维人员需要所使用的软件具有很好的可视化管理能力,并且具有可行的监控手段。
Docker目前的集中化管理主要有DockerUI 、Dockland、Shipyard 等,其中 Shipyard成熟度和活跃度最好。
Docker的主要作用是应用的发布和运行,但是,看起来Shipyard在Application的管理上还很粗糙,并且,整个管理思路并不是以应用为中心的,这可能会给企业在集中管理Docker的时候,带来了一定的“麻烦”。


而监控的主要目的是快速了解系统、运行的建康状况,对风险状态进行告警,这方面,Docker较为缺乏,还需要企业针对相关环境进行定制化的监控实现。
    在业务高可用和可恢复性方面,我们知道,在企业中只有核心业务、非核心业务,没有“非关键业务”,任何一个业务都是需要高度可用的,因此,企业业务平台都要考虑三个事情:本地高可用、数据备份、远程灾难恢复。

      在使用Docker的时候,也许需要从另一个角度考虑问题,在Docker的应用场景中,提倡“无状态”应用,也就是说,业务数据仅在数据层进行存储,而业务层不关注任何数据。业务层的高可用就可以通过快速的重新部署来实现,数据层仍然采用传统模式,或者借助于传统的方式实现高可用和可恢复性。但这需要时间进行方案摸索和验证,其可行性和可靠性需要时间来去证明。
      Docker到大规模的企业环境应用还有不少的路要走,但是,它所带来的便利性仍然不可小视,这将是革命性的改变,“不足”换种说法就是“机会”,这需要大量了解企业业务的合作伙伴围绕Docker推出相应的解决方案,而Docker的开放性给这种努力带来了极大的便利性。
而对于企业来说,Docker对开发、测试团队带来的便利性非常巨大,而开发、测试环境对之上所讨论到的缺点并不关注,所以,在开发、测试团队大胆的推广、使用Docker无疑能够获得极大的收益。

当然,过程中遇到一个实际的应用案例:《一个更好的开发/测试体验:在AWS上运行Docker》:http://www.csdn.net/article/2014-10-10/2822038

最后的结尾

Docker 现在受到的关注越来越多,前几天还有传闻说微软要收购Docker。但是最终的结果如何,就不得而知了。

当然,不论未来Docker如何,相信随着开源社区的努力,和大家在应用过程中的优化与完善,最终Docker会在实际生产环境中越来越普及,与实际结合也将会越来越紧密,在实际中的应用也将会解决更多的实际问题,发挥更大的价值!



本文转自 念槐聚 博客园博客,原文链接:xxhttp://www.cnblogs.com/haochuang/p/4598280.htmlxxxxx,如需转载请自行联系原作者

相关文章
|
25天前
|
SQL 安全 测试技术
【软件设计师备考 专题 】测试要求说明书的编写和应用
【软件设计师备考 专题 】测试要求说明书的编写和应用
55 0
|
29天前
|
安全 测试技术
现代软件测试中的自动化技术应用及挑战
在当今数字化时代,软件测试的重要性日益凸显。本文探讨了现代软件测试中自动化技术的应用现状和挑战,分析了自动化测试在提高效率、降低成本、增强可靠性等方面的优势,同时也提出了自动化测试所面临的挑战和解决方案。
|
1月前
|
机器学习/深度学习 数据采集 人工智能
探索AI在软件测试中的应用与挑战
【2月更文挑战第25天】 随着人工智能(AI)技术的迅猛发展,其在软件测试领域的应用逐渐深入。AI不仅改变了传统测试流程,提高了测试效率和质量,也引入了新的挑战。本文将详细探讨AI在软件测试中的具体应用,包括智能化测试用例生成、缺陷预测、自动化测试执行等,并分析当前面临的主要挑战,如数据质量、模型泛化能力和工具集成等问题。通过实例分析和研究展望,本文旨在为软件测试专业人士提供一个关于AI技术融合的全面视角。
|
1月前
|
机器学习/深度学习 数据采集 人工智能
探索AI在软件测试中的应用和优势
【2月更文挑战第22天】 随着科技的不断发展,人工智能(AI)在各个领域的应用越来越广泛。本文主要探讨了AI在软件测试领域的应用及其带来的优势。文章首先介绍了AI技术的基本概念,然后详细分析了AI在软件测试中的具体应用,包括自动化测试、智能缺陷检测和预测等方面。最后,文章总结了AI在软件测试领域的优势,如提高测试效率、降低人力成本、提高测试质量等,并展望了AI在软件测试领域的未来发展趋势。
|
14天前
|
jenkins 测试技术 持续交付
软件测试|docker搭建Jenkins+Python+allure自动化测试环境
通过以上步骤,你可以在Docker中搭建起Jenkins自动化测试环境,实现Python测试的自动化执行和Allure报告生成。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
34 6
|
20天前
|
Web App开发 Java 测试技术
深入理解与应用软件自动化测试工具Selenium
随着软件开发的快速发展,软件测试在保证产品质量方面发挥着越来越重要的作用。其中,自动化测试以其效率高、成本低的特点受到了广大开发者的欢迎。本文主要介绍了自动化测试工具Selenium的基本概念、原理以及在实际开发中的应用,旨在帮助读者更好地理解和使用Selenium进行高效的自动化测试。
22 4
|
26天前
|
设计模式 敏捷开发 监控
深入理解与应用软件自动化测试框架
在快速迭代的软件开发过程中,自动化测试已成为确保产品质量和加快交付速度的关键因素。本文将详细探讨自动化测试框架的核心原理、设计模式及其在实际项目中的应用。我们将分析几种流行的自动化测试工具,如Selenium、Appium和JUnit,并讨论它们如何集成以形成强大的测试解决方案。文章还将展示通过自定义框架来满足特定测试需求的实例,以及如何通过持续集成和持续部署(CI/CD)流程优化测试实践。
|
29天前
|
缓存 运维 Serverless
应用研发平台EMAS产品常见问题之测试检查更新没有反应如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
|
29天前
|
敏捷开发 供应链 测试技术
深入理解与应用软件测试中的Mock技术
【2月更文挑战第30天】 在现代软件开发过程中,单元测试是保证代码质量的重要手段。然而,对于高度依赖外部系统或服务的应用来说,传统的单元测试方法往往难以实施。Mock技术应运而生,它通过模拟外部依赖的响应,使开发者可以在隔离的环境中测试目标代码。本文将探讨Mock技术的概念、应用场景以及如何在软件测试中有效地使用Mock对象,以增强测试的灵活性和可靠性。
|
1月前
|
数据采集 机器学习/深度学习 人工智能
探索AI在软件测试中的应用与挑战
【2月更文挑战第28天】 随着人工智能(AI)技术的迅猛发展,其在软件测试领域的应用逐渐显现出巨大的潜力和价值。本文将深入探讨AI在软件测试中的具体应用,包括自动化测试、智能化缺陷检测、测试用例生成等方面,并分析其面临的挑战,如数据质量、模型泛化能力、技术融合等。通过对比分析和案例研究,旨在为软件测试领域提供新的视角和解决方案。
88 1