前言
在真实项目中,很少只有一个服务。
一个典型 Web 项目通常包含:
- Node.js 应用
- MySQL 数据库
- Redis 缓存
- Nginx 网关
如果每个服务都手动安装,不仅维护复杂,而且环境迁移困难。
Docker Compose 的价值就在于:
用一个配置文件管理整个系统。
本文以 Node.js + MySQL + Redis 为例,介绍完整部署方案。
为什么推荐 Docker Compose
很多新手部署项目:
安装 Node
安装 MySQL
安装 Redis
修改配置
启动服务
时间久了容易出现:
- 环境不一致
- 依赖冲突
- 升级困难
Docker Compose 可以做到:
git clone
docker compose up -d
整个环境立即启动。
推荐目录结构
project
├── docker-compose.yml
├── .env
├── app
│ ├── package.json
│ ├── src
│ └── Dockerfile
└── mysql
建议:
应用代码独立。
数据库数据使用 volume 保存。
不要把数据放容器内部。
Node.js Dockerfile
推荐:
基础镜像
使用:
node:20-alpine
而不是:
latest
避免未来版本变化带来问题。
docker-compose.yml
一个典型结构:
services:
app:
mysql:
redis:
三者通过默认网络通信。
应用连接:
mysql:3306
redis:6379
不需要使用 localhost。
这是很多新手最容易犯的错误。
环境变量管理
不要把配置写死。
推荐:
.env
保存:
MYSQL_HOST=mysql
MYSQL_USER=root
REDIS_HOST=redis
不同环境只需要替换 env 文件即可。
数据持久化
数据库一定要挂载 volume。
否则:
docker compose down
之后数据可能丢失。
推荐:
volumes:
mysql_data:
生产环境不要省略。
容器启动顺序
很多人认为:
Compose 会保证:
mysql
↓
node
实际上:
容器启动成功 ≠ 服务可用。
Node 很可能在 MySQL 初始化完成前启动。
推荐:
应用启动时增加重试机制。
而不是依赖:
depends_on
日志管理
不要只依赖:
docker logs
建议:
应用内部接入:
- Winston
- Pino
统一输出日志。
未来接入:
ELK
Prometheus
Grafana
都会更加方便。
生产环境建议
不要:
所有服务放一台机器
推荐:
应用
↓
数据库
↓
缓存
分离部署。
数据库单独备份。
Redis 单独管理。
这样扩展能力更强。
Compose 适合哪些项目?
非常适合:
- Node.js
- Python
- WordPress
- AI 项目
- 中小型 SaaS
大型项目未来可以平滑迁移到:
Kubernetes。
总结
Docker Compose 最大价值不是部署。
而是:
标准化环境。
让开发、测试、生产保持一致。
对于独立开发者来说,这是成本最低、效率最高的方案之一。
X记录空间