Skip to content

Docker - 设置 Node.js

Node.js 是一个流行的 JavaScript 运行时环境,用于构建服务器端应用程序。将 Node.js 应用程序 Docker 化可以实现开发、测试和部署环境的一致性。

我们将演示如何使用官方 Node.js Docker 镜像运行一个简单的 Node.js 脚本。

第一步:拉取官方 Node.js 镜像。使用特定版本标签是个好习惯,通常基于 Alpine 的镜像体积较小。

# 拉取基于 Alpine Linux 的 Node.js 18 版本
docker pull node:18-alpine

第二步:在当前目录创建一个名为 HelloWorld.js 的简单 Node.js 脚本文件。

HelloWorld.js
console.log('Hello World from Node.js inside Docker!');

第三步:使用 docker run 在 Node.js 容器内运行该脚本。

docker run --rm -it \
--name node-hello \
-v "${PWD}":/usr/src/app \
-w /usr/src/app \
node:18-alpine node HelloWorld.js

命令说明:

  • docker run: 启动新容器。
  • --rm: 容器退出时自动移除(适用于一次性任务)。
  • -it: 以交互模式并分配 TTY 运行(对于这个简单脚本并非严格必需,但这是常见做法)。
  • --name node-hello: 为容器指定名称。
  • -v "${PWD}":/usr/src/app: 将当前主机目录(Windows Cmd 上是 ${PWD} 或 %CD%)挂载到容器内的 /usr/src/app 目录。这使得容器能够访问 HelloWorld.js。
  • -w /usr/src/app: 设置容器内的工作目录为 /usr/src/app。node 命令将在此目录中查找脚本。
  • node:18-alpine: 指定要使用的 Docker 镜像。
  • node HelloWorld.js: 在容器内执行的命令(使用 HelloWorld.js 作为参数运行 node 可执行文件)。

输出:

Hello World from Node.js inside Docker!

这演示了通过挂载主机目录来运行脚本的方法。对于实际的应用开发,您通常会使用 Dockerfile 构建自定义镜像。

一个典型的 Node.js Web 应用 Dockerfile 可能看起来像这样:

# 使用官方 Node 运行时作为基础镜像(选择合适版本)
FROM node:18-alpine
# 设置容器内的工作目录
WORKDIR /usr/src/app
# 复制 package.json 和 package-lock.json(或 yarn.lock)
# 先复制这些文件可以利用 Docker 缓存,如果依赖项未改变
COPY package*.json ./
# 安装应用依赖
RUN npm ci --only=production # 如果不使用 package-lock.json,则使用 'npm install'
# 将应用源代码打包到 Docker 镜像内
COPY . .
# 使容器外部可访问端口 8080
EXPOSE 8080
# 使用 CMD 定义运行时命令来运行你的应用
CMD [ "node", "server.js" ]

此 Dockerfile 的关键步骤:

  • 从 Node 基础镜像开始。
  • 设置工作目录。
  • 复制 package.json 和 package-lock.json。
  • 使用 npm ci 只安装生产环境依赖(如果存在 package-lock.json,这比 npm install 更快、更可靠)。
  • 复制其余的应用代码。
  • 暴露应用程序监听的端口。
  • 设置启动应用程序的默认命令 (node server.js)。

您可以使用 docker build -t my-node-app . 构建此镜像,然后使用 docker run -p 8080:8080 my-node-app 运行它。记住也要使用 .dockerignore 文件来排除 node_modules、.git 等内容,防止它们被包含在构建上下文中。