基于 Docker & K8s 的 MySQL 容器化部署与应用关联实践

技术栈:Docker、Kubernetes(k8s)、MySQL

一、项目基本信息

  • 项目名称:云原生 MySQL 容器化部署实战

  • 核心技术:Docker 镜像构建、K8s 资源编排、MySQL 数据库运维

  • 适用场景:云计算运维实习生简历项目、课程实训

二、基础环境检查命令

bash 复制代码
# 查看Docker版本,验证Docker安装成功
docker -v
# 查看K8s集群节点状态,确保集群正常运行
kubectl get nodes

三、Docker 镜像构建

3.1 MySQL 定制镜像 Dockerfile

bash 复制代码
# 基础镜像:基于官方MySQL 8.0镜像构建
FROM mysql:8.0
# 设置环境变量:MySQL root账号密码(容器启动自动配置)
ENV MYSQL_ROOT_PASSWORD=Root@123456
# 设置环境变量:系统字符集为UTF-8,防止中文乱码
ENV LANG=C.UTF-8

3.2 业务应用镜像 Dockerfile(用于连接 MySQL)

bash 复制代码
# 基础镜像:CentOS 7系统
FROM centos:7
# 执行命令:安装MySQL客户端,用于测试连接数据库
RUN yum install -y mysql
# 容器启动命令:让容器持续运行(sleep 36000秒=10小时)
CMD ["sleep", "36000"]

3.3 镜像构建命令

bash 复制代码
# 构建MySQL镜像,镜像名称:my-mysql,版本标签:v1
docker build -t my-mysql:v1 .
# 构建业务应用镜像,镜像名称:my-app,版本标签:v1
docker build -t my-app:v1 .

四、K8s 资源编排文件

4.1 创建命名空间(环境隔离)

mysql-ns.yaml

bash 复制代码
# API版本:K8s核心资源固定版本
apiVersion: v1
# 资源类型:命名空间
kind: Namespace
# 元数据:资源名称
metadata:
  # 命名空间名称:dev-db(开发环境数据库专用隔离空间)
  name: dev-db

4.2 MySQL 密码密钥配置(加密存储密码)

mysql-secret.yaml

bash 复制代码
apiVersion: v1
# 资源类型:密钥(用于存储敏感信息,如密码)
kind: Secret
metadata:
  # 密钥名称
  name: mysql-secret
  # 归属命名空间:dev-db
  namespace: dev-db
# 密钥类型:不透明类型(通用加密存储)
type: Opaque
data:
  # 密码数据:Root@123456 的Base64加密值(K8s Secret要求加密存储)
  password: Um9vdEAxMjM0NTY=

4.3 MySQL 有状态部署(核心配置)

mysql-sts.yaml

bash 复制代码
# API版本:应用工作负载版本
apiVersion: apps/v1
# 资源类型:有状态副本集(专门用于数据库等有状态服务)
kind: StatefulSet
metadata:
  # 名称:mysql
  name: mysql
  namespace: dev-db
spec:
  # 关联的Headless Service名称(固定写法)
  serviceName: mysql-svc
  # 副本数:1个MySQL实例
  replicas: 1
  # 标签选择器:匹配Pod标签
  selector:
    matchLabels:
      app: mysql
  # Pod模板:定义容器运行参数
  template:
    metadata:
      # Pod标签:与上面选择器对应
      labels:
        app: mysql
    spec:
      # 容器配置
      containers:
      # 容器名称
      - name: mysql
        # 使用的镜像:我们自己构建的MySQL镜像
        image: my-mysql:v1
        # 容器暴露端口:MySQL默认端口3306
        ports:
        - containerPort: 3306
        # 环境变量:从Secret中读取MySQL密码(不明文写密码)
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: password
        # 数据卷挂载:将持久化存储挂载到MySQL数据目录
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
  # 持久化存储申请模板:自动创建存储卷
  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      # 存储访问模式:单节点读写
      accessModes: ["ReadWriteOnce"]
      # 申请存储大小:5G
      resources:
        requests:
          storage: 5Gi

