在Docker中部署使用Node.js应用
这个例子的目标是向你展示如何将一个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 <first.last@example.com>",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.16.1"
}
}
用你的新package.json
文件,运行npm install
。如果您使用的是npm
版本5或更高版本,则会生成一个package-lock.json
将被复制到Docker映像的文件。
然后,server.js
使用Express.js框架创建一个定义Web应用程序的文件 :
'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\n');
});
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
在接下来的步骤中,我们将了解如何使用官方Docker镜像在Docker容器内运行此应用程序。首先,您需要构建应用程序的Docker镜像。
创建一个Dockerfile
创建一个名为的空文件Dockerfile
:
touch Dockerfile
Dockerfile
在你最喜欢的文本编辑器中打开
我们需要做的第一件事就是根据我们想要构建的图像来定义。在这里,我们将使用最新的LTS(长期支持)版本carbon
的node
从可用泊坞枢纽:
FROM node:carbon
接下来我们创建一个目录来保存图像中的应用程序代码,这将成为您的应用程序的工作目录:
# 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:carbon
# 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文件
.dockerignore
在Dockerfile
以下内容的同一目录中创建一个文件:
node_modules
npm-debug.log
这将阻止您的本地模块和调试日志被复制到您的Docker映像上,并可能覆盖映像中安装的模块。
建立你的形象
转到具有您的目录Dockerfile
并运行以下命令来构建Docker镜像。该-t
标志可让您标记图像,以便稍后使用该docker images
命令更容易找到:
$ docker build -t <your username>/node-web-app .
Docker会列出您的图片:
$ docker images
# Example
REPOSITORY TAG ID CREATED
node carbon 1934b0b038d1 5 days ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
运行图像
与运行图像-d
运行在分离模式的容器,留在后台运行的容器。该-p
标志将公共端口重定向到容器内的专用端口。运行您之前构建的图像:
$ docker run -p 49160:8080 -d <your username>/node-web-app
打印您的应用程序的输出:
# Get container ID
$ docker ps
# Print app output
$ docker logs <container id>
# Example
Running on http://localhost:8080
如果你需要进入容器,你可以使用下面的exec
命令:
# Enter the container
$ docker exec -it <container id> /bin/bash
测试
要测试您的应用,请获取Docker映射的应用的端口:
$ docker ps
# Example
ID IMAGE COMMAND ... PORTS
ecce33b30ebf <your username>/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的信息:
来源:CSDN
作者:G-god
链接:https://blog.csdn.net/wknhsj1/article/details/79811342