数据库容器化最佳实践
数据库容器化需要权衡利弊,下面介绍最佳实践。
适用场景评估
适合容器化
- 开发/测试环境数据库
- 微服务架构的独立数据库
- 短期任务数据库(批处理、ETL)
- CI/CD 流水线中的临时数据库
不适合容器化
- 高并发核心业务数据库
- 需要极致 IO 性能的场景
- 大型数据仓库
- 需要物理隔离的合规场景
生产部署规范
1. 数据持久化
YAML
services:
mysql:
image: mysql:8.0
volumes:
- db-data:/var/lib/mysql # 必须持久化
deploy:
resources:
limits:
memory: 4G
cpus: '2'
数据必须存储在 Volume 中,不能存储在容器层。
2. 资源限制
YAML
deploy:
resources:
limits:
memory: 4G # 内存上限
cpus: '2' # CPU 上限
reservations:
memory: 2G # 内存预留
cpus: '1' # CPU 预留
3. 健康检查
YAML
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
4. 备份策略
Bash
# 定时备份
0 2 * * * docker exec mysql mysqldump -uroot -p123456 --all-databases > /backup/mysql-$(date +\%Y\%m\%d).sql
# 保留7天
find /backup -name "*.sql" -mtime +7 -delete
5. 监控告警
YAML
# 监控指标
- 连接数使用率 > 80%
- 缓冲命中率 < 95%
- 慢查询数量
- 磁盘使用率 > 80%
安全规范
网络隔离
YAML
# 仅允许应用网络访问
networks:
- backend # 不暴露到 frontend
密码管理
YAML
# 使用 Secret 管理密码
secrets:
- db_password
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
非 root 运行
dockerfile
# 使用非 root 用户
RUN groupadd -r mysql && useradd -r -g mysql mysql
USER mysql
性能优化
存储
- 使用本地 SSD 而非网络存储
- 配置 IO 调度器为 deadline
- 启用 HugePages(大内存页)
内存
- innodb-buffer-pool-size 设置为内存 50-70%
- 启用 NUMA 绑定
网络
- 使用 host 网络模式(减少 NAT 开销)
- 配置连接池(如 PgBouncer、ProxySQL)
运维流程
升级流程
- 备份数据库
- 在预发环境测试
- 滚动升级(先升级从节点)
- 验证数据一致性
- 切换流量
故障处理
- 自动重启(restart: unless-stopped)
- 健康检查失败告警
- 切换到从节点
- 恢复主节点数据
要点总结
- 开发测试环境适合容器化,高并发核心业务谨慎评估
- 数据必须持久化到 Volume,配置资源限制
- 健康检查、备份策略、监控告警是生产必备
- 网络隔离、Secret 管理、非 root 运行保证安全
- 本地 SSD、IO 调度器、HugePages 优化性能
📝 发现内容有误?点击此处直接编辑