在 Container 中运行 Basic Node.js 应用程序

我要讨论的示例假设你有一个适用于你的系统的 Docker 安装,并且基本了解如何使用 Node.js。如果你了解必须如何使用 Docker,那么很明显 Node.js 框架不需要安装在你的系统上,而是我们将使用来自 Docker 的 latest 版本的 node 映像。因此,如果需要,你可以使用命令 docker pull node 预先下载图像。 (该命令从 docker 自动 pulls 最新版本的 node 图像。)

  1. 继续创建一个所有工作应用程序文件所在的目录。在此目录中创建 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"
       }
     }
    
  2. 如果我们需要使用 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);
    
  3. 对于那些熟悉 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 图像 nodelatest 版本。

  • 在此图像中,我们继续创建一个包含所有必需文件的工作目录,并指示守护程序将此目录设置为我们的应用程序所需的工作目录。为此,我们补充说

      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" ] 
    
  1. 然后,我们在与 Dockerfile 相同的目录中创建一个 .dockerignore 文件,以防止我们的 Node.js 系统安装使用的 node_modules 和日志副本被复制到 Docker 镜像上。.dockerignore 文件必须包含以下内容:

     node_modules
     npm-debug.log
    
  2. 建立你的形象

导航到包含 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
  1. 运行图像

我们现在可以使用应用程序内容,node 基本图像和 Dockerfile 运行我们刚刚创建的图像。我们现在继续运行我们新创建的 <your username>/node-web-app 图像。将 -d 开关提供给 docker run 命令以分离模式运行容器,以便容器在后台运行。-p 标志将公共端口重定向到容器内的私有端口。使用此命令运行先前构建的映像:

$ docker run -p 49160:8080 -d <your username>/node-web-app
  1. 在终端上运行 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

  1. 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