温馨提示×

Ubuntu Nodejs与Docker如何结合使用

小樊
33
2025-12-06 06:07:30
栏目: 编程语言

在 Ubuntu 上把 Node.js 应用容器化,通常做法是准备应用代码与依赖、编写 Dockerfile、构建镜像并运行容器;多服务场景再配合 Docker Compose 管理。下面给出从零到部署的实操步骤与要点。

一 环境准备

  • 安装 Docker(Ubuntu)
    • 按官方指引安装后,执行验证:docker run hello-world,看到欢迎信息即表示安装成功。
  • 准备 Node.js
    • 方式一(推荐):使用 NodeSource 仓库安装指定版本(示例为 20.x
      • 命令:curl -sL https://deb.nodesource.com/setup_20.x | sudo -E bash -
      • 安装:sudo apt-get install -y nodejs
      • 验证:node -vnpm -v
    • 方式二:使用 NVM 管理多个 Node 版本(开发机常用)
      • 安装:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
      • 启用:source ~/.bashrc
      • 安装与切换:nvm install 16nvm use 16

二 构建镜像与运行容器

  • 示例项目结构
    • 假设项目根目录包含:package.jsonpackage-lock.json、源码(如 app.js),应用监听 3000 端口。
  • Dockerfile(生产就绪示例)
    • 使用官方 Node 镜像、分层复制依赖、设置非 root 用户、非缓存安装、健康检查和优雅停止。
    • 参考要点:
      • 基础镜像:FROM node:20
      • 工作目录:WORKDIR /usr/src/app
      • 复制依赖:COPY package.json ./*
      • 安装依赖(生产):RUN npm ci --only=production
      • 复制源码:COPY . .
      • 非 root 用户:RUN adduser --disabled-password --gecos ‘’ app && chown -R app:app /usr/src/app
      • 声明端口:EXPOSE 3000
      • 健康检查:HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 CMD curl -f http://localhost:3000/health || exit 1
      • 启动命令:CMD [“node”, “app.js”]
      • 如需更小镜像,可改用 node:20-alpine
  • 构建与运行
    • 构建:docker build -t my-node-app .
    • 运行(前台):docker run -p 4000:3000 my-node-app
    • 运行(后台、自动重启):docker run -d --restart=always --name my-running-app -p 3000:3000 my-node-app
    • 查看日志:docker logs -f my-running-app
    • 进入容器:docker exec -it my-running-app bash
    • 说明:-p 4000:3000 将宿主机 4000 端口映射到容器 3000 端口。

三 多服务与 Docker Compose

  • 示例 docker-compose.yml(Node + MongoDB)
    • 版本:version: ‘3’
    • 服务:
      • web:构建当前目录镜像,端口映射 3000:3000,依赖 db
      • db:image: mongo,数据卷 db-data:/data/db
    • 启动:docker-compose up -d;查看:docker-compose ps;日志:docker-compose logs -f web
    • 说明:Compose 适合本地开发、集成测试和小型部署,便于编排多容器依赖。

四 开发工作流与最佳实践

  • 开发模式建议
    • 使用 Dockerfile.devdocker-compose.dev.yml,挂载源码卷实现热更新:
      • 示例 Compose 片段:
        • web:
          • build:
            • context: .
            • dockerfile: Dockerfile.dev
          • volumes:
            • .:/usr/src/app
            • /usr/src/app/node_modules
          • environment:
            • NODE_ENV=development
          • command: npm run dev(或 nodemon)
    • 常用工具:nodemon 监听文件变化并自动重启,提升开发效率。
  • 生产要点
    • 使用 .dockerignore 忽略 node_modules.git、日志与本地配置。
    • 使用 npm ci 替代 npm install 以获得可重复构建;多阶段构建可进一步减小镜像体积。
    • 使用 非 root 用户运行进程,设置最小权限与健康检查。
    • 通过 restart=always 提升可用性,配合进程管理或编排(如 swarm/k8s)做高可用。

0