关于Docker在测试方面的应用

  1. 云栖社区>
  2. 博客>
  3. 正文

关于Docker在测试方面的应用

ghost丶桃子 2016-05-20 16:41:29 浏览4012
展开阅读全文

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.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会在实际生产环境中越来越普及,与实际结合也将会越来越紧密,在实际中的应用也将会解决更多的实际问题,发挥更大的价值!

转载请注明出处:http://www.cnblogs.com/haochuang/ 8年IT工作经验,5年测试技术与管理,2年产品与项目管理,曾参与过云计算\云存储\车联网产品研发工作; 业余自媒体人,有技术类垂直微信公众号;如有招聘或求职方面需求,请Mail to uetest@qq.com ;或通过 QQ:363573922 微博:@念槐聚 联系;

网友评论

登录后评论
0/500
评论
ghost丶桃子
+ 关注