设为首页 收藏本站
查看: 1360|回复: 0

[经验分享] 使用Docker开发NodeJs APP

[复制链接]

尚未签到

发表于 2015-4-17 09:32:18 | 显示全部楼层 |阅读模式
  英文版原文地址
  
  这是两篇连载文章的第一篇,讲解了如何使用 Docker 替代 Vagrant 开发基于 Express 框架的NodeJs App的部分细节。不过,这次要增加点难度:我们要使用 connect-redis 在 Redis 中实现 session 功能。第二篇文章将基于此继续。
  

The Node App
  这个 App 由一个 package.json , server.js.gitignore 文件组成,就这么简简单单:
  .gitignore :



1  node_modules/*
  package.json :



1 {
2      "name": "docker-dev",
3      "version": "0.1.0",
4      "description": "Docker Dev",
5      "dependencies": {
6          "connect-redis": "~1.4.5",
7          "express": "~3.3.3",
8          "hiredis": "~0.1.15",
9          "redis": "~0.8.4"
10      }
11  }
  server.js :



1 var express = require('express'),
2     app = express(),
3     redis = require('redis'),
4     RedisStore = require('connect-redis')(express),
5     server = require('http').createServer(app);
6
7 app.configure(function() {
8   app.use(express.cookieParser('keyboard-cat'));
9   app.use(express.session({
10         store: new RedisStore({
11             host: process.env.REDIS_HOST || 'localhost',
12             port: process.env.REDIS_PORT || 6379,
13             db: process.env.REDIS_DB || 0
14         }),
15         cookie: {
16             expires: false,
17             maxAge: 30 * 24 * 60 * 60 * 1000
18         }
19     }));
20 });
21
22 app.get('/', function(req, res) {
23   res.json({
24     status: "ok"
25   });
26 });
27
28 var port = process.env.HTTP_PORT || 3000;
29 server.listen(port);
30 console.log('Listening on port ' + port);
  Server.js 处理了依赖关系并启动了一个Express App,这个Express App 配置了 Redis 里存储的 Session 信息并曝露了一个端点(endpoint)用来返回标准 json 格式的服务器状态信息。
  这里需要稍微注意的是,Redis 的连接信息会被使用的环境变量所覆盖--后面发布时会有用到这一信息。
  

The Dockerfile
  
  为了便于开发,我们会把 redis 和 node 运行在同一个容器里,要实现这点,就必须用 Dockerfile 来配置容器 :
  Dockerfile :



1 FROM dockerfile/ubuntu
2
3 MAINTAINER Abhinav Ajgaonkar
4
5 # Install Redis
6 RUN   \
7   apt-get -y -qq install python redis-server
8
9 # Install Node
10 RUN   \
11   cd /opt && \
12   wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz && \
13   tar -xzf node-v0.10.28-linux-x64.tar.gz && \
14   mv node-v0.10.28-linux-x64 node && \
15   cd /usr/local/bin && \
16   ln -s /opt/node/bin/* . && \
17   rm -f /opt/node-v0.10.28-linux-x64.tar.gz
18
19 # Set the working directory
20 WORKDIR   /src
21
22 CMD ["/bin/bash"]
  让我们逐行逐行来看看 Docherfile 里的代码:



1 FROM dockerfile/ubuntu
  告诉 Docker 用 Docker 公司提供的 dockerfile/ubuntu 的镜像文件作为 build 时的基础镜像。



1 RUN  \
2   apt-get -y -qq install python redis-server
  基础镜像本身并没有任何东西,所以,我们需要用 apt-get 命令将所需要的组件打包进去。这条表示安装 python和 redis-server,Redis 服务是必需的,因为我们要把 session 信息存储进去。对于 npm 而言,python 可以为 Redis Node 生成 C 扩展。



1 RUN  \
2   cd /opt && \
3   wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz && \
4   tar -xzf node-v0.10.28-linux-x64.tar.gz && \
5   mv node-v0.10.28-linux-x64 node && \
6   cd /usr/local/bin && \
7   ln -s /opt/node/bin/* . && \
8   rm -f /opt/node-v0.10.28-linux-x64.tar.gz
  下载并解压 64 位二进制版 NodeJs。



1 WORKDIR  /src
  这句话是告诉 Docker -- 容器开始运行时进入 cd /src 目录。



1 CMD ["/bin/bash"]
  此为最后一步:启动 /bin/bash.
  

Build and run the container
  Docker file 配置好后,我们来生成一个 Docker 镜像:



1 docker build -t sqldump/docker-dev:0.1 .
  生成成功后,就可以用下面的命令启动容器了:



1 docker run -i -t --rm \
2            -p 3000:3000 \
3            -v `pwd`:/src \
4            sqldump/docker-dev:0.1
  我们来分析一下这个命令。
  -i: 以交互模式运行容器 (不同于 -d : 以分离模式运行容器),这意味着交互回话 session 结束时,容器就会停止运行。
  -t : 分配了一个虚拟终端(pseudo-tty)
  --rm : 停止运行时移除容器和文件系统。
  -p 3000:3000 :主机端口 3000 : 容器端口 3000



1 -v `pwd`:/src
  这条命令把主机的当前工作目录(如,项目文件)载入容器的/src里面。我们载入文件而不是使用 add 命令增加文件,这使得我们在文本编辑器里更爱文件后能立刻在容器里看到效果。
  sqldump/docker-dev:0.1 : 当前运行的 docker 镜像的名字和版本号与我们生成的镜像是一样的。
  由于 Dockerfiles 指定了 CMD ["/bin/bash"],容器运行后我们就进入了一个 bash shell。如果 docker 成功运行了命令,情景应该如下图:
DSC0000.png
  
  

Start Developing
  容器现在已经运行起来了,不过,在开始编写代码之前,需要将一些标配的,非 docker 文件分别安装。首先,用如下命令在容器里启动 redis 服务:



1 service redis-server start
  然后,安装相关依赖和 nodemon 。Nodemon 可以实时监听项目文件的变化并重启服务。



1 npm install
2 npm install -g nodemon
  最后,用如下命令启动服务:



1 nodemon server.js
  现在,打开你的浏览器并访问:http://localhost:3000,顺利的话会出现下图情景:
DSC0001.png
  给 server.js 增加一个端点以模拟开发工作流:



1 app.get('/hello/:name', function(req, res) {
2   res.json({
3     hello: req.params.name
4   });
5 });
  你将可以看到 nodemon 检测到文件的更改并重启了服务:
DSC0002.png
  
  现在访问:http://localhost:3000/hello/world,你将会看到的页面:
DSC0003.png
  

Production
  容器当前的状态,还远没有成型。redis 里面的数据在容器重启后会丢失。同样的,如果删掉这个容器重新生成一个,之前的数据也不会被保存。这样的结果是不乐观的,那么,在接下来的第二章,我会讲解产品的设置并解决这一问题。
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-57997-1-1.html 上篇帖子: Angularjs学习---angularjs环境搭建,ubuntu 12.04下安装nodejs、npm和karma 下篇帖子: nodejs调用脚本(python/shell)和系统命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表