摘要:化应用程序此示例的目的是向你展示如何将应用程序放入容器中,该指南旨在用于开发,而不用于生产部署,本指南还假设你有一个有效的安装,并且基本了解应用程序的结构。
Docker化Node.js Web应用程序
此示例的目的是向你展示如何将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.js on Docker", "author": "First Last", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.16.1" } }
使用新的package.json文件,运行npm install,如果你使用的是npm版本5或更高版本,则会生成一个package-lock.json文件,该文件将被复制到你的Docker镜像中。
然后,创建一个使用Express.js框架定义Web应用程序的server.js文件:
"use strict"; const express = require("express"); // Constants const PORT = 8080; const HOST = "0.0.0.0"; // App const app = express(); app.get("/", (req, res) => { res.send("Hello world "); }); app.listen(PORT, HOST); console.log(`Running on http://${HOST}:${PORT}`);
在接下来的步骤中,我们将了解如何使用官方Docker镜像在Docker容器中运行此应用程序,首先,你需要构建应用程序的Docker镜像。
创建Dockerfile创建一个名为Dockerfile的空文件:
touch Dockerfile
在你喜欢的文本编辑器中打开Dockerfile。
我们需要做的第一件事是定义我们想要构建的镜像,在这里,我们将使用Docker Hub提供的最新LTS(长期支持)版本8 node:
FROM node:8
接下来,我们创建一个目录来保存镜像中的应用程序代码,这将是你的应用程序的工作目录:
# Create app directory WORKDIR /usr/src/app
这个镜像已经安装了Node.js和NPM,所以接下来我们需要做的是使用npm二进制文件安装你的应用程序依赖项,请注意,如果你使用的是npm版本4或更早版本,则不会生成package-lock.json文件。
# Install app dependencies # A wildcard is used to ensure both package.json AND package-lock.json are copied # where available (npm@5+) COPY package*.json ./ RUN npm install # If you are building your code for production # RUN npm install --only=production
请注意,我们只复制package.json文件,而不是复制整个工作目录,这使我们可以利用缓存的Docker层,bitJudo在这里有一个很好的解释。
要将应用程序的源代码捆绑在Docker镜像中,请使用COPY指令:
# Bundle app source COPY . .
你的应用程序绑定到端口8080,因此你将使用EXPOSE指令让docker守护程序映射它:
EXPOSE 8080
最后但并非最不重要的是,使用定义你运行时的CMD定义运行你应用程序的命令,这里我们将使用基本的npm start来运行node server.js来启动你的服务器:
CMD [ "npm", "start" ]
你的Dockerfile现在应该如下所示:
FROM node:8 # Create app directory WORKDIR /usr/src/app # Install app dependencies # A wildcard is used to ensure both package.json AND package-lock.json are copied # where available (npm@5+) COPY package*.json ./ RUN npm install # If you are building your code for production # RUN npm install --only=production # Bundle app source COPY . . EXPOSE 8080 CMD [ "npm", "start" ].dockerignore文件
在与Dockerfile相同的目录中创建一个.dockerignore文件,其中包含以下内容:
node_modules npm-debug.log
这样可以防止将本地模块和调试日志复制到Docker镜像上,并可能覆盖镜像中安装的模块。
构建你的镜像转到具有Dockerfile的目录,然后运行以下命令来构建Docker镜像,使用-t标志可以标记镜像,以便以后使用docker images命令更容易找到:
$ docker build -t/node-web-app .
你的镜像现在将由Docker列出:
$ docker images # Example REPOSITORY TAG ID CREATED node 8 1934b0b038d1 5 days ago运行镜像/node-web-app latest d64d3505b0d2 1 minute ago
使用-d运行镜像以分离模式运行容器,使容器在后台运行,-p标志将公共端口重定向到容器内的私有端口,运行你之前构建的镜像:
$ docker run -p 49160:8080 -d/node-web-app
打印应用程序的输出:
# Get container ID $ docker ps # Print app output $ docker logs# Example Running on http://localhost:8080
如果你需要进入容器内部,你可以使用exec命令:
# Enter the container $ docker exec -it测试/bin/bash
要测试你的应用程序,请获取Docker映射的应用端口:
$ docker ps # Example ID IMAGE COMMAND ... PORTS ecce33b30ebf/node-web-app:latest npm start ... 49160->8080
在上面的示例中,Docker将容器内部的8080端口映射到计算机上的端口49160。
现在,你可以使用curl调用你的应用程序(如果需要,请通过以下方式安装:sudo apt-get install curl):
$ curl -i localhost:49160 HTTP/1.1 200 OK X-Powered-By: Express Content-Type: text/html; charset=utf-8 Content-Length: 12 ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0" Date: Mon, 13 Nov 2017 20:53:59 GMT Connection: keep-alive Hello world
我们希望本教程可以帮助你在Docker上启动并运行一个简单的Node.js应用程序。
你可以在以下位置找到有关Docker和Node.js的更多信息:
官方Node.js Docker镜像
Node.js Docker最佳实践指南
官方Docker文档
Stack Overflow上的Docker标记
Docker Subreddit
上一篇:轻松分析Node.js应用程序 下一篇:迁移到安全的Buffer构造函数文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/99193.html
Node.js 指南 Node.js®是基于Chrome的V8 JavaScript引擎构建的JavaScript运行时。 常规 关于Node.js 入门指南 轻松分析Node.js应用程序 Docker化Node.js Web应用程序 迁移到安全的Buffer构造函数 Node.js核心概念 阻塞与非阻塞概述 Node.js事件循环、定时器和process.nextTick() 不要阻塞事...
摘要:编程书籍的整理和收集最近一直在学习深度学习和机器学习的东西,发现深入地去学习就需要不断的去提高自己算法和高数的能力然后也找了很多的书和文章,随着不断的学习,也整理了下自己的学习笔记准备分享出来给大家后续的文章和总结会继续分享,先分享一部分的 编程书籍的整理和收集 最近一直在学习deep learning深度学习和机器学习的东西,发现深入地去学习就需要不断的去提高自己算法和高数的能力然后...
阅读 2055·2021-11-11 16:55
阅读 1397·2021-09-28 09:36
阅读 1040·2019-08-29 15:21
阅读 1572·2019-08-29 14:10
阅读 2759·2019-08-29 14:08
阅读 1631·2019-08-29 12:31
阅读 3244·2019-08-29 12:31
阅读 978·2019-08-26 16:47