2. 环境搭建:Node.js版本管理(nvm)、Docker与Docker Compose安装、Kubernetes(minikube)本地集群搭建

好,咱们正式开始动手了。这一章说白了就是「磨刀」——把开发环境搭好,后面写代码才不卡壳。我见过太多同学在环境上折腾一整天,结果还没开始写代码就心态崩了。别急,跟着我的节奏来,半小时搞定。

2.1 Node.js 版本管理:为什么非用 nvm 不可?

你想想看,微服务项目往往不止一个。有的服务跑在 Node 14,有的已经升级到 Node 18 甚至 20。如果全局只装一个版本,切换项目时就会遇到各种兼容性问题。我在项目中就吃过这个亏——一个老项目死活装不上依赖,最后发现是 Node 版本太高了。

nvm(Node Version Manager)就是来解决这个痛点的。它让你能在同一台机器上安装、切换多个 Node 版本,互不干扰。

安装 nvm

macOS 或 Linux 用户,打开终端执行:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

Windows 用户我建议用 nvm-windows,去 GitHub 下载安装包就行。我个人习惯用 macOS,所以后面的命令都以 Unix 系为例。

安装完成后,重启终端或执行:

source ~/.bashrc

验证一下:

nvm --version

看到版本号就说明装好了。

常用命令速查

命令 说明
nvm ls 查看已安装的 Node 版本
nvm ls-remote 列出所有可安装的版本
nvm install 18.17.0 安装指定版本
nvm use 18.17.0 切换当前会话的 Node 版本
nvm alias default 18.17.0 设置默认版本
我的小技巧: 每个项目根目录放一个 .nvmrc 文件,里面只写版本号,比如 18.17.0。这样进入项目时执行 nvm use,它会自动读取并切换。团队协作时特别有用。

2.2 Docker 与 Docker Compose:容器化是微服务的基础

微服务为什么离不开 Docker?说白了,每个服务都有自己的依赖环境。没有 Docker 之前,你部署一个服务要手动装各种包,还要担心跟别的服务冲突。Docker 把每个服务连同它的环境打包成一个「集装箱」,到哪都能跑。

安装 Docker Desktop

Docker 官网 下载对应系统的安装包。macOS 和 Windows 都有图形化安装器,一路下一步就行。Linux 用户用包管理器:

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

安装完验证:

docker --version
docker compose version
注意: 我曾经遇到过 Docker Desktop 启动后一直转圈,最后发现是 WSL 2 没更新。Windows 用户记得先装 WSL 2,再装 Docker Desktop,顺序别搞反了。

Docker Compose 的作用

一个微服务系统通常有多个容器:数据库、消息队列、服务 A、服务 B……手动一个个启动太累了。Docker Compose 让你用一个 docker-compose.yml 文件定义所有服务,一条命令全部启动。

举个简单的例子,咱们后面会用到:

version: '3.8'
services:
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
  postgres:
    image: postgres:15
    environment:
      POSTGRES_DB: microservices
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"

保存为 docker-compose.yml,然后执行:

docker compose up -d

两个服务就同时跑起来了。是不是很方便?

2.3 Kubernetes 本地集群:用 minikube 快速上手

Kubernetes(简称 K8s)是容器编排的事实标准。但说实话,在生产环境搭一个 K8s 集群挺复杂的。本地开发时,我们不需要那么大的阵仗,minikube 就是最好的选择——它能在你的笔记本上跑一个单节点的 K8s 集群。

安装 minikube

macOS 用户:

brew install minikube

Linux 用户:

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

Windows 用户可以用 Chocolatey 安装:

choco install minikube

启动集群

minikube start --driver=docker

这里指定用 Docker 作为驱动,因为咱们已经装好了 Docker。minikube 会在 Docker 里创建一个虚拟机,然后在里面跑 K8s 组件。

启动后验证:

kubectl get nodes

看到 Ready 状态就说明集群跑起来了。

核心概念速览:
  • Pod: K8s 里最小的部署单元,一个 Pod 可以包含一个或多个容器
  • Service: 给 Pod 提供稳定的网络入口,因为 Pod 的 IP 是会变的
  • Deployment: 管理 Pod 的副本数、滚动更新等
  • ConfigMap / Secret: 管理配置和敏感信息

常用 kubectl 命令

命令 说明
kubectl get pods 查看所有 Pod
kubectl get services 查看所有 Service
kubectl apply -f file.yml 应用一个 YAML 配置文件
kubectl logs pod-name 查看 Pod 的日志
kubectl describe pod pod-name 查看 Pod 的详细信息
避坑指南: 我曾经在 minikube 里部署服务后,发现外部访问不了。后来才意识到,minikube 默认是在虚拟机里跑的,需要用 minikube service 服务名 来暴露端口。或者用 kubectl port-forward 做端口转发。

2.4 验证环境:跑一个 Hello World

环境搭好了,咱们跑个简单的 Node.js 服务验证一下。创建一个 app.js

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello from Microservices!\n');
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

本地跑一下:

node app.js

浏览器访问 http://localhost:3000,看到「Hello from Microservices!」就说明 Node.js 环境没问题。

然后把它容器化。创建 Dockerfile

FROM node:18-alpine
WORKDIR /app
COPY app.js .
EXPOSE 3000
CMD ["node", "app.js"]

构建镜像并运行:

docker build -t hello-microservice .
docker run -p 3000:3000 hello-microservice

同样能访问到。最后部署到 minikube:

kubectl create deployment hello --image=hello-microservice
kubectl expose deployment hello --type=NodePort --port=3000
minikube service hello

浏览器会自动打开,看到同样的输出。嗯,到这里,咱们的开发环境就全部就绪了。

总结一下这一章的核心:
  • nvm 解决多版本 Node 切换问题,每个项目用 .nvmrc 锁定版本
  • Docker 让服务环境一致,Docker Compose 一键启动多服务
  • minikube 提供本地 K8s 集群,适合开发和测试
  • 三个工具配合使用,就是微服务开发的「三驾马车」

下一章咱们开始写第一个微服务,到时候这些环境就派上用场了。有什么问题欢迎随时交流。