Nest.js基础-5:关于Docker的简单概述

Docker这个东西,如果做后端必须了解,因为非常好用。

这里用Node.js 游戏服务器 + Redis + MySQL 一个简单项目例子,简单说明一下Docker 和 Docker Compose

假设一个项目场景

我们要做一个小游戏服务器

  • Node.js:游戏逻辑(登录、打怪、匹配)
  • MySQL:存玩家账号、背包数据
  • Redis:存在线玩家、排行榜、临时数据

这三个东西:

  • 不装 Docker:要自己装 Node、MySQL、Redis,配环境变量,egg疼的一批
  • 用 Docker:3 个独立容器,一键启动、环境统一是docker环境

一、Docker 到底在干什么?(用游戏服务器举例)

1. 镜像(Image)= 游戏 "安装包"

比如:

  • node:18 = 带 Node 环境的安装包
  • mysql:8 = 带 MySQL 数据库的安装包
  • redis:7 = 带 Redis 缓存的安装包

镜像 = 只读、可分发、一次打包到处用

2. 容器(Container)= 运行起来的 "游戏服务"

  • 一个容器 = 一个独立运行的服务
  • 游戏服务器容器
  • MySQL 容器
  • Redis 容器

互相隔离,但能互相通信

3. Docker 作用

让你不用在电脑上装任何环境,直接跑整套项目。但是如果用docker原始命令跑,单独运行其实也麻烦,所以出现了compose


二、用 Docker 单独运行游戏服务器

看下原始 docker 命令有多麻烦:

1. 运行 MySQL

bash

运行

复制代码
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:8

2. 运行 Redis

bash

运行

复制代码
docker run -d -p 6379:6379 --name redis redis:7

3. 运行自己的 Node 游戏服务器

bash

运行

复制代码
docker run -d -p 3000:3000 --name game-server game-server-image

问题来了

你要记 3 条命令,还要配端口、环境变量、网络、依赖顺序...... 然后Docker Compose 出现的原因!


三、Docker Compose 是什么?

一句话: 把上面 3 条命令写成一个配置文件,一条命令全部启动!

它做 4 件事:

  1. 启动 Node 游戏服务器
  2. 启动 MySQL
  3. 启动 Redis
  4. 自动让它们互相连接

一个文件 = 整套游戏后台环境


四、Docker + Docker Compose

1. 项目结构

plaintext

复制代码
game-server/
 ├── app.js         # 游戏服务器代码
 ├── Dockerfile     # 构建游戏服务器镜像
 └── docker-compose.yml  # 一键启动 3 个服务

这里省略了package.json,nodemoudle等文件夹


2. 写游戏服务器(app.js)

js

复制代码
const express = require('express');
const redis = require('redis');
const mysql = require('mysql2/promise');

const app = express();
app.use(express.json());

// 连接 Redis(容器名直接当域名!)
const redisClient = redis.createClient({
  url: 'redis://redis:6379'
});
redisClient.connect();

// 连接 MySQL
const db = mysql.createPool({
  host: 'mysql',
  user: 'root',
  password: '123456',
  database: 'game'
});

// 玩家登录
app.post('/login', async (req, res) => {
  const { username } = req.body;
  await redisClient.set(`player:${username}`, 'online');
  res.json({ msg: '登录成功' });
});

// 获取在线状态
app.get('/status/:user', async (req, res) => {
  const status = await redisClient.get(`player:${req.params.user}`);
  res.json({ status });
});

app.listen(3000, () => {
  console.log('游戏服务器已启动: 3000端口');
});

3. 写 Dockerfile(打包游戏服务器)

dockerfile

复制代码
FROM node:18

WORKDIR /app

COPY package.json .
RUN npm install express redis mysql2

COPY . .

CMD ["node", "app.js"]

作用:把代码打包成 Docker 镜像


4. 写 docker-compose.yml(组合镜像)

yaml

复制代码
version: '3'

services:
  # 1. 游戏服务器
  game-server:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - mysql
      - redis

  # 2. 数据库
  mysql:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: game
    volumes:
      - mysql-data:/var/lib/mysql

  # 3. 缓存
  redis:
    image: redis:7
    volumes:
      - redis-data:/data

volumes:
  mysql-data:
  redis-data:

这里mysql和redis因为没有其他的要求,所以直接使用镜像


五、一条命令启动游戏后台!

进入项目目录,执行:

bash

运行

复制代码
docker compose up -d

启动成功后:

  • 游戏服务器:localhost:3000
  • MySQL:localhost:3306
  • Redis:localhost:6379

六、如果换电脑

复制这 4 个文件

plaintext

复制代码
game-server/
 ├── app.js         → 你的游戏代码
 ├── package.json   → 依赖清单
 ├── Dockerfile     → 打包脚本
 └── docker-compose.yml  → 一键启动 3 个容器

复制到另一台电脑后

bash

运行

复制代码
docker compose up -d

✅ 自动安装 Node ✅ 自动安装 MySQL ✅ 自动安装 Redis ✅ 自动下载依赖 ✅ 自动启动全部服务

环境安装完成

六、总结

1. Docker 是什么?

把你的应用打包成独立环境,不污染电脑。

2. Docker Compose 是什么?

管理多个 Docker 容器的工具。 一个文件管理:游戏服务器 + MySQL + Redis

3. 容器之间怎么通信?

直接用服务名当域名!

  • game-server 访问 mysql:host: mysql
  • game-server 访问 redis:host: redis

Docker 自动做了内网!

4. 数据不会丢吗?

volumes 实现数据持久化:

  • 删除容器,数据还在
  • 重启容器,数据恢复

七、附常用命令

bash

运行

复制代码
# 启动所有服务
docker compose up -d

# 停止服务
docker compose stop

# 重启服务
docker compose restart

# 查看日志(看游戏服务器输出)
docker compose logs -f game-server

# 关闭并删除容器(数据不删)
docker compose down
相关推荐
极客先躯9 分钟前
高级java每日一道面试题-2026年05月11日-实战篇[Docker]-如何容器化金融产品推荐系统?
java·运维·docker·容器·金融·高级面试·金融产品推荐系统
江湖有缘2 小时前
Docker实战 : 使用Docker部署Musicn音乐下载工具
docker·容器·eureka
TunerT_TQ2 小时前
GitHub深度工程评测:Cline 源码级工程评测|65k Star 开源AI编程助手的工程全景
typescript·开源·github·vs code·ai编程助手·开源供应链安全·静态源码审计
沉迷学习 日益消瘦2 小时前
17-Custom Resource 入门
docker·容器·kubernetes
江湖有缘14 小时前
Docker实战 :使用Docker部署OneTerm堡垒机
运维·docker·容器
陳陈陳18 小时前
🚀 前端流式输出革命:SSE + BFF 架构从零到一实战指南
vue.js·架构·node.js
Kevin Wang72718 小时前
Nvidia-AGX-spark部署手册——课堂质量诊断(jetpack:r36)
python·docker·容器
Revolution6119 小时前
第一次运行 Node.js:终端里的 JavaScript 怎样执行
后端·面试·node.js
半句唐诗19 小时前
我是如何通过 Access Token 成功发布第一个 npm 包的
前端·npm·node.js
贩卖黄昏的熊20 小时前
NestJS简明教程——安全
开发语言·javascript·安全·typescript·nest.js