使用Docker开发NodeJs APP

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 英文版原文地址   这是两篇连载文章的第一篇,讲解了如何使用 Docker 替代 Vagrant 开发基于 Express 框架的NodeJs App的部分细节。不过,这次要增加点难度:我们要使用 connect-redis 在 Redis 中实现 session 功能。

英文版原文地址

 

这是两篇连载文章的第一篇,讲解了如何使用 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 <abhinav316@gmail.com>
 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 里面的数据在容器重启后会丢失。同样的,如果删掉这个容器重新生成一个,之前的数据也不会被保存。这样的结果是不乐观的,那么,在接下来的第二章,我会讲解产品的设置并解决这一问题。

 

 

 

 

目录
相关文章
|
4月前
|
存储 持续交付 Docker
Docker:颠覆传统开发的轻量级容器革命
Docker:颠覆传统开发的轻量级容器革命
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
381 1
|
7月前
|
人工智能 监控 JavaScript
HarmonyOS5云服务技术分享--ArkTS开发Node环境
本文详细讲解了在HarmonyOS(ArkTS API 9及以上)中使用云函数的开发技巧,结合Node.js和HTTP触发器,从零开始手把手教学。内容涵盖核心能力、开发流程(配置到部署)、高阶优化及常见问题解决,并提供实际应用场景示例。助你快速掌握Serverless开发,提升效率,探索跨端协作与AI集成等未来方向。
|
9月前
|
存储 开发工具 开发者
揭秘 Microsoft.Docker.SDK:让容器开发更轻松的强大工具揭秘
随着云计算和容器技术的快速发展,`Docker` 已经成为容器化技术的事实标准。`Microsoft` 作为 `Docker` 的主要支持者和参与者,推出了 `Microsoft.Docker.SDK`,旨在帮助开发者更轻松地进行容器开发。本文将深入揭秘 Microsoft.Docker.SDK 的功能、使用方法以及它在容器开发中的应用。
244 13
|
10月前
|
JavaScript 前端开发 数据可视化
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
564 2
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
|
10月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
414 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
10月前
|
JavaScript Shell C#
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
613 3
|
9月前
|
安全 开发者 Docker
Docker技术背景与应用:解决现代开发中的关键问题
Docker作为一种革命性的容器化技术,极大地改变了现代软件开发的方式。通过解决环境一致性、依赖管理、部署复杂性和资源利用率等问题,Docker为开发者提供了高效、灵活的开发和部署环境。尽管面临着一些挑战,但随着技术的发展和完善,Docker将继续在现代软件开发中发挥重要作用。作为全栈工程师,掌握并善用Docker技术,将为我们的开发工作带来更多便利和可能性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
11月前
|
JavaScript 前端开发 jenkins
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
本文探讨了在不依赖Node和VSCode的情况下,仅使用记事本和浏览器开发一个完整的Vue3前端项目的方法。通过CDN引入Vue、Vue Router、Element-UI等库,直接编写HTML文件实现页面功能,展示了前端开发的本质是生成HTML。虽然日常开发离不开现代工具,但掌握这种基础方法有助于快速实现想法或应对特殊环境限制。文章还介绍了如何用Node简单部署HTML文件到服务器,提供了一种高效、轻量的开发思路。
251 10
|
12月前
|
Web App开发 JavaScript 前端开发
Node.js开发
Node.js开发
242 13