网易首页 > 网易号 > 正文 申请入驻

在生产环境使用Docker部署应用

0
分享至

Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程。作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产环境使用Docker部署应用程序的一个实践。

Docker是现在开发应用程序的不错选择;因为对于一个研发组来说,部署一个应用再也不用像以前那样繁琐的修改、设置配置文件了;因为对于Docker来说它“屏蔽”了应用程序的运行环境,不管你使用Mac、Linux还是Windows都能用相同的方式运行。

但是,当你使用Docker将应用部署到生产环境时,你会觉得Docker还是有些“弱”,至少从Ruby On Rails(ROR)的角度出发是这样的。当我查找与测试了很多不同的部署方法与Docker镜像后发现:确实没有一个确切而且标准的部署方案。在这篇文章中我会分享一种生产环境部署ROR应用的最佳实践。

标准

在实际操作之前,我们列举生产环境部署应用的标准:

  1. 易于使用:部署应用本身应该十分简单,不然部署新程序的过程会变得十分“恐怖”。
  2. 零服务中断:让我们面对它——零服务中断部署ROR应用程序已经成为当今的标准。
  3. 自动化部署:我更习惯把代码推送到代码仓库,然后使用Codeship这样的工具自动测试,测试通过后自动将代码部署到生产环境的服务器。我希望Docker能完成相同的工作。
  4. ## 操作就像之前我说过的,我希望部署过程越简单越好。如果你看过Docker:Part4这个视频,可能对以下命令有所熟悉,它启动了一个叫db的容器(跑postgres数据库),之后又启动了一个叫web的容器,最后将容器“web”跟容器“db”连接起来。

$ docker run -d --name db training/postgres
$ docker run -i -t --name web --link db:db -p 45000:80

当然如果你照着这么做来部署程序,当你敲了很多次这样的命令后,而且保证不遗漏的敲了很多次这种命令后,你会发现这是个“坑爹的”噩梦。这就是为什么会有Fig的原因。

FIG

如果你用Dockerfile来定义如何生成你的容器,那么Fig则可以帮你定义整个容器的运行框架。Fig将“添加数据卷(add volumes)”、“连接容器”(link container)与“映射端口”等操作都封装到一个YAML的描述文件中;如同前面提到的CodeTV中描述的那个操作在Fig中简化成如下形式:

web:
build: .
ports:
- "80:80"
links:
- db
db:
image: postgres
ports:
- "5432"
volumes:
- /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号端口。我们这么修改:

web:
build: .
ports:
- "8080:80"
links:
- db
...

通过修改Fig的配置文件,我们的web容器修改成监听8080号端口。而Nginx要配置成8080与8081端口的负载均衡;所以Nginx的配置如下:

upstream docker {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
location / {
proxy_pass http://docker;
}
}

重启Nginx后,Nginx就开始在8080与8081号端口之间做反向代理(软负载);当其中任何一个端口失效后,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在它们前端做负载即可实现不掉线的程序升级。

自动化

那么问题又来了,怎么将上述的更新流程自动化运行呢?有两个方式可以达到:

  1. 将容器更新、启停、切换等操作封装到一个单一的脚本中,这个脚本可以加入到传统的上线流程(注:新代码拉取,自动测试,自动部署的流程,作者称之为deployment pipeline)之后执行;
  2. 另一种方式是,使用类似Consul或者etcd等的发现服务来管理容器的更新,启停,与发现;这会更加“高大上”。

所以,使用Docker在生产环境中部署服务不像你想象中那么容易。我推荐大家试试上面所说的方法;同时分享你自己的实践经验给大家,这会帮助大家一同使用Docker。Docker还是个很年轻的产品,同时又是个非常热门的产品,它肯定会在未来不断的演化升级。

  • 原文来自:https://www.codeschool.com/blog/2015/01/16/production-deployment-docker/
  • 转载地址:http://dockone.io/article/155
  • 本文地址:https://www.linuxprobe.com/docker-production-env.html编辑:杨鹏飞,审核员:逄增宝

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
杭州一地发现新物种!网友:太萌了

杭州一地发现新物种!网友:太萌了

环球网资讯
2024-03-28 11:29:17
人保财险总裁:整个行业的新能源车险的赔付率大概比燃油车高10个百分点以上

人保财险总裁:整个行业的新能源车险的赔付率大概比燃油车高10个百分点以上

澎湃新闻
2024-03-27 18:40:35
男子3次强奸一名女子,事后:你也舒服!我太累,补偿营点养费

男子3次强奸一名女子,事后:你也舒服!我太累,补偿营点养费

橘子述情感
2024-01-10 11:23:25
永远不要低估一颗总冠军的心,NBA最难的四次卫冕:95年火箭上榜

