在 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 -v、npm -v
- 方式二:使用 NVM 管理多个 Node 版本(开发机常用)
- 安装:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
- 启用:source ~/.bashrc
- 安装与切换:nvm install 16、nvm use 16。
二 构建镜像与运行容器
- 示例项目结构
- 假设项目根目录包含:package.json、package-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.dev 与 docker-compose.dev.yml,挂载源码卷实现热更新:
- 示例 Compose 片段:
- web:
- build:
- context: .
- dockerfile: Dockerfile.dev
- volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
- environment:
- command: npm run dev(或 nodemon)
- 常用工具:nodemon 监听文件变化并自动重启,提升开发效率。
- 生产要点
- 使用 .dockerignore 忽略 node_modules、.git、日志与本地配置。
- 使用 npm ci 替代 npm install 以获得可重复构建;多阶段构建可进一步减小镜像体积。
- 使用 非 root 用户运行进程,设置最小权限与健康检查。
- 通过 restart=always 提升可用性,配合进程管理或编排(如 swarm/k8s)做高可用。