4.4 MySQL 服务暴露(内部访问)

mysql-svc.yaml

bash 复制代码
apiVersion: v1
# 资源类型:服务(K8s服务发现核心)
kind: Service
metadata:
  name: mysql-svc
  namespace: dev-db
spec:
  # Headless Service:无集群IP,用于有状态服务固定访问
  clusterIP: None
  # 选择器:关联MySQL Pod
  selector:
    app: mysql
  # 服务端口:映射容器3306端口
  ports:
  - port: 3306

4.5 业务应用部署

app-deploy.yaml

bash 复制代码
apiVersion: apps/v1
# 资源类型:无状态副本集(用于普通应用)
kind: Deployment
metadata:
  name: my-app
  namespace: dev-db
spec:
  # 应用副本数:2个
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        # 使用我们构建的业务应用镜像
        image: my-app:v1

五、一键部署命令

bash 复制代码
# 1. 创建命名空间
kubectl apply -f mysql-ns.yaml
# 2. 创建MySQL密码密钥
kubectl apply -f mysql-secret.yaml
# 3. 部署MySQL有状态服务
kubectl apply -f mysql-sts.yaml
# 4. 暴露MySQL服务
kubectl apply -f mysql-svc.yaml
# 5. 部署业务应用
kubectl apply -f app-deploy.yaml

# 查看所有资源状态(验证部署成功)
kubectl get all -n dev-db

六、数据库验证操作

6.1 进入 MySQL 容器创建测试数据

bash 复制代码
# 进入MySQL容器内部
kubectl exec -it -n dev-db mysql-0 -- bash
# 登录MySQL数据库(密码:Root@123456)
mysql -uroot -pRoot@123456

# 以下为MySQL命令
# 创建测试数据库
CREATE DATABASE testdb;
# 切换数据库
USE testdb;
# 创建测试表
CREATE TABLE user(id INT PRIMARY KEY, name VARCHAR(20));
# 插入测试数据
INSERT INTO user VALUES (1,'test');

6.2 业务容器测试连接 MySQL

bash 复制代码
# 进入业务应用容器
kubectl exec -it -n dev-db deploy/my-app -- bash
# 通过K8s Service域名连接MySQL,查询数据
mysql -hmysql-svc.dev-db.svc.cluster.local -uroot -pRoot@123456 -e "USE testdb; SELECT * FROM user;"

七、高可用故障恢复测试

bash 复制代码
# 手动删除MySQL Pod,测试K8s自动重建能力
kubectl delete pod mysql-0 -n dev-db
# 实时监控Pod重建状态(-w:持续监听)
kubectl get pods -n dev-db -w

# 重建完成后,验证数据不丢失
kubectl exec -it mysql-0 -n dev-db -- mysql -uroot -pRoot@123456 -e "SELECT * FROM testdb.user;"

八、日常运维命令

bash 复制代码
# 查看MySQL容器运行日志
kubectl logs -n dev-db mysql-0
# 扩容业务应用:将副本数从2改为3
kubectl scale deploy my-apa --replicas=3 -n dev-db
# 彻底删除整个项目(删除命名空间,所有资源一并删除)
kubectl delete ns dev-db
相关推荐
BullSmall2 小时前
Prometheus 可以监控docker 部署的Nginx 吗?
nginx·docker·prometheus
阿沁QWQ2 小时前
Docker 核心技术和实现原理
运维·docker·容器
刘~浪地球2 小时前
数据库与缓存--MySQL 高可用架构设计
数据库·mysql·缓存
Tom Ma.2 小时前
Docker 安装 OpenClaw
运维·docker·容器
运维老郭3 小时前
MySQL 主从延迟根因诊断法:从现象到本质的全链路排查指南
运维·mysql
LoneEon3 小时前
Kubernetes高可用集群部署教程
linux·docker·kubernetes
Wyawsl3 小时前
Python操作MySQL数据库
数据库·python·mysql
iuu_star3 小时前
Dify网址打不开-解决方案
docker
数厘3 小时前
2.3MySQL 表结构设计:提升 SQL 查询性能的关键
android·sql·mysql