当前位置: 首页 > 科技观察

基于Docker开发NodeJS应用

时间:2023-03-17 15:23:51 科技观察

这是两篇文章中的第一篇。本文涵盖了在使用Express框架开发Node应用程序时用Docker替换Vagrant的更详细教程。该应用程序将使用connect-redis中间件将会话信息持久保存到Redis。第二篇文章会介绍这个Productionsettingsfordevelopment。关于这个Node应用程序这个应用程序包含一个package.json、server.js和一个.gitignore文件,它们非常简单,触手可及..gitignorenode_modules/*package.json{"name":"docker-dev","version":"0.1.0","description":"DockerDev","dependencies":{"connect-redis":"~1.4.5","express":"~3.3.3","hiredis":"~0.1.15","redis":"~0.8.4"}}server.jsvarexpress=require('express'),app=express(),redis=require('redis'),RedisStore=require('connect-redis')(express),server=require('http').createServer(app);app.configure(function(){app.use(express.cookieParser('keyboard-cat'));app.use(express.session({store:newRedisStore({host:process.env.REDIS_HOST||'localhost',端口:process.env.REDIS_PORT||6379,db:process.env.REDIS_DB||0}),cookie:{过期s:false,maxAge:30*24*60*60*1000}}));});app.get('/',function(req,res){res.json({status:"ok"});});varport=process.env.HTTP_PORT||3000;服务器.listen(端口);console.log('Listeningonport'+port);server.js将提取所有依赖项并启动特定应用程序。这个特定的应用程序被设置为在Redis中存储会话信息,并公开一个请求端点,该端点返回一个JSON状态消息作为响应。这都是非常标准的东西。需要注意的一件事是,对于Redis连接信息,可以使用环境变量覆盖——这将在稍后从开发环境dev迁移到生产环境prod时发挥作用。Dockerfile由于开发需要,我们会让Redis和Node运行在同一个容器中,所以我们会使用一个Dockerfile来配置这个容器。DockerfileFROMdockerfile/ubuntuMAINTAINERAbhinavAjgaonkar#InstallRedisRUN\apt-get-y-qqinstallpythonredis-server#InstallNodeRUN\cd/opt&&\wgethttp://nodejs.org/dist/v0.10.28/node-v0。10.28-linux-x64.tar.gz&&\tar-xzfnode-v0.10.28-linux-x64.tar.gz&&\mvnode-v0.10.28-linux-x64node&&\cd/usr/local/bin&&\ln-s/opt/node/bin/*.&&\rm-f/opt/node-v0.10.28-linux-x64.tar.gz#SettheworkingdirectoryWORKDIR/srcCMD["/bin/bash"]一行一行来理解,FROMdockerfile/ubuntu这次告诉docker使用DockerInc.提供的dockerfile/ubuntu镜像作为基础镜像进行构建。RUN\apt-get-y-qqinstallpythonredis-server基础镜像根本不包含任何内容——所以我们需要使用apt-get来获取应用程序运行所需的一切。这句话会安装python和redis-server。redis服务器是必须的,因为我们会把session信息存储在里面,python的必要性是通过构建Redis节点模块所需的npmC扩展。RUN\cd/opt&&\wgethttp://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz&&\tar-xzfnode-v0.10.28-linux-x64.tar.gz&&;\mvnode-v0.10.28-linux-x64node&&\cd/usr/local/bin&&\ln-s/opt/node/bin/*.&&\rm-f/opt/node-v0.10.28-linux-x64。tar.gz这将下载并提取64位NodeJS二进制文件。WORKDIR/src行将告诉docker在容器启动后执行cd/src.CMD["/bin/bash,然后再执行CMD属性指定的任何内容。"]作为最后一步,运行/bin/bash.构建并运行容器既然已经编写了docker文件,那么让我们构建一个Docker镜像。dockerbuild-tsqldump/docker-dev:0.1。镜像构建完成后,我们可以使用如下语句来运行容器:dockerrun-i-t--rm\-p3000:3000\-v`pwd`:/src\sqldump/docker-dev:0.1我们来看看dockerrun命令-i将以交互模式启动容器(与分离模式下的-d相比)。这意味着一旦交互式会话结束,容器将退出。-t将分配一个伪终端。--rm将在退出时删除容器及其文件系统。-p3000:3000将主机上的端口3000转发到容器上的端口3000。-v`pwd`:/src会将当前工作目录挂到宿主机上容器中的/src(比如我们的项目文件)。我们将当前目录挂载为一个卷,而不是使用Dockerfile中的ADD命令,这样我们在文本编辑器中所做的任何更改都可以立即在容器中看到。sqldump/docker-dev:0.1是要运行的docker镜像的名称和版本——这与我们用来构建docker镜像的名称和版本相同。由于Dockerfile指定了CMD["/bin/bash"],容器一启动,我们就会登录到一个bashshell环境。如果dockerrun命令执行成功,它会是这样的:#p#Startdevelopment现在容器正在运行,在我们开始编写代码之前,我们需要整理一些标准的、非docker相关的东西。第一的,使用如下语句启动容器中的redis服务器:serviceredis-serverstart然后,安装项目依赖和nodemon。Nodemon会观察项目文件的变化,适时重启服务器。npminstallnpminstall-gnodemon***,使用以下命令启动服务器:nodemonserver.js现在,如果您在浏览器中导航到http://localhost:3000,您应该会看到类似这样的内容:让我们添加另一个端点,例如Server。js模拟开发过程:app.get('/hello/:name',function(req,res){res.json({hello:req.params.name});});您将看到nodemon检测到您的更改,并重新启动了服务器:现在,如果您将浏览器导航到http://localhost:3000/hello/world,您将看到以下响应:Containersinthecurrentstateof生产环境,远不能作为产品发布。redis中的数据不会在容器重新启动后保留。例如,如果您重新启动容器,所有会话数据都将被清除。同样的事情发生在你销毁容器并启动一个新容器时也会发生,显然这不是你想要的。这个问题我会在制作内容的第二部分讲到。英文原文:DevelopaNodeJSAppWithDocker翻译链接:http://www.oschina.net/translate/develop-a-nodejs-app-with-docker