在 Debian 上容器化部署 Node.js 的完整流程
一 准备与安装 Docker
- 更新系统并安装依赖
- sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
- 添加 Docker 官方 GPG 密钥与仓库(使用签名-by 方式)
- curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- echo “deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 安装并启动 Docker
- sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
- sudo systemctl enable --now docker
- sudo docker run --rm hello-world(验证安装)
- 可选:将当前用户加入 docker 组以避免每次使用 sudo
- sudo usermod -aG docker $USER(需重新登录生效)
二 准备示例应用
- 初始化项目
- mkdir -p ~/myapp && cd ~/myapp
- npm init -y
- npm install express
- 创建入口文件 index.js
- cat > index.js <<‘EOF’
const express = require(‘express’);
const app = express();
const port = process.env.PORT || 3000;
app.get(‘/’, (_, res) => res.send(‘Hello, Dockerized Express on Debian!’));
app.listen(port, () => console.log(
Server listening on ${port}));
EOF
三 编写 Dockerfile 与构建运行
- 选择基础镜像
- 体积优先:node:-alpine(基于 Alpine,体积小)
- 兼容优先:node:-slim 或 node:(基于 Debian,兼容性更好)
- 多阶段生产级 Dockerfile(示例)
-
cat > Dockerfile <<‘EOF’
---- 构建阶段 ----
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
---- 运行阶段 ----
FROM node:22-alpine
WORKDIR /home/node/app
创建非 root 用户并切换
RUN addgroup --system --gid 1001 nodejs &&
adduser --system --uid 1001 --gid 1001 --shell /bin/sh --disabled-password nodejs &&
chown -R nodejs:nodejs /home/node/app
USER nodejs
COPY --chown=nodejs:nodejs --from=builder /app/node_modules ./node_modules
COPY --chown=nodejs:nodejs . .
EXPOSE 3000
ENV NODE_ENV=production
CMD [“node”, “index.js”]
EOF
- 构建与运行
- docker build -t my-node-app:latest .
- docker run -d --name myapp -p 3000:3000 my-node-app:latest
- 验证:curl http://localhost:3000 或在浏览器访问
四 使用 Docker Compose 编排
- 单服务 docker-compose.yml
- cat > docker-compose.yml <<‘EOF’
version: “3.8”
services:
app:
build: .
image: my-node-app:latest
container_name: myapp
ports:
- “3000:3000”
environment:
- NODE_ENV=production
- PORT=3000
restart: unless-stopped
EOF
- 启动与管理
- docker compose up -d --build
- docker compose logs -f
- docker compose down
五 生产优化与安全要点
- 使用非 root 用户运行(如上例的 nodejs:1001),遵循最小权限原则
- 使用多阶段构建,仅将生产所需文件复制到最终镜像,减小体积并降低攻击面
- 依赖安装使用 npm ci 替代 npm install,确保版本一致性与可重复性
- 设置环境变量 NODE_ENV=production,启用框架生产模式(如 Express 性能优化)
- 选择合适的基础镜像:体积敏感选 alpine,依赖 glibc/原生模块较多选 slim 或 debian 变体
- 在 Compose 中配置 restart: unless-stopped,提升可用性;必要时增加健康检查与资源限制