什么是docker和在测试中的应用

2020-08-26 08:50发布

2条回答
IngmarL
2楼 · 2020-08-26 13:52

Docker 火了很长一段时间了,前段时间简单的学习和试玩了一下子,发现他对测试很有价值,觉得有必要再次深入研究。

这里标记一些较好的学习网址,用作参考:

InfoQ上面有系列的文章:

深入浅出Docker在InfoQ上的内容: http://www.infoq.com/cn/dockerdeep/

深入浅出Docker(一):Docker核心技术预览:http://www.infoq.com/cn/dockerdeep/
深入浅出Docker(二):Docker命令行探秘:http://www.infoq.com/cn/articles/docker-command-line-quest
深入浅出Docker(三):Docker开源之路:http://www.infoq.com/cn/articles/docker-open-source-road
深入浅出Docker(四):Docker的集成测试部署之道:http://www.infoq.com/cn/articles/docker-integrated-test-and-deployment
深入浅出Docker(五):基于Fig搭建开发环境:http://www.infoq.com/cn/articles/docker-build-development-environment-based-on-fig
深入浅出Docker(六):像谷歌一样部署你的应用:http://www.infoq.com/cn/articles/deploy-your-application-like-google

Docker源码分析(一):Docker架构:http://www.infoq.com/cn/articles/docker-source-code-analysis-part1
Docker源码分析(二):Docker Client创建与命令执行:http://www.infoq.com/cn/articles/docker-source-code-analysis-part2
Docker源码分析(四):Docker Daemon之NewDaemon实现:http://www.infoq.com/cn/articles/docker-source-code-analysis-part4
Docker源码分析(五):Docker Server的创建:http://www.infoq.com/cn/articles/docker-source-code-analysis-part5
Docker源码分析(六):Docker Daemon网络:http://www.infoq.com/cn/articles/docker-source-code-analysis-part6

解读2014之Docker篇:才气、勇气、运气:http://www.infoq.com/cn/articles/2014-review-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>方法/>方法/>< style>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会在实际生产环境中越来越普及,与实际结合也将会越来越紧密,在实际中的应用也将会解决更多的实际问题,发挥更大的价值!


文章出处 https://www.cnblogs.com/haochuang/p/4598280.html 

作者未找到,侵删。

1)快速搭建兼容性测试环境(各类Web服务器、中间件、数据库的组合环境)

2)快速搭建复杂分布式测试环境

3)持续集成(快速创建和撤销容器)


相关问题推荐

  • 回答 157

    虽然从事开发行业的女生越来越多,但女生的比例还是远比不上男生。软件测试的男女生比例则基本相当,软件测试要求细心、耐心,大部分女生也是比较适合学的。而且软件测试课程分为手工测试和自动化测试,手工测试分为功能测试、性能测试、接口测试。自动化测试...

  • 回答 121

    需要。很多人当初抱着测试不需要懂代码,才选择了这个行业,这个就要看对自己的职业定位了,是止步于月薪过万就可以了,还是往20k、30k去突破,如果这样的话,是肯定要会接口、会自动化,就必然要涉及到代码。如果真的看不懂代码,实际的测试后期的工作会出现...

  • 回答 91

    在我看来游戏开发挺难的,尤其像手游一类的还有网游,里面有很多的程序代码而且伤神又费力,不过也有女生在这方面做的很好的,如果你感兴趣,非常想学,可以试试

  • 回答 80

    软件测试专业现在很火热,很缺少人才,25岁学软件测试能学会,就业薪资也高,工作也相对轻松

  • 回答 11
    已采纳

    测试类型有:功能测试,性能测试,界面测试。功能测试在测试工作中占的比例最大,功能测试也叫黑盒测试。是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。采用黑盒技术设计测试用...

  • 回答 15
    已采纳

    这个其实和接口测试的场景密不可分的,比如说:外部接口测试:    必须先接口测试通过了,才能执行功能测试子系统或者各个模块之间的联调测试:    必须各子系统后台代码完成,并提供接口才可以完成测试,一般来说都要求各子系统功能测试通过后再进行...

  • 回答 6
    已采纳

    这个是会因为公司的架构不同而不同的,并不是固定的,但是一般是会有专门的测试部门,或者叫质量保证部,也有可能是叫别的名字。

  • 回答 43
    已采纳

    移动端测试,包括App兼容性测dao试,7*24小时稳定性测试,功耗性能测试,UI测试,交互测试等,课程主要学习的内容有:1、功能测试主要包括计算机基础、软件测试核心理论、Linux、数据库,学习目标是掌握软件测试核心理论,结合Linux、数据库等可实现移动端、w...

  • 回答 1

    标题  1. 首先要做一个标题党(此标题党非彼标题党)。标题一定要清晰简洁易理解,不应该臃长  2. 尽量前缀要规范,例如模板: [Product][Version]_[Feature]_[Title],这样描述会很清晰,也方便查找  3. 缺陷的标题一定要描述在什么情况下发生了什么问...

  • 回答 1

    1、 缺陷报告可以记录缺陷2、可以对缺陷进行跟踪管理3、可以对缺陷报告进行分类 总结 统计

  • 回答 1

    1、缺陷编号(Defect ID),提交BUG的顺序。2、缺陷标题(summary),简明扼要的说明一下这个BUG。3、缺陷的发现者(DetectedBy) ,一般是自己。4、发现缺陷的日期(Detected on date),一般是当天。5、缺陷所属的模块(subject), 在测试哪个模块的时候发现的BUG...

  • 回答 1

    缺陷标题好的缺陷标题需要让相关人员一目了然,一般建议的格式是条件+失败。缺陷类型缺陷类型也是根据具体的项目而定的。但一般情况下分为功能、界面、建议。重现步骤重现步骤的编写规则可以参考测试用例中的操作步骤 ,一定要足够详细、说明清楚问题的操作顺...

  • 回答 1

    工具:NoSQLUnitJsTestDriverQTRunnerVenusFluintBuster.JSSQLUnitECUTQTestlibUnitilsgreatestDbUnitAbbotGoogleTest框架:JUnitMoqJSCaptureMockCUnitPyUnitCppUTestCppUnitzCUTcipra

  • 回答 1

    JunitTestNGGoogleTestpytestunittestJmockitJaCoCogcov、lcov、gcovrCoverage.pyEvoSuiteDiffblue Cover

  • 回答 1

      React Hooks测试库( Testing Library)是一个简单而完整的React Hooks测试工具。  React Hooks测试库让用户可以为React钩子创建简单的测试工具,自定义钩子的输入和检索输出,以处理在功能组件体内运行的情况。  使用React Hooks,用户不必为了测试而去担...

  • 回答 1

    1、单元测试注重代码逻辑,接口测试注重业务逻辑;2、单元测试的粒度最小,是测试最小独立的单元模块(不依赖其他模块);接口测试不是,会覆盖很多;3、单元测试是白盒测试,接口测试是黑盒测试;4、单元测试关注的是代码的实现和逻辑,测试范围较小,保证实...

没有解决我的问题,去提问