介绍docker容器的出现彻底改变了应用程序的运行方式,nodejs也颠覆了后端应用程序的开发模式。两者结合会产生意想不到的效果。本文将以一个常用的nodejs程序为例,分析如何使用docker构建一个nodejs镜像。准备一个nodejs应用一个标准的nodejs程序需要一个package.json文件来描述应用的元数据和依赖,然后通过npminstall安装应用的依赖,最后通过nodeapp.js运行程序。本文将创建一个简单的koa应用来说明docker的使用。首先创建一个package.json文件:{"name":"koa-docker","description":"如何将nodejskoa程序打包成docker应用","version":"0.0.1","dependencies":{"ejs":"^2.5.6","fs-promise":"^2.0.3","koa":"^2.2.0","koa-basic-auth":"^2.0.0","koa-body":"^4.0.8","koa-compose":"^4.0.0","koa-csrf":"^3.0.6","koa-logger":"^3.0.0","@koa/router":"^8.0.5","koa-session":"^5.0.0","koa-static":"^3.0.0","koa-views":"^6.0.2"},"scripts":{"test":"NODE_ENV=testmocha--harmony--reporterspec--requireshould*/test.js","lint":"eslint。"},"engines":{"node":">=7.6"},"license":"MIT"}上面的package.json文件指定了项目的依赖。接下来,我们需要使用npminstall安装项目的依赖项。安装的项目依赖会放在本地的node_modules文件夹中。然后我们就可以编写服务程序了:com';});if(!module.parent)app.listen(3000);上面是一个很简单的koa服务器程序,监听3000端口,返回'Hellowww.flydean.com'。运行nodeapp.js,我们就可以启动web服务了。好了,我们的服务程序就搭建好了,接下来,我们就来看看docker打包nodejs程序的最佳实践。创建Dockerfile为了创建docker镜像,我们需要一个Dockerfile作为镜像的描述。让我们一步步解释如何创建这个Dockerfile。导入基础镜像。为了运行docker程序,我们需要指定一个基础镜像,比如操作系统,node给我们提供了一个打包好的镜像,我们可以直接引用:FROMnode:12我们指定了node的12版本,这个版本已经安装了最新的LTSnode12,使用这个镜像我们不需要自己安装node的相关环境,非常方便。指定工作目录有了镜像,我们需要在docker中指定工作目录:#创建app目录WORKDIR/data/appinstallnode_modules接下来我们需要将package*.json文件复制到镜像中,运行npminstall进行安装依赖库:COPYpackage*.json./RUNnpminstall上面我们复制了package*.json,因为如果我们在本地运行过npminstall命令,会生成一个pacakge-lock.json文件。该文件用于统一依赖包版本。我们需要一起复制它们。复制完成后,可以运行npminstall安装依赖包。问题?为什么我们只复制pacakge.json而不是整个工作目录?答:docker文件中的每个命令都会导致创建一个新层。在上面的docker文件中,只要不修改pakage.json,新建的docker镜像其实是可以共享层缓存的。但是如果我们直接添加本地的工作目录,只要我们的工作目录有文件被修改,就会导致整个docker镜像重新构建。所以为了提高构建效率和速度,我们只复制package.json。复制应用程序并运行它。最后的工作是复制应用程序app.js并运行它:#复制应用程序COPYapp.js.#暴露端口EXPOSE8080#运行命令CMD["node","app.js"]最后,我们的dockerfile应该是这样的:FROMnode:12#CreateappdirectoryWORKDIR/data/appCOPYpackage*.json./RUNnpminstall#CopyapplicationCOPYapp.js.#ExposeportEXPOSE8080#RuncommandCMD["node","app.js"]创建一个.dockerignore文件我们知道git会有一个.gitignore文件,docker也有一个.dockerignore文件。这个文件的作用是防止你本地的文件被复制到docker镜像中。node_modules比如我们可以在里面指定node_modules这样就不会被复制了。创建docker镜像创建docker镜像非常简单,我们可以使用如下命令:dockerbuild-tflydean/koa-web-app创建完成后,我们可以使用dockerimages查看新创建的镜像:dockerimages#ExampleREPOSITORYTAGIDCREATEDnode121934b0b038d15天前oflydean/koa-web-applatestd64d3505b0d21分钟前运行docker程序最后我们可以通过dockerrun命令运行应用程序dockerrun-p54321:8080-dflydean/koa-web-app然后我们就可以通过本地的54321端口来访问应用了。node的docker镜像注意事项这里讨论创建docker镜像的注意事项。不要使用root用户运行应用程序。默认情况下,docker中的应用程序将以root用户身份运行。出于安全原因,建议您以普通用户身份运行该应用程序。我们可以在docker文件中指定:FROMnode:12...#最后以node用户USERnode运行应用或者我们在运行时使用-u"node"作为启动参数来指定运行用户。
