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
相关推荐
时寒的笔记1 小时前
LF11期_day19~20 补环境(三)案例
爬虫·webpack·node.js
爱喝热水的呀哈喽1 小时前
npm 双网切换
前端·npm·node.js
Rain5091 小时前
mini-cc 权限安全:给 AI 戴上枷锁
前端·人工智能·安全·架构·node.js·ai编程
wyc是xxs1 小时前
用纯 Node.js 写了一个 JS 解释器 — kernel-js-lite
开发语言·javascript·npm·node.js
JP-Destiny1 小时前
docker-安装redis
java·redis·docker
文青小兵1 小时前
Linux云计算——docker 网络和部分挂载(二)
linux·docker·云计算
牟同學2 小时前
Hermes Agent Docker 离线部署完整指南
docker·容器·eureka·hermes
蜀道山老天师2 小时前
Docker安装配置全教程(含银河麒麟服务器部署+镜像加速)
运维·docker·容器
Tiffany_Ho2 小时前
Derek-Callan-business-english: 用现代前端技术打造高效商务英语学习平台
前端·typescript·node.js