Webapp用例:如何用docker部署webapp
白羽 2018-06-06 来源 :网络 阅读 732 评论 0

摘要:本文简单记录了在docker里部署一个webapp的例子,希望本文对大家学WEBAPP有所帮助。


本文以 [tcl-tennis](https://github.com/limijiaoyin/tcl-tennis) 为例,说明部署 Node.js webapp 的步骤。
## 创建 Dockerfile
首先,clone 代码
```sh
$ git clone git@github.com:limijiaoyin/tcl-tennis.git
```
根据 Docker 官网的帮助文档 [Dockerizing a Node.js web app](https://docs.docker.com/examples/nodejs_web_app/),创建 Dockerfile:
```Dockerfile
FROM    centos:centos6
# Enable EPEL for Node.js
RUN     rpm -Uvh //download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# Install Node.js and npm
RUN     yum install -y npm 
RUN     yum install -y git
# Bundle app source
COPY . /src
# Install bower
RUN npm install -g bower --registry=//registry.npm.taobao.org
# Install app dependencies
RUN cd /src; npm install --production --registry=//registry.npm.taobao.org
RUN cd /src; bower install --allow-root
EXPOSE  12580
WORKDIR /src
CMD ["node", "app.js"]
```
__注意修改执行的 js 文件和暴露的端口。__
## 修改代码,分离外部服务
很多的 webapp 都使用了DB、缓存、事件队列等外部服务,所以需要事先确认系统是否已经安装好了,如果没有的话需要先安装。目前系统当中预先安装的服务列表在 [这儿]() 。
底层服务配置好之后,还要注意:很多的项目在工程配置方面都支持的不够好,很多外部服务的地址和配置参数都是直接硬编码到代码当中的。使用 Docker 构建之前,需要修改代码以支持各种配置的灵活修改。这样才能够好的运用 Docker。
以 tcl-tennis 为例,服务器端使用了 mongodb,需要把游戏成绩存到 mongodb 的 `tennis` 数据里面去,原来的代码如下:
```javascript
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/tennis');
... 
```
mongodb 的 `hostname` 被写死成了 localhost,需要修改。分离各种外部服务的方法:[在环境中存储配置](//12factor.net/zh_cn/config),原文:
> __推荐将应用的配置存储于 *环境变量* 中( env vars, env )。__环境变量可以非常方便地在不同的部署间做修改,却不动一行代码... 
修改过的代码如下:
```javascript
var mongodb_host = process.env.mongodb_host || 'localhost';
var mongoose = require('mongoose');
mongoose.connect('mongodb://' + mongodb_host + '/tennis');
...
```
## 构建镜像,启动服务
修改完代码之后,就可以开始构建镜像了。首先,使用 [Daocloud.io](//help.daocloud.io/intro/accelerator.html) 的加速器拉取 base 镜像(Docker 默认会直接从他的镜像源下载镜像,但是网速实在太慢):
```sh
$ dao pull centos:centos6
```
然后构建镜像:
```sh
$ docker build -t limijiaoyin/portfolio-tcl-tennis .
```
构建成功之后,可以先试运行一下:
```sh
$ docker run \
 --rm \
 -it \
 -p 12580:12580 \
 --link mongo \
 --env mongodb_host=mongo \
 limijiaoyin/portfolio-tcl-tennis
```
使用 `--rm` flag 可以在服务被关闭的时候自动帮我们清理 container,非常适合调试镜像。`-p` 用来设置 container 与主机之间的端口映射。使用 `--link` flag 将我们的 webapp 和其他服务连接起来。
一切都测试 OK 之后,设置服务在后台运行。
```sh
$ docker run \
 -p 12580:12580 -d \
 --link mongo \
 --env mongodb_host=mongo \
 --restart=always \
 --name tcl-tennis \
 limijiaoyin/portfolio-tcl-tennis


```


`--restart` 用来设置重启方式,`always` 表示无论任何情况下,应用结束都会自动重启。`--name` 用来设置 container 名称。

## 总结

使用 Docker 部署 webapp 的一般步骤:

* 创建 Dockerfile
* __修改代码,分离外部服务__
* 构建镜像并调试
* 启动服务后台执行,设置自动重启等
* 将修改的代码重新提交到 git 代码库

## docker,uwsgi部署django应用需要注意的地方

* docker 内部的socket host 要用0.0.0.0,而不是127.0.0.1或localhost
* 静态文件需要单独处理,目前的方案是使用[whitenoise](https://pypi.python.org/pypi/whitenoise)


Docker 详细的使用方法请参考 [官方文档](https://docs.docker.com/userguide/)


 


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之WebApp频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程