为什么要用Fig来实现Dockerpython实现自动化测试

2723人阅读
Services/Server Management(97)
Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程。作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产环境使用Docker部署应用程序的一个实践。
Docker是现在开发应用程序的不错选择;因为对于一个研发组来说,部署一个应用再也不用像以前那样繁琐的修改、设置配置文件了;因为对于Docker来说它“屏蔽”了应用程序的运行环境,不管你使用Mac、Linux还是Windows都能用相同的方式运行。
但是,当你使用Docker将应用部署到生产环境时,你会觉得Docker还是有些“弱”,至少从Ruby On Rails(ROR)的角度出发是这样的。当我查找与测试了很多不同的部署方法与Docker镜像后发现:确实没有一个确切而且标准的部署方案。在这篇文章中我会分享一种生产环境部署ROR应用的最佳实践。
在实际操作之前,我们列举生产环境部署应用的标准:
易于使用:部署应用本身应该十分简单,不然部署新程序的过程会变得十分“恐怖”。零服务中断:让我们面对它——零服务中断部署ROR应用程序已经成为当今的标准。自动化部署:我更习惯把代码推送到代码仓库,然后使用Codeship这样的工具自动测试,测试通过后自动将代码部署到生产环境的服务器。我希望Docker能完成相同的工作。
## 操作就像之前我说过的,我希望部署过程越简单越好。如果你看过这个视频,可能对以下命令有所熟悉,它启动了一个叫db的容器(跑postgres数据库),之后又启动了一个叫web的容器,最后将容器“web”跟容器“db”连接起来。
$&docker&run&-d&--name&db&training/postgres
$&docker&run&-i&-t&--name&web&--link&db:db&-p&45000:80
当然如果你照着这么做来部署程序,当你敲了很多次这样的命令后,而且保证不遗漏的敲了很多次这种命令后,你会发现这是个“坑爹的”噩梦。这就是为什么会有的原因。
如果你用Dockerfile来定义如何生成你的容器,那么Fig则可以帮你定义整个容器的运行框架。Fig将“添加数据卷(add volumes)”、“连接容器”(link container)与“映射端口”等操作都封装到一个YAML的描述文件中;如同前面提到的CodeTV中描述的那个操作在Fig中简化成如下形式:
image:&postgres
-&/etc/postgresql
-&/var/log/postgresql
-&/var/lib/postgresql
我在YAML中定义了两个容器:web与db;容器web生成自当前文件夹下的Dockerfile,向外暴露了80号端口,同时链接到了容器db。容器db生成自DockerHub的PostgreSQL镜像,向外暴露5432号端口。使用此YAML配置文件,fig可以用以下命令生成容器,然后依照配置文件的意图启动它们。
$&fig&build
$&fig&up&-d
Fig会先启动被链接的容器db,这样容器web就不至于连不上数据库。-d参数表示以后台运行的方式启动容器,这样可以保证用户登出操作系统后,容器任然在运行。您可以登录Fig的官方网站获取更多的配置信息。
现在我们可以很容易的启动一个Docker容器,但是怎么在生产环境下部署Docker容器呢?如果在生产环境下安装了Fig与Docker,我们所有要做的就是克隆之前的容器镜像,然后用相同的fig命令来启动容器。但是,现在的问题是如何更新线上运行的容器。
不幸的是,Fig可以非常优雅的启动一个容器,但是它并不擅长更新并重启服务。当然,你可以在代码仓库拉取程序的更新,然后重新运行以上的fig命令来达到这个目的;但是,在容器在更新代码,重新启动的过程中,就不能对外提供服务了。为了应对这种情况,我们使用原生的Docker命令,并引入Nginx做反向代理(注:软负载)来解决这个问题。
我们首先把容器监听的端口修改掉,因为Nginx需要监听80号端口。我们这么修改:
-&&8080:80&
通过修改Fig的配置文件,我们的web容器修改成监听8080号端口。而Nginx要配置成端口的负载均衡;所以Nginx的配置如下:
upstream&docker&{
server&127.0.0.1:8080;
server&127.0.0.1:8081;
listen&80;
location&/&{
proxy_pass&http://
重启Nginx后,Nginx就开始在号端口之间做反向代理(软负载);当其中任何一个端口失效后,Nginx将请求自动转发到另一个,直到失效后的端口恢复。这样,我们就能从Git中拉取更新,然后运行下面的命令将其启动:
$&docker&run&-d&--name&web1&--link&codetvjournal_db_1:db&-p&8081:80&codetvjournal_web:latest
当我们确定8081号端口的web1容器启动并服务正常后,我们就可以停止8080号端口的服务并开始为8080号端口服务进行更新了。我推荐使用原生的docker命令而不使用Fig来完成这个工作,因为这样可以避免干扰到正在运行的db容器(注:作者可能指的是之前写好的YAML,里面包含了启动db容器的配置)
我们可以用上述方法创建很多个web容器,只要保证它们占用的端口与容器名不同即可;同时使用Nginx在它们前端做负载即可实现不掉线的程序升级。
那么问题又来了,怎么将上述的更新流程自动化运行呢?有两个方式可以达到:
将容器更新、启停、切换等操作封装到一个单一的脚本中,这个脚本可以加入到传统的上线流程(注:新代码拉取,自动测试,自动部署的流程,作者称之为deployment pipeline)之后执行;另一种方式是,使用类似Consul或者etcd等的发现服务来管理容器的更新,启停,与发现;这会更加“高大上”。
所以,使用Docker在生产环境中部署服务不像你想象中那么容易。我推荐大家试试上面所说的方法;同时分享你自己的实践经验给大家,这会帮助大家一同使用Docker。Docker还是个很年轻的产品,同时又是个非常热门的产品,它肯定会在未来不断的演化升级。
本文转载自:
免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:302659次
积分:6043
积分:6043
排名:第3810名
原创:290篇
转载:149篇
评论:12条Docker结合自动化编排工具Fig的使用方法
作者:佚名
字体:[ ] 来源:互联网 时间:06-30 17:22:07
这篇文章主要介绍了Docker结合自动化编排工具Fig的使用方法,Fig可以做到包括自动化创建容器等功能,需要的朋友可以参考下
Fig是一个基于Docker的用于快速搭建开发环境的工具,目前Fig团队已经加入Docker公司。Fig通过一个配置文件来管理多个 Docker容器,非常适合组合使用多个容器进行开发的场景。Fig可以和Docker一起来构建基于Docker的复杂应用。本文详细介绍了Fig的安装以及使用。什么是编排?编排(译者注:Orchestration,翻译为编排)是指同时管理多个容器的行为。当你刚开始玩Docker 的时候,你只需要操作一个容器。紧接着你学习了网络并得知把所有进程都放入同一个容器中并不合适,然后不知不觉你就发现自己已经建立了多容器的基础架构。 你第一次尝试可能不会感到复杂,但是当使用两个或者三个容器的时候,你就会觉得很麻烦。手动连接容器、管理卷,很快你就乱了,应该有更好更实用的工具来做 这件事。Fig简介
这个更实用的工具称为。Fig是的一个产品并很快成为自动化Docker容器编排一个事实标准,目前Fig已经被Docker公司收购并成为官方支持的解决方案。安装Fig
Fig是一个Python Package,你可以使用以下命令来安装:
代码如下: $ sudo pip install -U fig
就这么简单。如果不能工作,可以从中了解更多信息。使用Fig
使用Fig来编排一个基础设施,你首先需要在YAML配置文件中描述它。描述语法很简单,和Docker有点类似。下面是CMS的Fig配置示例:
代码如下: web:image: ubermuda/pagekitports:
- 80links:
- db:pagekit_db_1volumes_from:
- datadb:image: orchardup/mysqlenvironment:
MYSQL_ROOT_PASSWORD: changethis
MYSQL_DATABASE: pagekitdata:image: busyboxcommand: /bin/truevolumes:
- /pagekit/storage
- /pagekit/app/cache
这个配置文件定义了三个不同的容器。
web容器是面向web方面的容器,它基于ubermuda/pagekit镜像构建,你可以从GitHub上获取ubermuda/pagekit的源码,web容器会暴露80端口(通过ports参数),使用别名pagekit_db_1(links)连接到db容器,并且data容器的卷(volumes)也会被挂载到web容器。
从db容器中我们能看到在容器中定义环境变量是多么简单:只要使用environment配置即可。在示例中,我们在配置文件中定义了所有的值,但你也可以省略这些值,这样容器会从它的宿主机中获取。
代码如下: db:environment:
MYSQL_ROOT_PASSWORD
所述的MYSQL_ROOT_PASSWORD环境变量被来自主机的同名环境变量填充。
最后,data容器通过volumes参数定义了即将使用的所有目录作为共享卷目录。
配置文件写完后,你只需要一个fig up命令即可启动你的基础设施。
代码如下: $ fig upCreating dockerpagekit_db_1......Creating dockerpagekit_data_1...Creating dockerpagekit_web_1......Attaching to dockerpagekit_db_1, dockerpagekit_web_1...db_1
| :14:02 [Note] /usr/sbin/mysqld: ready for connections.db_1
| Version: '5.5.38-0ubuntu0.12.04.1-log'
socket: '/var/run/mysqld/mysqld.sock'
port: 3306
(Ubuntu)...web_1 |
04:15:20,750 INFO success: nginx entered RUNNING state, process has stayed up for & than 1 seconds (startsecs)web_1 |
04:15:20,750 INFO success: php5-fpm entered RUNNING state, process has stayed up for & than 1 seconds (startsecs)
完整的启动日志有点太长了,所以我只截取了一部分。正如你所看到的,Fig创建了三个容器,dockerpagekit_db_1可以连接到dockerpagekit_web_1,正是我们想要的。
你可能还注意到有一个数据容器没有日志线,那是因为 /bin/true 命令无法正常输出。
现在你可以在另一个终端中运行docker ps命令来检查一切是否运行正常,同时,可是使用浏览器来确认web容器是否正常启动。(你首先需要确认映射端口,可以使用docker ps或docker port)。说明
截至本文写作之时,Fig不支持远程编排,这意味着你只能在单台主机上编排一个基础设施。
大家感兴趣的内容
12345678910
最近更新的内容再谈Docker-微服务的场景化应用 - 简书
再谈Docker-微服务的场景化应用
我的名字是滨田宏,我发明了一些自认为很神奇的东西,希望你们能喜欢.这是一个微型机器人,它看起来微不足道,但当它和其他小伙伴们团结起来时,就变得有趣多了。它们由这个神经发射器控制,我想让它们做什么,它们就照做。这项创造的应用是无止境的。建筑物,曾经需要大队人马,人工建造数月或数年,现在只要一个人就可以完成。这仅仅是九牛一毛,可不可以用在交通运输上,微型机器人可以轻松移动任何物体至任何地方,只有想不到,没有做不到。你的思维局限是它唯一的限制。
看过《超能陆战队》的朋友可能仍然对于电影中的男主角介绍和演示自己发明的微型机器人的场景记忆犹新。“它”看起来只是一跟带有磁性的小小的金属部件。但是它是一个独立的个体,自己能够独立的大脑,同时,和同伴之间有相互的接口你行链接。能够通讯。能够随意的组合成任意功能的物体。通过类比,我们很容易由硬件领域想到软件领域。譬如软件系统的架构,一直都是伴随着几种主流的模式,集中式,分布式以及最近才开始流行起来的”微服务“。滨田宏发明的微型机器人,其实和微服务的思想很类似。一个微小的服务实体,有对外的接口与外部通讯。彼此之间能够快速组合成新的服务。其架构松散耦合。接下来的内容,会和大家一起分享微服务的特点以及所拥有的一些神奇的魔法。
什么是微服务?
微服务,至少我目前也没有找到一个很精确的标准化解释。所以我们首先从字面上来理解。既然是服务,那一定是一个能够实现某个功能的实体。光有功能,是不能成为一下服务的,因为还需要有途径和外部交互。让外部的实体能够获取服务。譬如web服务,通过http协议和浏览器或者app进行交互。所以微服务,一般来说,是有一套和外部通讯的标准接口的,譬如REST API。 名字带了一个”微“字,说明提供的功能很小,或者很弱。但是一个非常小,或者非常弱的功能,是无法构成一个系统的,因此,他们之间,必须是能够相互组合的。在软件领域,一般把它理解成一种新的架构设计模式。可以和我们通常所熟知的软件架构做类比,譬如集中式架构,分布式架构。既然是一个很抽象的概念,那我这里也用一幅很抽象的图来表示。
微服务的特点
彼此独立:既然是一个独立的服务,那必然是一个完整的自治系统,不依赖外部的东西就能够提供服务。有自己一整套的完整的运行机制,有和外部通讯的标准化接口。就像《超能特工队》里面滨田宏发明的微型机器人,它就是一个独立的小机器人。可以和其他的机器人通过磁性相互吸引,可以探测到彼此的存在。离开了其他个体,一样能够运转,只是功能比较单一。
原子化:作为一个微服务,一定是一个原子化的服务。也就是说服务不能再划分成更小的服务了。世界上的一些事物都是有原子构成的。它为什么能构成所有的物体,正是由于它足够的基础。如果一个服务还能划分成几个小的服务,那我们就不能称之为一个微服务,它其实可以通过几个微服务组合成的一个系统。
组合和重构:如果是最原子的服务,那一定是没有任何用处的。微服务之所以神奇,在于它能快速的组合和重构。彼此组合成一个系统。系统里面所有的实体在概念上是对等的。因此它的结构相对简单化。是一种松散耦合的结构,这样的系统,往往具有更强的可扩展性和鲁棒性。
微服务之于实践
前面谈了这么多,可能大部分人还是没有明白微服务是个什么东西。我们试着可以通过一些的东西来描述。例如,我们使用ghost搭建了一套个人博客的系统。如果使用传统的架构,我们可能以模块的视角来划分,譬如可以分为”用户管理”,”文章编辑“,”页面显示“,”图片存储“,”文章分享“ 等几个模块,抽象成的架构图如下所示:
换一个视角,我们可以从服务的角度来思考。未来简单起见,我们先考虑单租户的场景。:
Markdown Service
Web Service
UGC Service
MySQL Service
基于微服务的架构,可能是下面这样一个图:
我们再想想,如果要提供多租户的服务呢?我们把数据库变大,存储多个用户的信息?这的确是一种思路,但是其思想有点和我们的微服务的思想背道而驰了。我们为什么不为每个用户配备这样一套服务呢,只要每个服务足够的微小,其实是没有太多的浪费的。上面图里构成的一套系统我们可以作为单独服务一个用户的自治系统。当用户增多时,就呈现出了一套去中心化的云服务的雏形。
Docker在微服务系统中所扮演的角色
在Docker出现之前,虽然我们谈论微服务架构,但是其实是很难实现的。微服务要运行,首先需要一套执行的环境。这套环境不能对外部有依赖性。同时,执行环境的粒度又必须足够的小,这样才能称之为”微“,否则必然是对资源的巨大浪费。一个微服务可以跑在一台虚拟机上面,但是虚拟机粒度太大,即使最小的虚拟机,也至少也有1个核。正如我们上面的ghost博客的例子,服务一个用户的服务,显然用不了一个核。同时,虚拟机有没有一套方便的管理机制,能够快速的让这些服务之间能够组合和重构。Docker出现以后,我们看到了微服务的一个非常完美的运行环境。
独立性:一个容器就是一个完整的执行环境,不依赖外部任何的东西。
细粒度: 一台物理机器可以同时运行成百上千个容器。其计算粒度足够的小。
快速创建和销毁: 容器可以在秒级进行创建和销毁,非常适合服务的快速构建和重组。
完善的管理工具: 数量众多的容器编排管理工具,能够快速的实现 服务的组合和调度。
除了Docker生态系统之内的一些工具,包括Serf之类的服务自发现技术的发展,可以让微服务能够自动化的感知其关联的其他服务,实现系统的自我构建。我记得2014年早些时候,centurylinklabs里面有一篇文章,讲述了如何通过FIG,Serf,HAProxy构建一个自动负载均衡的Docker应用。其实,这篇文章所蕴含的思想,就是一种微服务架构的概念。
去中心化的云服务
最近一段时间,”场景化“是一个频繁出现的词汇。在这里,我也套用一下这个词,”什么是微服务的场景化应用?”。去中心化的云服务,是一个非常典型的应用场景。什么是去中心化的云服务呢?这里做一个类比,譬如家里的供暖,可以采用集中化的供暖方式。由电厂或者钢铁厂统一提供供暖服务。当然,也有的家庭自己会建设一套中央空调系统进行供暖。云服务,也会有类似的趋势。目前云计算的发展比较低级。主要是以托管为主,因此大部分还是中心化的云服务。随着云计算的应用越来越垂直化,必然也会出现越来越多的去中心化的应用场景。去年iCloud爆出了被黑客攻击。黑客攻破一家服务商,就直接窃取了所有用户的资料。这就是一种中心化的云服务带来的一些不利的因素。既然我们可以由统一的服务商来提供云服务。我们能否实现一套去中心化的服务呢?就拿个人云存储来举例。每个人都有一套个人的云的存储系统。这套系统运行在任意的提供“水和电”的基础云服务商的系统之上。并且可以任意在不同的服务商之间迁移和部署。不同的用户,可能位于不同的服务商之上。完全由自己控制的一套系统。每一套系统,都是一系列微小的服务组合而成。虽然底层也依赖基础云服务商,但是他们的作用更像水和电一样。
国内内以微服务为基础的去中心化的云服务也已经有一些实践的例子,譬如, 等,逐渐呈现出一部分这样的思想。借助于这样的服务,用户能够快速的构建一套属于自己的ghost博客系统,或者采用开源软件ownCloud搭建的个人云存储系统。选购他们,就像在商店里面选购商品一样,拿回家,插上电就可以用了。这种模式,也给开源软件找到了一个非常好的商业化的机制。我相信这种机制未来会越来越流行。
一个游戏架构的应用场景
游戏是一个比较特殊的行业。在国内,应该是比较早拥抱云计算的一个行业,但是也是架构相对保守的行业。大部分的游戏架构非常简单。分布式的架构使用并不是太普遍,大部分是单区单服,一台强大的机器,运行若干个游戏服(游戏世界)。这并不是游戏架构落后,而是游戏本身的特点决定的。游戏一般以游戏服来划分,每个游戏服是一个独立的游戏世界。里面有一定数量的玩家。不能太多,也不能太少(总用户量一定的情况下,单服人数和总服的数量决定了游戏收入的最大化),两个游戏世界之间,数据不需要互通。因此通常都是一个进程搞定一个游戏服。其实这种模式下,微服务也是一个非常好的应用场景。我们知道,游戏其实有非常复杂的逻辑,譬如有控制人物移动的逻辑,控制道具,控制战斗,同时,游戏中还有成百上千的电脑控制的角色,每个角色都需要有自己智能。为什么我们不将这些细小的功能通过微服务来实现呢?譬如游戏中的一个单独的怪兽,可以由自己微服务构成的小的自治系统来控制。它可以完全独立,接收外部信息,做出反应。未来游戏公司可以复用这些单独的小系统。换上不同的皮肤,就可以用于不同的游戏。同时游戏其他的逻辑,都可以通过一些独立的微服务来构成。这些微服务可以借助Docker之类的系统,运行在容器中。能够快速的自动化的构建出一个完整的游戏世界。
最近,基于Docker的创业公司不停的涌现,大家一夜之间似乎都在谈论Docker。但是我想说的是,Docker只是一项新的技术,消费者只会为服务买单,不会为技术买单。何况,对于圈子之外的大部分的消费者,云已经是其能理解的技术极限了,再来一个Docker,基本是无法理解的。因此如果想在Docker领域创业。停止谈论Docker,思考Docker技术之上的丰富的场景化的应用,才是关键。同样,微服务也只是一种架构思想。基于这种架构所带来的神奇的应用场景才是未来。
腾讯云产品经理,布道师Docker搭建轻量级PAAS平台 - 开源力量丨向IT技术大牛们学习! - 大数据丨云计算丨移动开发丨软件开发测试丨 全球前沿技术抢先学!!
开源力量课程&- & docker解析及轻量级PAAS平台演练
&&通过学习该课程,您将会使用Docker手工安装、配置和维护PAAS云计算环境,并能区分其差异,帮助您对虚拟化技术进行理解;更重要的是,您还能获得一线专家在每日使用docker的运维经验,这将使您的IT技术得到极大的提升。
视频滚动学习,终身有效
老师指导实战练习辅导
24小时讨论区回答
每周视频坐班直播互动答疑
开源力量结业考试
QQ同学会交流
深刻理解:Docker的设计原理,体系构架和关键技术,构建一个DockerPAAS平台环境所需的核心组件以及核心组件间的联系;
全面掌握:如何通过不同角度理解理解docker及背后的原理,部署docker环境;如何通过单独部署docker核心组件逐渐搭建出dockerPaaS环境;
动手实战:在学习docker深度解析培训后,你能了解docker的体系结构,并能根据需要通过API来实现对于Docker的Container的管理定制开发,满足您在实际生产环境中docker的各种疑问和不满足的功能。
熟悉基本的linux命令
掌握一门编程语言
介绍什么是虚拟化技术,虚拟化技术给我们带来了什么好处。比较基于Hypervisor实现的虚拟化和Container技术实现的虚拟化的区别。介绍什么是Docker,以及Docker背后的一些关键技术CGroups, Namespace, AUFS的介绍。从原理和架构角度分析Docker是如何通过基于Virtualbox的支持来实现不同操作系统的支持,如何在Windows,和Mac,Linux下安装Docker服务。
动手实战:在Linux平台上安装完毕第一个Docker服务,然后实现第一个Hello World。
深度分析和讲解Docker中的Image的概念,以及Docker如何采用分层的机制来实现Image的管理。深度分析和讲解什么是BaseImage。如何通过Docker Hub来查找Image,以及如何使用Search 和 Pull的命令来搜索和下载一个Image。运行RUN的命令来运行一个Containter,并介绍一些Run相关的一些参数,端口映射,DNS修改等等。如何Commit一个container到一个新的Image,如何PUSH自己的Image到Docker Hub上。
动手实战:自己动手制作Image,并push到Docker Hub上。
深度解读Docker的高级特性。深入理解DockerFile,介绍DockerFile的一些关键字,以及如何编写一个DockerFile来构建一个Image。Docker的一些其他的特性,例如如何通过Link的方式来把两个容器链接在一起,以及如何创建一个Volume的容器并且把它Attach到另个一个容器上等
动手实战:编写一个DockerFile来构建一个Image。
如何通过Docker来实现一个本地的Web开发环境的基本搭建,介绍如何通过API来实现对于Docker的Container的管理。介绍什么是Cloud Computing,什么是IaaS,PaaS和SaaS,介绍FIG这个开源工具,以及如何通过FIG来实现一个轻量级的基于Docker的PaaS。
动手实战:通过FIG来实现一个轻量级的基于Docker的PaaS。
Mark,曾就职于土豆网基础架构组和EMC系统架构部,先后负责参与CDN系统的开发与测试,并深入研究Docker,Python等前沿技术,是国内首批成功将Docker引入大型互联网和基础软件公司并投产的技术牛人(比如把Docker成功应用在EMC自动化测试领域),对Docker如何在企业中应用有丰富的实战经验,曾在各大技术社区和论坛多次进行技术分享,是Docker Shanghai Meetup等一系列活动的创办人和组织者,国内比较早使用Docker的用户之一,有丰富的培训教练经验,曾负责培训各类技术骨干70余人,深受学生热烈爱戴与喜欢。。。
&&& 扫开源力量微信二维码并关注,不会遗漏开源力量每周免费公开课及最新课程信息
更多常见问题:
:虚拟化技术
:Image 及 Image管理
:深度解读Docker的高级特性
:Docker 周边应用
开源力量资深教授
开始学习课时
开始学习课时
开始学习课时
开始学习课时
开始学习课时
服务时间: 9:00 - 21:00
微信公众号:开源力量}

我要回帖

更多关于 python实现自动化安装 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信