DockerizedNode.jsWebApplication这个例子的目的是向你展示如何把一个Node.js应用程序放到一个Docker容器中,这个指南旨在用于开发,而不是生产部署,本指南还假设您安装了Docker,并且对Node.js应用程序的结构有基本的了解。在本指南的第一部分,我们将在Node.js中创建一个简单的Web应用程序,然后我们将为该应用程序构建一个Docker镜像,最后我们将该镜像作为容器运行。Docker允许您将应用程序及其所有依赖项打包到一个称为软件开发容器的标准化单元中。容器是Linux操作系统分离出来的基础版本,镜像是你加载到容器中的软件。创建一个Node.js应用程序首先,创建一个新目录,所有文件都将存放在该目录中。在此目录中,创建一个package.json文件来描述您的应用及其依赖项:{"name":"docker_web_app","version":"1.0.0","description":"Node.jsonDocker","author":"FirstLast","main":"server.js","scripts":{"start":"nodeserver.js"},"dependencies":{"express":"^4.16.1"}}要使用新的package.json文件,请运行npminstall如果您使用npm版本5或更高版本,将生成一个package-lock.json文件,该文件将被复制到您的Docker映像中.然后,创建一个使用Express.js框架定义Web应用程序的server.js文件:'usestrict';constexpress=require('快递');//常量constPORT=8080;constHOST='0.0.0.0';//Appconstapp=express();app.get('/',(req,res)=>{res.send('Helloworld\n');});app.listen(PORT,HOST);console.log(`在http://${HOST}:${PORT}上运行`);在接下来的步骤中,我们将了解如何使用官方Docker镜像在Docker容器中运行此应用程序,首先,您需要构建应用程序的Docker镜像。创建Dockerfile创建一个名为Dockerfile的空文件:触摸Dockerfile以在您喜欢的文本编辑器中打开Dockerfile。我们需要做的第一件事是定义我们要构建的镜像,这里我们将使用最新的LTS(长期支持)版本8node:FROMnode:8fromDockerHub接下来,我们创建一个目录来存放应用程序代码在图像中,这将是您的应用程序的工作目录:#CreateappdirectoryWORKDIR/usr/src/app此图像已经安装了Node.js和NPM,所以接下来我们需要做的是使用npm二进制文件安装您的应用程序依赖项,请注意,如果您使用的是npm版本4或更早版本,则不会生成package-lock.json文件。#Installappdependencies#Awildcardisusedtoensurebothpackage.jsonANDpackage-lock.jsonarecopied#whereavailable(npm@5+)COPYpackage*.json./RUNnpminstall#如果你正在构建你的代码production#RUNnpminstall--only=production请注意,我们只复制package.json文件,而不是整个工作目录,这使我们可以利用缓存的Docker层,bitJudo在这里有很好的解释。要将应用程序的源代码捆绑到Docker映像中,请使用COPY指令:#BundleappsourceCOPY..你的应用程序绑定到端口8080,因此你将使用EXPOSE指令让docker守护进程映射它:EXPOSE8080FinallyButnot至少,使用定义运行时的CMD定义运行应用程序的命令,在这里我们将使用基本的npmstart来运行nodeserver.js来启动你的服务器:CMD["npm","start"]你的Dockerfile现在应该看起来像这样:FROMnode:8#CreateappdirectoryWORKDIR/usr/src/app#Installappdependencies#Awildcardisusedtoensurebothpackage.jsonANDpackage-lock.jsonarecopyed#whereavailable(npm@5+)COPYpackage*.json./RUNnpminstall#如果您正在为生产构建代码#RUNnpminstall--only=production#BundleappsourceCOPY。.EXPOSE8080CMD["npm","start"].dockerignorefile在与Dockerfile相同的目录中创建一个.dockerignore文件,内容如下:node_modulesnpm-debug.log这可以防止本地模块和调试日志被复制到Docker镜像并可能覆盖镜像模块中的安装。构建你的镜像进入Dockerfile所在的目录,然后运行以下命令构建Docker镜像,使用-t标志标记镜像,以便以后使用dockerimages命令更容易找到:$dockerbuild-t<您的用户名>/node-web-app。您的图像现在将由Docker列出:$dockerimages#ExampleREPOSITORYTAGIDCREATEDnode81934b0b038d15daysago/node-web-applatestd64d3505b0d21minuteagoRuntheimage使用-d运行图像以分离在后台运行容器的模式,-p标志将公共端口重定向到容器内的私有端口,并运行您之前构建的图像:$dockerrun-p49160:8080-d/node-web-app打印应用程序的输出:#获取容器ID$dockerps#打印应用程序输出$dockerlogs#ExampleRunningonhttp://localhost:8080如果你需要进入容器,你可以使用exec命令:#进入容器$dockerexec-it/bin/bashTest要测试你的应用程序,获取Docker映射的应用程序端口:$dockerps#ExampleIDIMAGECOMMAND...PORTSecce33b30ebf/上例中的node-web-app:latestnpmstart...49160->8080,Docker将容器内部的8080端口映射到你电脑上的49160端口。现在您可以使用curl调用您的应用程序(如果需要,安装:sudoapt-getinstallcurl):$curl-ilocalhost:49160HTTP/1.1200OKX-Powered-By:ExpressContent-Type:text/html;charset=utf-8Content-Length:12ETag:W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0"Date:Mon,13Nov201720:53:59GMTConnection:keep-aliveHelloworld我们希望本教程能帮助您获得一个简单的节点。js应用程序在Docker上启动并运行。您可以在以下位置找到有关Docker和Node.js的更多信息:官方Node.jsDocker图片Node.jsDocker最佳实践指南官方Docker文档DockerStackOverflow上的Docker标签Subredditjs应用下一篇:迁移到安全的Buffer构造函数