一、为什么很多公司“生产 MySQL 不用 Docker”?
1️⃣ 数据库是“有状态服务”
MySQL 是典型的:
- 有状态(Stateful)
- 强依赖磁盘 IO
- 强依赖数据安全
而 Docker 天生是:
- 面向无状态应用(Stateless)
- 容器可随时销毁
数据库容器如果管理不好:
- 容器删了 → 数据丢
- volume 配置错 → 数据损坏
- 误操作 rm -rf volume → 直接爆炸 💥
所以很多公司更偏向:
- 物理机安装
- 或 VM 安装
2️⃣ 性能 & IO 问题
数据库最吃:
- 磁盘随机读写
- fsync
- 页缓存
- NUMA
- 内核调优
Docker 可能带来:
| 问题 | 说明 |
|---|---|
| overlay2 文件系统 | IO 有额外层 |
| cgroup 限制 | 内存 / CPU 限制 |
| 内核参数不可控 | 部分 sysctl 受限 |
对于高并发 OLTP:
- 金融
- 交易系统
- 电商核心订单库
很多企业更稳妥做法:
直接裸机 + tuned 内核优化
3️⃣ 运维复杂度
Docker MySQL 会涉及:
- 数据目录挂载
- 权限映射
- 时区
- 编码
- 日志目录
- binlog 挂载
- 主从复制端口暴露
对 DBA 来说:
yum install mysql-server
systemctl start mysqld
更简单直接。
二、那为什么很多人又用 Docker?
因为它在 这些场景非常爽:
✅ 场景 1:开发环境
docker run -d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
优点:
- 秒启动
- 多版本切换方便
- 不污染系统
- 团队统一环境
对于你这种做:
- SpringBoot
- RAG
- Milvus
- ClickHouse
- Kafka
Docker Compose 一起拉起来非常爽。
✅ 场景 2:CI / 自动化测试
单元测试:
- 每次启动一个 MySQL
- 测试完销毁
极其方便。
✅ 场景 3:中小项目
- 访问量低
- 非核心交易库
- 只做简单存储
完全 OK。
三、那企业级到底怎么选?
我们分三种级别:
🥉 小型项目
用 Docker 没问题。
🥈 中型公司
常见做法:
- MySQL 用 VM(不容器)
- 应用容器化
因为数据库更重。
🥇 大型互联网
一般是:
- 专用数据库物理机
- 自研数据库平台
- 或 Kubernetes StatefulSet + 专门存储
例如:
- 阿里
- 腾讯
- 字节
不会简单 docker run mysql 就完事。
四、K8s 不是也能跑 MySQL 吗?
可以,但要:
- StatefulSet
- PVC
- 专用存储
- 自动备份
- 主从自动恢复
不是简单容器,而是完整数据库平台。
五、什么时候“不要”用 Docker 部署 MySQL?
✔ 金融核心交易库
✔ 日均千万级写入
✔ 对延迟 < 5ms 极其敏感
✔ 需要 NUMA 优化
✔ 需要特殊 IO 调优
六、什么时候“强烈推荐”用 Docker?
✔ 本地开发
✔ 多版本测试
✔ 教学 / Demo
✔ 微服务 demo 环境
✔ CI/CD