JavaScript 容器化:用于 Node.js 和前端的 Docker

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么你的 JavaScript 项目值得使用 Docker?

\n\n

你是否曾听过这句话:“在我的机器上运行得好好的!”?如果你是一名 JavaScript 开发者,很可能遇到过这样的情况:应用程序在本地运行完美,但在服务器或同事的电脑上却因一个神秘的错误而崩溃。使用 Docker 容器化 JavaScript 应用程序可以一劳永逸地解决这个问题。

\n\n

Docker 允许你将代码、所有依赖项(npm 包)、环境变量,甚至 Node.js 版本打包到一个轻量级的“容器”中。这个容器在你的笔记本电脑、AWS 服务器以及刚安装 Git 的新手电脑上都能以相同的方式运行。在本文中,我们将探讨如何让 JavaScript 和 Docker 协同工作,编写实际代码,并为你的下一个个人项目创建一个可用于生产环境的镜像。

\n\n

面向 JavaScript 开发者的 Docker 基础

\n\n

在深入代码之前,让我们先了解一些关键概念。Docker 就像一台虚拟机,但要轻量得多。它不会模拟整个操作系统,而是使用主机内核并仅隔离你的应用程序。

\n\n

Dockerfile —— 你应用程序的配方

\n\n

这是一个文本文件,你可以在其中描述如何构建镜像。对于 Node.js 应用程序,一个典型的 Dockerfile 如下所示:

\n\n
# 使用官方 Node.js 镜像\nFROM node:18-alpine\n\n# 在容器内设置工作目录\nWORKDIR /app\n\n# 复制 package.json 和 package-lock.json\nCOPY package*.json ./\n\n# 安装依赖项\nRUN npm ci --only=production\n\n# 复制源代码\nCOPY . .\n\n# 开放端口\nEXPOSE 3000\n\n# 启动命令\nCMD ["node", "server.js"]
\n\n

请注意:我们首先复制 package.json,然后再复制所有代码。这并非偶然。Docker 会缓存层,如果你没有更改依赖项,npm ci 步骤就不会在每次代码更改时重新运行。这大大加快了构建速度。

\n\n

镜像和容器

\n\n
    \n
  • 镜像 (Image) —— 是一个模板。你只需构建一次。
  • \n
  • 容器 (Container) —— 是镜像的运行实例。你可以从一个镜像创建 10 个容器。
  • \n
\n\n

从零开始创建 Node.js 应用程序并将其容器化

\n\n

让我们编写一个简单的 Express 应用程序并将其打包到 Docker 中。这将是我们迈向 JavaScript 容器化 的第一步实践。

\n\n

步骤 1:编写应用程序

\n\n

创建一个名为 docker-node-app 的文件夹,并在其中创建文件 server.js:

\n\n
const express = require('express');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/', (req, res) => {\n  res.json({ \n    message: '来自容器的问候!',\n    nodeVersion: process.version,\n    environment: process.env.NODE_ENV || 'development'\n  });\n});\n\napp.listen(PORT, () => {\n  console.log(`服务器在端口 ${PORT} 上启动`);\n});
\n\n

初始化 npm 并安装 express:

\n\n
npm init -y\nnpm install express
\n\n

现在我们有了一个可运行的应用程序。在本地启动它:node server.js。打开 http://localhost:3000 —— 你会看到 JSON 数据。

\n\n

步骤 2:创建 Dockerfile

\n\n

在项目根目录下创建一个名为 Dockerfile(无扩展名)的文件:

\n\n
FROM node:18-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nEXPOSE 3000\nCMD ["node", "server.js"]
\n\n

添加 .dockerignore 文件,以避免将不必要的文件复制到镜像中:

\n\n
node_modules\nnpm-debug.log\n.git\n.gitignore\n.env\nDockerfile
\n\n

步骤 3:构建并运行

\n\n

在项目文件夹中打开终端并执行:

\n\n
docker build -t my-node-app .\ndocker run -p 3000:3000 my-node-app
\n\n

标志

博客

书籍推荐