为什么你的 JavaScript 项目值得使用 Docker?
\n\n你是否曾听过这句话:“在我的机器上运行得好好的!”?如果你是一名 JavaScript 开发者,很可能遇到过这样的情况:应用程序在本地运行完美,但在服务器或同事的电脑上却因一个神秘的错误而崩溃。使用 Docker 容器化 JavaScript 应用程序可以一劳永逸地解决这个问题。
\n\nDocker 允许你将代码、所有依赖项(npm 包)、环境变量,甚至 Node.js 版本打包到一个轻量级的“容器”中。这个容器在你的笔记本电脑、AWS 服务器以及刚安装 Git 的新手电脑上都能以相同的方式运行。在本文中,我们将探讨如何让 JavaScript 和 Docker 协同工作,编写实际代码,并为你的下一个个人项目创建一个可用于生产环境的镜像。
\n\n面向 JavaScript 开发者的 Docker 基础
\n\n在深入代码之前,让我们先了解一些关键概念。Docker 就像一台虚拟机,但要轻量得多。它不会模拟整个操作系统,而是使用主机内核并仅隔离你的应用程序。
\n\nDockerfile —— 你应用程序的配方
\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
- 镜像 (Image) —— 是一个模板。你只需构建一次。 \n
- 容器 (Container) —— 是镜像的运行实例。你可以从一个镜像创建 10 个容器。 \n
从零开始创建 Node.js 应用程序并将其容器化
\n\n让我们编写一个简单的 Express 应用程序并将其打包到 Docker 中。这将是我们迈向 JavaScript 容器化 的第一步实践。
\n\n步骤 1:编写应用程序
\n\n创建一个名为 docker-node-app 的文件夹,并在其中创建文件 server.js:
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\nnpm init -y\nnpm install express\n\n现在我们有了一个可运行的应用程序。在本地启动它:node server.js。打开 http://localhost:3000 —— 你会看到 JSON 数据。
步骤 2:创建 Dockerfile
\n\n在项目根目录下创建一个名为 Dockerfile(无扩展名)的文件:
FROM node:18-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nEXPOSE 3000\nCMD ["node", "server.js"]\n\n添加 .dockerignore 文件,以避免将不必要的文件复制到镜像中:
node_modules\nnpm-debug.log\n.git\n.gitignore\n.env\nDockerfile\n\n步骤 3:构建并运行
\n\n在项目文件夹中打开终端并执行:
\n\ndocker build -t my-node-app .\ndocker run -p 3000:3000 my-node-app\n\n标志