使用Docker开发NodeJs APP

英文版原文地址

这是两篇连载文章的第一篇,讲解了如何使用 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 <[email protected]>
 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-serverRedis 服务是必需的,因为我们要把 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 成功运行了命令,情景应该如下图:

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,顺利的话会出现下图情景:

给 server.js 增加一个端点以模拟开发工作流:

1 app.get(‘/hello/:name‘, function(req, res) {
2   res.json({
3     hello: req.params.name
4   });
5 });

你将可以看到 nodemon 检测到文件的更改并重启了服务:

现在访问:http://localhost:3000/hello/world,你将会看到的页面:

Production

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

使用Docker开发NodeJs APP,布布扣,bubuko.com

时间: 2024-10-05 05:08:17

使用Docker开发NodeJs APP的相关文章

nodejs docker 开发最好选择yarn 进行包管理而不是npm

npm 与yarn 的区别网上一大堆的文章,我们在构建docker 镜像是应该遵守的有些原则 基础镜像尽量小 对于构建进行缓存处理 构建的docker 的文件层数尽量少 能直接运行的,就别进行重复构建了(比如go) yarn 在我们进行本地构建的时候可以帮助我们减少很多资源的在重复下载,以及校验, 加速docker 项目的构建 以下为一个简单的例子,具体与npm的比较就不用了,效果太明显了 备注: 此次docker nodejs 镜像使用的是 kkarczmarczyk/node-yarn (下

Visual Studio Code和Docker开发asp.net core和mysql应用

Visual Studio Code和Docker开发asp.net core和mysql应用 .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对岸的苹果园越来越茂盛,实在不想再去做一只宅猿了.于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去看看. .net猿上了小鲸鱼渡轮就先问了一个问题,苹果园上有能用来编写c#代码的和Visual Studio一样强大的IDE么?这时,天空闪过一道Gamma射线,艾瑞克神说,给你一个 Visual Stud

webstorm/...开发 NodeJS 项目

前提: 已安装好 webstorm/IDEA 2016.3 & 2017.1 (见 文 IDEA开发Java 相关 --- 1 IDEA安装 ...) 要用 IDEA 开发 NodeJS项目(web/JS)项目,首先需要: 1. 自行下载 Node.js 并安装,下载网址:https://nodejs.org/en/download/:或者 https://nodejs.org/en/: 测试: cmd-> node -v  或者 node, 未出现错误,如下,则表明已安装完好.   其次,

Cordova+ionic 开发hybird App --- 开发环境搭建

Cordova 开发hybird App 开发环境搭建 一.一些基础概念: Ant : 简单说来可以这么理解,如果你用记事本写JAVA程序,然后在cmd里输入javac命令编译它,但是有一天你发现每次手动输入太麻烦而且都是重复劳动,于是你下决心改变这种状况,然后学会了把javac命令写到一个bat文件中,以后编译只需要单击运行即可:然后随着你敲的代码越来越多,而且有了JAVA project概念,于是你手动新建了很多文件夹比如src.bin.lib,你有写了一个bat文件来减少你的重复劳动:再后

开发者技术分享日:如何快速开发跨平台App

活动概况 时间:2014年12月20日14:00-17:00 地点:车库咖啡(北京市海淀西大街48号鑫鼎宾馆二层) 主办:APICloud 活动背景 在这个移动.云.大数据的时代背景下,人人口中都离不开“App”这个热门名词,然而如何降低App开发难度,减少成本,提高效率成为创业者和开发者尤为关注的内容.作为Web圈里的人想进来,但无奈技术门槛和人力成本太高:作为Native开发圈里的人又想出去,但无奈WebApp体验太差,面对当前的现状如何轻松突破App开发难题是这次沙龙交流的主题. 这次沙龙

Electron + React + Node.js + ES6 开发本地 App

Electron + React + Node.js + ES6 开发本地 App 1.概述 近来工作上需要做一款 PC 上的软件,这款软件大体来讲是类似 PPT 的一款课件制作软件.由于我最近几年专注于移动 App 的开发,对 PC 端开发的了解有些滞后.所以我首先需要看看,在 PC 上采用什么框架能够顺利完成我的工作. 我的目标是,在完成这款软件的同时能够顺便学习一下比较流行的技术.在经过前期技术调研后,我明确了实现这款软件所需要的技术条件: 不采用 C++ 方面的类库,比如 MFC.Qt.

像asp.net Mvc一样开发nodejs+express Mvc站点

像asp.net Mvc一样开发nodejs+express Mvc站点 首先,我是个c#码农.从事Mvc开发已然4个年头了,这两年前端MVC的兴起,我也跟风学了一些,对前端的框架也了解一些,angularJs,requirejs,commonJs,backbone等等前端的mvc框架也异常流行,与这些前端的流行框架一同火起来的还有node.js. Node.js将javascript作为服务器端的代码开发,由其语言特性(单线程,异步)等以高效率高吞吐著称.这里不会去讨论node.js的好的坏的

App开发到App Store上架,发布流程。

http://blog.csdn.net/wojsg001/article/details/12005887 App开发到App Store上架,发布流程. 分类: IOS2013-09-25 11:25 6434人阅读 评论(1) 收藏 举报 网上已经有很多关于这方面的资料.我重点总结了三篇.大家可以参照着看. 1.IOS开发从新手到App Store上架. http://www.cocoachina.com/special/fornew.html 2.苹果APP STORE产品上架以及审批流

带你从零学ReactNative开发跨平台App开发(一)

首先自我介绍一下,本人鸟窝,现在就职于xx共享汽车,担任主程,目前用的技术栈是.net core+angular. 今天我讲的是关于ReactNative从零基础开发,希望可以对入门的新手,起到一个指导作用. 目前学习React Native跨平台开发的人员比较多,干ReactNative开发的程序员,转行过来的也比较多,之前就有遇到过,比如:干前端的,干Android/IOS的,干后台的(C#,Go,Java...PHP),发现一个很有趣的现象,我公司同事干PHP的,一次偶然,我发现他尽然学起