永远不要低估一颗总冠军的心,NBA最难的四次卫冕:95年火箭上榜

篮球圈里的那些事
2024-03-28 17:40:28
我和丈夫分房睡好几年,昨晚我们再一次同床,瞎忙活了大半宿

我和丈夫分房睡好几年,昨晚我们再一次同床,瞎忙活了大半宿

户外阿崭
2024-03-28 17:34:28
陈戌源生活有多精致?住酒店都要设定3条规矩,最后1条意想不到

陈戌源生活有多精致?住酒店都要设定3条规矩,最后1条意想不到

球场新视角1号
2024-02-04 14:19:08
央视记者被阻挠:一个新阶段

央视记者被阻挠:一个新阶段

城市的地得
2024-03-14 00:22:23
大V曝料:一知名汽车品牌因销量不佳,竟采取不择手段的营销策略

大V曝料:一知名汽车品牌因销量不佳,竟采取不择手段的营销策略

杂谈哥闲谈
2024-03-26 22:26:49
春节自驾海南的新能源车主终于抢票成功:清明节回重庆

春节自驾海南的新能源车主终于抢票成功:清明节回重庆

上游新闻
2024-03-28 16:48:24
大放厥词!韩媒污蔑国足如果进18强,会让亚洲足球“蒙羞”!

大放厥词!韩媒污蔑国足如果进18强,会让亚洲足球“蒙羞”!

爱中超也爱篮球
2024-03-27 23:23:27
男业主出轨女销售性感内衣床照全网疯传:简直比电视剧还狗血!

男业主出轨女销售性感内衣床照全网疯传:简直比电视剧还狗血!

坎南说情感
2024-01-31 14:46:22
3月28日俄乌最新:惊天大瓜

3月28日俄乌最新:惊天大瓜

西楼饮月
2024-03-28 14:47:33
水庆霞重新出山执教女足!刚带队就11比0大胜,让她露出久违笑容

水庆霞重新出山执教女足!刚带队就11比0大胜,让她露出久违笑容

评球论事
2024-03-28 12:41:13
劳荣枝死前最后一晚曝光:吃了一碗肉丝面,注射死比想象的痛苦!

劳荣枝死前最后一晚曝光:吃了一碗肉丝面,注射死比想象的痛苦!

皖声微言
2024-02-07 12:15:11
雷克萨斯4S店:新NX要来了!配置大升级,现款降8万甩卖

雷克萨斯4S店:新NX要来了!配置大升级,现款降8万甩卖

网上车市
2024-03-27 18:18:17
3月28日俄乌:制裁让俄经济承压,乌克兰不顾反对继续袭击俄本土

3月28日俄乌:制裁让俄经济承压,乌克兰不顾反对继续袭击俄本土

山河路口
2024-03-28 17:25:34
韩媒感叹“仁川机场成中国跨境电商物流中转站”,但分析原因时又变味了……

韩媒感叹“仁川机场成中国跨境电商物流中转站”,但分析原因时又变味了……

环球网资讯
2024-03-28 15:33:21
最后一轮才打韩国——这是36强赛的赛制给国足的最大福利

最后一轮才打韩国——这是36强赛的赛制给国足的最大福利

祝晓塬
2024-03-28 11:28:44
终于,俄罗斯找到幕后黑手,普京派人来北京,中方给了俄方想要的

终于,俄罗斯找到幕后黑手,普京派人来北京,中方给了俄方想要的

阿宇观天下
2024-03-27 15:48:51
蔡丽新履新中央社会工作部副部长,曾长期在江苏工作

蔡丽新履新中央社会工作部副部长,曾长期在江苏工作

人民资讯
2024-03-28 17:40:21
2024-03-28 18:24:49
孙有匪
孙有匪
科技
1595文章数 2009关注度
往期回顾 全部

科技要闻

王传福称合资品牌份额将降到10%

头条要闻

马英九将再访大陆 台绿营怂恿他在大陆散布"台独"主张

头条要闻

马英九将再访大陆 台绿营怂恿他在大陆散布"台独"主张

体育要闻

池江璃花子:我不打算输

娱乐要闻

莱昂纳多与25岁新女友互相投喂超恩爱

财经要闻

疯狂!三个城市,三个地王!

汽车要闻

混动增程双模式 长安UNI-Z售11.79万起

态度原创

时尚
房产
亲子
游戏
军事航空

女团人手一副的nerd风眼镜,原来真的那么好戴!

房产要闻

就这?“离异3年内不得京内购房”明确被废止

亲子要闻

已致2死106人住院?知名海淘药出事啦!这5种药,早该扔了

媒体称《星刃》虽都是性感美女 但画风也足够暴力

军事要闻

乌方声称击落两枚俄"锆石"高超音速导弹 俄方未予回应

无障碍浏览 进入关怀版