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 件事:
- 启动 Node 游戏服务器
- 启动 MySQL
- 启动 Redis
- 自动让它们互相连接
一个文件 = 整套游戏后台环境
四、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