用 Docker 部署你的第一个微服务

概述

了解了微服务、Docker、API 网关这些之后,如何用最简单的方式,部署一个真实的微服务?

操作步骤

  1. 写一个简单的 用户服务(User Service) ,提供 /api/users 接口
  2. Node.js + Express 实现(轻量、易懂)
  3. 打包成 Docker 镜像
  4. docker run 启动容器
  5. 通过浏览器或 curl 访问它

准备工作:安装 Docker

确保你已安装 Docker:

  • Windows / Mac:下载 Docker Desktop
  • Linux:运行 sudo apt install docker.io(Ubuntu)

验证安装:

bash 复制代码
docker --version

看到版本号(如 Docker version 24.0.7)就说明 OK!

如果是 Linux 用户,记得把当前用户加入 docker 组,避免每次加 sudo

bash 复制代码
sudo usermod -aG docker $USER && newgrp docker

步骤一:写一个微服务(5 行核心代码)

创建一个新文件夹,比如 user-service

bash 复制代码
mkdir user-service && cd user-service

创建 app.js

javascript 复制代码
// app.js
const express = require('express');
const app = express();

app.get('/api/users', (req, res) => {
  res.json([
    { id: 1, name: 'Alice' },
    { id: 2, name: 'Bob' }
  ]);
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`用户服务已启动,监听端口 ${PORT}`);
});

再创建 package.json(告诉 Node.js 这是个项目):

json 复制代码
{
  "name": "user-service",
  "version": "1.0.0",
  "main": "app.js",
  "dependencies": {
    "express": "^4.18.0"
  }
}

这个服务非常简单:访问 /api/users 就返回两个用户数据。

步骤二:写 Dockerfile

在同一个目录下,创建 Dockerfile(注意:文件名就是 Dockerfile,无后缀):

Dockerfile 复制代码
# 使用官方 Node.js 运行时作为基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 复制 package.json 并安装依赖(利用 Docker 缓存)
COPY package*.json ./
RUN npm ci --only=production

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["node", "app.js"]

这个文件告诉 Docker:

  • 用什么环境(Node.js 18)
  • 装什么依赖
  • 怎么启动服务

步骤三:构建 Docker 镜像

user-service 目录下运行:

bash 复制代码
docker build -t user-service .

第一次会慢一点(要下载基础镜像),后续会快很多,看到 Successfully built xxxxx 就说明镜像构建成功!

查看镜像:

bash 复制代码
docker images | grep user-service

步骤四:运行容器

启动容器,并把内部的 3000 端口映射到主机的 3000 端口:

bash 复制代码
docker run -d --name my-user-svc -p 3000:3000 user-service

参数说明:

  • -d:后台运行(detached)
  • --name:给容器起个名字
  • -p 3000:3000:主机端口:容器端口

检查是否运行:

bash 复制代码
docker ps

你应该能看到 my-user-svc 在运行中。

步骤五:访问你的微服务

打开浏览器,访问:

复制代码
http://localhost:3000/api/users

或者用命令行:

bash 复制代码
curl http://localhost:3000/api/users

你会看到:

json 复制代码
[
  {"id":1,"name":"Alice"},
  {"id":2,"name":"Bob"}
]

Bonus:查看日志 & 停止服务

查看日志(调试必备)

bash 复制代码
docker logs my-user-svc

输出:

复制代码
用户服务已启动,监听端口 3000

停止并删除容器

bash 复制代码
docker stop my-user-svc
docker rm my-user-svc

删除镜像(可选)

bash 复制代码
docker rmi user-service

后续其他操作

现在你有了一个独立服务,接下来可以:

  • Docker Compose 启动多个服务(如订单+用户)
  • 加一个 API 网关(如 Traefik)统一入口
  • 接入 配置中心 动态改端口
  • Prometheus 监控它

总结

步骤 命令/文件
1. 写服务代码 app.js + package.json
2. 写构建规则 Dockerfile
3. 构建镜像 docker build -t user-service .
4. 运行容器 docker run -p 3000:3000 user-service
5. 访问接口 curl http://localhost:3000/api/users

微服务的核心思想

每个功能独立部署、独立运行、通过 API 通信

而 Docker,正是实现这一目标的最佳工具。

相关推荐
面汤放盐4 小时前
软件架构指南 Software Architecture Guide
java·微服务·devops
水上冰石4 小时前
如何查看k8s按照的jenkins插件的路径
容器·kubernetes·jenkins
oMcLin4 小时前
如何在 CentOS 7.9 上配置并调优 Docker Swarm 集群,确保跨多个节点的高效服务发现与负载均衡?
docker·centos·服务发现
鱼跃鹰飞4 小时前
经典面试题:K8S的自动缩扩容和崩溃恢复
java·容器·kubernetes
江湖有缘4 小时前
Fenrus + Docker 实战:构建简洁高效的浏览器新标签页
运维·docker·容器
Zsr10234 小时前
K8s核心组件pod:进阶篇
云原生·容器·kubernetes·pod
mr_orange_klj4 小时前
k8s StorageClass和Provisoner的AI问答(豆包)
人工智能·容器·kubernetes
一条咸鱼_SaltyFish5 小时前
Spring Cloud Gateway鉴权空指针惊魂:HandlerMethod为null的深度排查
java·开发语言·人工智能·微服务·云原生·架构
唯情于酒15 小时前
Docker学习
学习·docker·容器