关键概念
Docker 和 Kubernetes(K8s)已成为现代应用部署的核心技术。通过容器化 MySQL,我们可以实现快速部署、环境隔离和弹性扩展。Docker 提供轻量级容器,而 K8s 则负责集群管理和自动化运维。
核心技巧
- 多阶段构建优化镜像大小
使用 Docker 多阶段构建减少最终镜像体积,仅保留运行时必需的组件。 - 持久化存储配置
通过 PV(Persistent Volume)和 PVC(Persistent Volume Claim)确保数据持久化。 - 资源限制与 QoS
设置 CPU 和内存限制,避免资源争抢。
应用场景
- 开发环境快速搭建
- 微服务架构中的数据库服务
- 高可用生产环境部署
详细代码案例分析
Dockerfile 多阶段构建示例
# 第一阶段:构建环境
FROM mysql:8.0 AS builder
COPY my.cnf /etc/mysql/conf.d/
RUN apt-get update && apt-get install -y --no-install-recommends \
percona-toolkit && rm -rf /var/lib/apt/lists/*
# 第二阶段:运行环境
FROM mysql:8.0
COPY --from=builder /usr/bin/pt-query-digest /usr/local/bin/
COPY init.sql /docker-entrypoint-initdb.d/
EXPOSE 3306
CMD ["mysqld"]
代码分析:
此 Dockerfile 采用多阶段构建,第一阶段安装工具并复制配置文件,第二阶段仅复制必要的二进制文件和初始化脚本。这种设计使最终镜像减少约 40% 体积,同时保留诊断工具。COPY --from=builder
指令确保跨阶段文件传输,而 docker-entrypoint-initdb.d
目录下的脚本会在容器首次启动时自动执行。
K8s StatefulSet 部署示例
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-cluster
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "2Gi"
cpu: "1000m"
volumeClaimTemplates:
- metadata:
name: mysql-storage
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
代码分析:
此 StatefulSet 配置实现了 MySQL 集群部署。volumeClaimTemplates
动态创建持久卷,确保每个 Pod 都有独立存储。资源限制通过 resources
字段精确控制,防止资源过载。环境变量通过 Secret 安全传递密码,避免硬编码。StatefulSet 的有序部署特性(Pod 名称如 mysql-0, mysql-1)特别适合需要稳定网络标识的数据库服务。
未来发展趋势
- Serverless 数据库:结合 K8s 的 Knative 等技术实现按需扩展
- 智能运维:集成 AI 进行自动故障诊断和性能调优
- 多云部署:跨云平台的统一数据库管理