关于Docker在测试方面的应用

Docker 火了很长一段时间了,前段时间简单的学习和试玩了一会儿,发现他对测试颇有价值,以为有必要再次深刻研究。java

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

InfoQ上面有系列的文章:git

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

深刻浅出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-dockerweb

-----------------------------------------------------------------------------------------------------------------sql

简单来看,什么是Docker?docker

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

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

相关文章
相关标签/搜索