用Docker部署Node.js应用到香港VPS:镜像构建、环境变量与进程守护

Docker 部署 Node.js 的优势

直接在服务器上跑 Node.js 应用,面临的问题是:Node.js 版本冲突、依赖污染、进程管理复杂。用 Docker 部署可以彻底解决这些问题——每个应用运行在独立的容器中,Node.js 版本、依赖库完全隔离,进程守护也交给 Docker 的 restart 策略处理。


一、编写 Dockerfile

在你的 Node.js 项目根目录创建 Dockerfile:

nano Dockerfile
# 使用多阶段构建减小最终镜像体积

# 第一阶段:安装依赖
FROM node:20-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# 第二阶段:构建生产镜像
FROM node:20-alpine AS runner
WORKDIR /app

# 创建非 root 用户运行应用(安全最佳实践)
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

COPY --from=deps /app/node_modules ./node_modules
COPY . .

USER appuser

EXPOSE 3000

CMD ["node", "server.js"]

创建 .dockerignore 文件,排除不需要打包的文件:

node_modules
.git
.env
*.log
README.md

二、环境变量管理

生产环境的敏感配置(数据库密码、API Key 等)不能写在代码里,通过环境变量传入容器。

创建 .env 文件(不要提交到 Git):

NODE_ENV=production
PORT=3000
DATABASE_URL=mysql://user:password@mysql:3306/mydb
JWT_SECRET=your_jwt_secret_here
REDIS_URL=redis://redis:6379

用 docker compose 管理多容器应用时,在 docker-compose.yml 中引用环境变量文件:

version: '3.8'

services:
  app:
    build: .
    container_name: nodejs_app
    env_file:
      - .env
    ports:
      - "127.0.0.1:3000:3000"
    networks:
      - app_net
    restart: unless-stopped
    depends_on:
      - mysql

  mysql:
    image: mysql:8.0
    container_name: nodejs_mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: mydb
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - app_net
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app
    networks:
      - app_net
    restart: unless-stopped

networks:
  app_net:

volumes:
  mysql_data:

三、配置 Nginx 反向代理

nano nginx.conf
server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://app:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_cache_bypass $http_upgrade;
    }
}

四、构建并启动

# 构建镜像并启动所有服务
docker compose up -d --build

# 查看应用日志
docker compose logs -f app

# 查看容器状态
docker compose ps

五、更新部署流程

# 拉取最新代码(如果使用 Git)
git pull

# 重新构建并重启(零停机滚动更新)
docker compose up -d --build app

# 清理旧镜像
docker image prune -f

总结

Docker 部署 Node.js 应用的核心步骤:编写 Dockerfile 打包应用 → 通过 .env 文件管理环境变量 → 用 docker compose 编排多容器 → Nginx 做反向代理。一旦配置完成,后续更新只需重新 build 容器,整个流程标准化、可重复。

IDC.Net 香港云服务器支持 Ubuntu 22.04,Docker 安装开箱即用,首月 10 元起,CN2 GIA 直连大陆,支付宝付款即可开通。

THE END