1. Node.js部署概述:传统部署 vs 容器化部署,为什么选择Docker,课程目标与前置知识
1.1 从一次线上事故说起
我记得那是2018年的一个深夜。
生产环境的一台Node.js服务突然挂了。我登录上去一看,发现是另一个团队部署的Python脚本把系统自带的libuv库给覆盖了。Node.js底层依赖这个库做事件循环,结果整个服务直接崩溃。
你想想看,一个Node.js应用,明明代码没动过,换个环境就炸了。这种问题,说白了就是环境不一致导致的。
从那以后,我下定决心——所有Node.js服务必须容器化。
1.2 传统部署方式:你踩过哪些坑?
传统部署Node.js应用,流程大概是这样的:
- 买一台服务器(物理机或云主机)
- 手动安装Node.js、npm、PM2等工具
- 用git拉代码,或者用scp传压缩包
- 跑npm install安装依赖
- 用PM2启动应用
听起来很简单对吧?但实际运维中,问题一个接一个:
- 环境不一致:开发用macOS,测试用Ubuntu 18.04,生产用CentOS 7。同一个npm包,在不同系统上编译出来的二进制文件可能不一样。
- 依赖冲突:一台服务器上跑多个Node.js应用,有的需要Node 12,有的需要Node 16。你怎么办?用nvm切换?那PM2怎么管理?
- 扩容困难:流量上来了,想加一台服务器。你得重新走一遍部署流程,半小时起步。
- 回滚麻烦:新版本上线出问题了,想回滚到上一个版本。传统方式下,你得手动备份旧代码、停服务、替换文件、重启。操作步骤一多,就容易出错。
⚠️ 我曾经踩过的坑:有一次线上回滚,我忘了停掉PM2的cluster模式,结果旧版本和新版本的进程同时运行,端口冲突,服务直接502。那次事故让我意识到——手动操作永远不可靠。
1.3 容器化部署:Docker带来了什么?
Docker解决的核心问题就一个:「在我机器上能跑,在你机器上也能跑」。
容器化部署Node.js应用,流程变成了这样:
- 写一个Dockerfile,定义好Node.js版本、系统依赖、代码、启动命令
- 构建镜像,推送到镜像仓库
- 在任何有Docker的机器上,拉取镜像,启动容器
就这么简单。环境不一致的问题,从根本上被消灭了。
具体来说,Docker带来的好处有:
| 维度 | 传统部署 | 容器化部署 |
|---|---|---|
| 环境一致性 | 依赖手动配置,容易遗漏 | 镜像包含完整环境,开箱即用 |
| 部署速度 | 安装依赖耗时,尤其node_modules | 镜像构建一次,拉取即用 |
| 资源隔离 | 进程间互相影响 | 容器独立,互不干扰 |
| 扩容效率 | 手动配置,半小时起步 | 一条命令,秒级启动 |
| 回滚速度 | 手动操作,容易出错 | 切换镜像版本,秒级回滚 |
1.4 为什么选择Docker?而不是其他容器技术?
其实市面上容器技术不止Docker一个。比如rkt、containerd、Podman等等。但我个人习惯用Docker,原因有三:
- 生态最成熟:Docker Hub上有大量官方镜像,比如node:18-alpine,直接拿来用就行。社区文档、教程、工具链也是最丰富的。
- 学习成本低:Docker的命令设计很直观。docker run、docker build、docker push,看一眼就明白是干嘛的。团队新人上手也快。
- 与Kubernetes无缝衔接:现在大部分公司都在用K8s管理容器。而K8s的底层容器运行时,默认就是Docker(虽然现在有containerd,但Docker镜像格式依然是标准)。
💡 我的建议:如果你刚开始接触容器化,从Docker入手是最稳妥的选择。等你对容器原理有深入理解后,再去看Podman、containerd这些底层实现,会轻松很多。
1.5 课程目标:学完你能做什么?
这门课不是讲Docker基础操作的。那些东西网上教程一大堆。
这门课的目标是:让你能独立设计并维护一套生产级的Node.js容器化部署方案。
具体来说,学完后你能做到:
- 写出安全、高效、可复用的Dockerfile,而不是网上复制粘贴
- 用Docker Compose编排Node.js + 数据库 + 缓存的多服务架构
- 搭建CI/CD流水线,实现代码提交后自动构建、测试、部署
- 配置日志收集、监控告警、健康检查,让服务出问题时能第一时间发现
- 掌握镜像瘦身、多阶段构建、安全扫描等进阶技巧
1.6 前置知识:你需要会什么?
这门课不是零基础课程。你需要具备以下基础:
| 知识点 | 要求 | 说明 |
|---|---|---|
| Node.js基础 | 熟练 | 会写Express/Koa接口,了解npm、package.json |
| Linux基础 | 熟练 | 会基本的命令行操作,了解进程、端口、文件权限 |
| Docker基础 | 了解 | 知道docker run、docker build是干嘛的就行 |
| Git基础 | 了解 | 会git clone、git commit、git push |
如果你Docker完全没接触过,也不用担心。我在课程前几章会快速带大家过一遍Docker的核心概念和常用命令。但Node.js和Linux的基本操作,你得自己先补一补。
📌 一句话总结:传统部署就像搬家——你得自己打包、自己搬、自己拆。容器化部署就像住酒店——拎包入住,退房走人。而Docker,就是那个帮你把「家」打包成「行李箱」的工具。
好,第一章就到这里。下一章我们直接动手——写一个Node.js应用的Dockerfile,看看从代码到镜像,到底经历了什么。