关于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,如需转载请自行联系原作者

相关文章
|
16小时前
|
存储 Prometheus 监控
【Docker 专栏】Docker 容器内应用的调试与故障排除
【5月更文挑战第8天】本文探讨了Docker容器内应用的调试与故障排除,强调其重要性。方法包括:通过日志排查、进入容器检查、使用监控工具及检查容器配置。常见问题涉及应用启动失败、性能问题、网络连接和数据存储。案例分析展示了实战场景,注意事项提醒避免不必要的容器修改、备份数据和理解应用架构。掌握这些技能能确保Docker应用的稳定运行和性能优化。
【Docker 专栏】Docker 容器内应用的调试与故障排除
|
16小时前
|
开发框架 安全 网络安全
【Docker 专栏】Docker 多平台应用构建与部署
【5月更文挑战第8天】Docker作为一种关键的容器化技术,简化了多平台应用的构建与部署。它提供一致的运行环境,确保应用在不同平台无缝运行;通过分层构建机制加速镜像创建,提升开发效率。Docker的可移植性、高效部署及资源利用率是其主要优势。流程包括开发环境准备、构建镜像、测试验证及部署。然而,面临操作系统差异、网络安全和资源限制等挑战,需注意安全、版本管理和性能优化。Docker在多平台场景的应用将持续发挥价值。
【Docker 专栏】Docker 多平台应用构建与部署
|
1天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
1天前
|
前端开发 API 数据库
【Docker专栏】Docker Compose实战:编排多容器应用
【5月更文挑战第7天】Docker Compose是Docker的多容器管理工具,通过YAML文件简化多容器应用部署。它能一键启动、停止服务,保证开发、测试和生产环境的一致性。安装后,创建`docker-compose.yml`文件定义服务,如示例中的web和db服务。使用`docker-compose up -d`启动服务,通过`docker-compose ps`、`stop`、`down`和`logs`命令管理服务。
【Docker专栏】Docker Compose实战:编排多容器应用
|
1天前
|
监控 安全 数据库
【Docker专栏】Docker容器化应用的最佳实践
【5月更文挑战第7天】本文介绍了 Docker 容器化应用的关键最佳实践,包括使用官方基础镜像、保持镜像精简、以非 root 用户运行容器、安全扫描、编写高效 Dockerfile、环境隔离、使用数据卷、选择合适网络模式、设置资源限制、使用版本标签、容器编排以及文档和自动化部署。遵循这些实践可提升效率和安全性,同时要注意随着技术发展不断更新知识。
【Docker专栏】Docker容器化应用的最佳实践
|
1天前
|
JSON 前端开发 JavaScript
快照测试在前端自动化测试中的应用
在前端自动化测试中,快照测试常用于检验组件渲染与布局。
|
3天前
|
敏捷开发 JavaScript 测试技术
深入理解与应用软件测试中的Mock技术
【5月更文挑战第5天】 在现代软件开发过程中,单元测试作为保障代码质量的重要环节,其独立性和可靠性至关重要。Mock技术应运而生,为开发者提供了一种在隔离环境下模拟外部依赖的方法。本文将深入探讨Mock技术的概念、实现方式及其在软件测试中的应用,旨在帮助读者更好地理解和运用这一强大的测试工具,以提升测试效率和软件质量。
|
6天前
|
安全 IDE Java
Java串口通信技术探究2:RXTX库单例测试及应用
Java串口通信技术探究2:RXTX库单例测试及应用
24 4
|
6天前
|
数据采集 机器学习/深度学习 人工智能
探索AI在软件测试中的应用与挑战
【5月更文挑战第2天】本文将探讨人工智能(AI)在软件测试领域的应用及其带来的挑战。我们将详细讨论AI如何改变软件测试的方式,包括自动化测试、预测性测试、智能化缺陷检测等。同时,我们也将探讨AI在软件测试中面临的挑战,如数据质量问题、模型的可解释性、以及对现有测试流程的影响等。
|
8天前
|
Java 测试技术 开发者
深入理解与应用单元测试:软件质量的守护者
【4月更文挑战第30天】 在现代软件开发过程中,单元测试作为保障代码健康的重要环节,其地位日益凸显。本文将探讨单元测试的核心概念、实施单元测试的重要性以及如何高效地设计并执行单元测试。通过实例分析,我们将揭示单元测试在确保软件产品质量和加速开发周期中的关键作用。