在 Container 中运行 Basic Node.js 应用程序
我要讨论的示例假设你有一个适用于你的系统的 Docker 安装,并且基本了解如何使用 Node.js。如果你了解必须如何使用 Docker,那么很明显 Node.js 框架不需要安装在你的系统上,而是我们将使用来自 Docker 的 latest
版本的 node
映像。因此,如果需要,你可以使用命令 docker pull node
预先下载图像。 (该命令从 docker 自动 pulls
最新版本的 node
图像。)
-
继续创建一个所有工作应用程序文件所在的目录。在此目录中创建
package.json
文件,该文件描述你的应用程序以及依赖项。你的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.13.3" } }
-
如果我们需要使用 Node.js,我们通常会创建一个定义 Web 应用程序的
server
文件。在这种情况下,我们使用Express.js
框架(版本4.13.3
以上)。一个基本的server.js
文件看起来像这样:var express = require('express'); var PORT = 8080; var app = express(); app.get('/', function (req, res) { res.send('Hello world\n'); }); app.listen(PORT); console.log('Running on http://localhost:' + PORT);
-
对于那些熟悉 Docker 的人来说,你会遇到一个问题 12。
Dockerfile
是一个文本文件,其中包含构建为你的应用程序定制的自定义图像所需的所有命令。
在当前目录中创建名为 Dockerfile
的空文本文件。在 Windows 中创建一个的方法很简单。在 Linux 中,你可能希望在包含应用程序所需的所有文件的目录中执行 touch Dockerfile
。使用任何文本编辑器打开 Dockerfile 并添加以下行:
FROM node:latest
RUN mkdir -p /usr/src/my_first_app
WORKDIR /usr/src/my_first_app
COPY package.json /usr/src/my_first_app/
RUN npm install
COPY . /usr/src/my_first_app
EXPOSE 8080
-
FROM node:latest
指示 Docker 守护进程我们想要构建什么图像。在这种情况下,我们使用 Docker Hub 提供的官方 Docker 图像node
的latest
版本。 -
在此图像中,我们继续创建一个包含所有必需文件的工作目录,并指示守护程序将此目录设置为我们的应用程序所需的工作目录。为此,我们补充说
RUN mkdir -p /usr/src/my_first_app WORKDIR /usr/src/my_first_app
-
然后,我们首先将
package.json
文件(指定包含依赖项的应用程序信息)移动到图像中的/usr/src/my_first_app
工作目录,然后继续安装应用程序依赖项。我们这样做COPY package.json /usr/src/my_first_app/ RUN npm install
-
然后我们输入
COPY . /usr/src/my_first_app
将所有应用程序文件和源代码添加到映像中的工作目录中。 -
然后我们使用
EXPOSE
指令指示守护进程使得生成的容器的端口8080
可见(通过容器到主机的映射),因为应用程序绑定到端口8080
。 -
在最后一步中,我们通过执行基本的
npm start
命令指示守护进程在映像内运行命令node server.js
。我们使用CMD
指令,它将命令作为参数。CMD [ "npm", "start" ]
-
然后,我们在与
Dockerfile
相同的目录中创建一个.dockerignore
文件,以防止我们的 Node.js 系统安装使用的node_modules
和日志副本被复制到 Docker 镜像上。.dockerignore
文件必须包含以下内容:node_modules npm-debug.log
-
建立你的形象
导航到包含 Dockerfile
的目录,然后运行以下命令来构建 Docker 镜像。-t
标志允许你标记图像,以便以后使用 docker images 命令更容易找到:
$ docker build -t <your username>/node-web-app .
你的图像现在将由 Docker 列出。使用以下命令查看图像:
$ docker images
REPOSITORY TAG ID CREATED
node latest 539c0211cd76 10 minutes ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
-
运行图像
我们现在可以使用应用程序内容,node
基本图像和 Dockerfile
运行我们刚刚创建的图像。我们现在继续运行我们新创建的 <your username>/node-web-app
图像。将 -d
开关提供给 docker run
命令以分离模式运行容器,以便容器在后台运行。-p
标志将公共端口重定向到容器内的私有端口。使用此命令运行先前构建的映像:
$ docker run -p 49160:8080 -d <your username>/node-web-app
-
在终端上运行
docker ps
打印应用程序的输出。输出应该看起来像这样。CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b701693b294 <your username>/node-web-app "npm start" 20 minutes ago Up 48 seconds 0.0.0.0:49160->8080/tcp loving_goldstine
输入 docker logs <CONTAINER ID>
获取应用程序输出。在这种情况下,它是 docker logs 7b701693b294
。
输出:Running on http://localhost:8080
- 从
docker ps
输出,获得的端口映射是0.0.0.0:49160->8080/tcp
。因此,Docker 将容器内的8080
端口映射到主机上的端口 49160。在浏览器中,我们现在可以输入localhost:49160
。
我们也可以使用 curl
调用我们的应用程序:
$ curl -i localhost:49160
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
Date: Sun, 08 Jan 2017 14:00:12 GMT
Connection: keep-alive
Hello world