2019独角兽企业重金招聘Python工程师标准>>>

本文以 [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 http://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=http://registry.npm.taobao.org

# Install app dependencies
RUN cd /src; npm install --production --registry=http://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,需要修改。分离各种外部服务的方法:[在环境中存储配置](http://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](http://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/)

转载于:https://my.oschina.net/u/2371517/blog/597147

docker部署webapp的例子相关推荐

  1. docker 部署java_使用Docker堆栈部署的微服务-WildFly,Java EE和Couchbase

    docker 部署java 关于微服务的资料很多,只是用谷歌搜索就可以了 ! 几年前,我在比利时的Devoxx上发表了有关将单片重构为微服务的演讲,它获得了很好的评价: 该博客将展示Docker如何简 ...

  2. Docker部署文档

    Docker部署文档 目录 Docker部署文档 1 一.什么是Docker 3 1.1Docker简介 3 1.2对比传统虚拟机总结 4 1.3Docker通常用于如下场景: 5 1.4基本概念 5 ...

  3. 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth

    为什么80%的码农都做不了架构师?>>>    前言 微服务架构中完成一项功能经常会在多个服务之间远程调用(RPC),形成调用链.每个服务节点可能在不同的机器上甚至是不同的集群上,需 ...

  4. 通过 Docker 部署 Redis 6.x 集群

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 作者:超级小豆丁 http: ...

  5. docker 打包mysql_基于docker部署mysql的数据持久化问题

    本人最近在使用docker部署mysql时,在持久化mysql数据时遇到了一个有趣的问题,将排查过程及思考记录在这里,以备后查. 先简单描述下我遇到的问题:在mysql容器中创建了两个数据库,然后使用 ...

  6. docker php composer 使用_如何使用Docker部署PHP开发环境

    本文主要介绍了如何使用Docker构建PHP的开发环境,文中作者也探讨了构建基于Docker的开发环境应该使用单容器还是多容器,各有什么利弊.推荐PHP开发者阅读.希望对大家有所帮助. 环境部署一直是 ...

  7. 你会通过Docker部署war包吗

    1.  使用Docker部署war,必须要用容器,我们就用tomcact容器,其实都是将war包丢到tomcat的webapps目录下,tomcat启动的情况下会自动解压war包. 一种是在Docke ...

  8. 用Docker部署TensorFlow Serving服务

    文章目录 1. 安装 Docker 2. 使用 Docker 部署 3. 请求服务 3.1 手写数字例子 3.2 猫狗分类例子 参考: https://tf.wiki/zh_hans/deployme ...

  9. 使用docker部署vue_如何使用Vue,Docker和Azure进行持续交付

    使用docker部署vue A few weeks ago at ng-conf, I announced the launch of vscodecandothat.com - a project ...

最新文章

  1. Python模块包中__init__.py文件的作用
  2. Self-Reflection: How to Do It Right
  3. mysql的count()函数如何选择索引,千万级表的count()查询优化实例
  4. 数字IC验证学习(一)
  5. java月历组件_vue之手把手教你写日历组件
  6. 创业者谈:畏惧失败,但也要拥抱失败
  7. Spring.Net学习笔记九(自定义对象行为)
  8. php 浮点数 模运算,同余与模运算
  9. 神经网络----笔记(1)
  10. SFB 项目经验-52-Outlook-2010/2013-连接Exchange 2016需要密码!
  11. linux-ubuntu 安装mysql5.7.19的一些坑
  12. JavaScript 隐性类型转换步骤浅析
  13. 遗传算法解决作业调度c语言,遗传算法(GA)的C语言实现
  14. php 禁止外链,php伪造referer突破网盘禁止外链
  15. MAC + IDEA自动生成SerialVersionUID(亲测有效)
  16. Shapely 扩展包功能札记
  17. UVM基础-Sequence、Sequencer(二)
  18. Day_06 传智健康项目-移动端开发-体检预约
  19. 这些数据爬虫网站,帮你工作提质增效,还不收藏?
  20. SQL server 强制释放内存

热门文章

  1. Oracle 存储方式大比拼
  2. spring mvc 接收表单 bean
  3. Ubuntu14.04搭建Oracle instantClient 11.2.0.4并配置cx_Oracle5.1.2
  4. 【IOS】ios8推送消息注册
  5. 【引用】Java开发者的十大戒律
  6. 不同的载体 不同的商业模式
  7. 你想过35岁以后的出路吗
  8. python2.7个3.7之间传输文件_关于将python2.7转换为python3.7的说明,python27,python37,散记...
  9. springboot交通事故档案管理系统答辩PPT免费下载
  10. 程序员都必须了解的18个Python模式程序片段