Docker部署MySQL 8完整指南:从安装到高可用配置

Docker离线安装MySQL 8

1. 环境准备

在无网络环境中部署MySQL容器,需提前获取镜像文件并传输到目标机器:

# 在联网机器下载镜像
docker pull mysql:8.0.36

# 保存镜像为离线包
docker save -o mysql8.tar mysql:8.0.36

# 传输文件到离线环境后加载镜像
docker load -i mysql8.tar

2. 容器启动参数配置

docker run -d \
  --name mysql8-server \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=your_secure_password \
  -v /custom/mysql/conf:/etc/mysql/conf.d \
  -v /custom/mysql/data:/var/lib/mysql \
  --restart=unless-stopped \
  mysql:8.0.36 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci \
  --default-time-zone=+8:00

3. 关键参数解析

  • 网络映射:-p 3306:3306 绑定宿主机端口
  • 持久化存储:-v参数挂载配置目录和数据目录
  • 字符集配置:强制使用utf8mb4字符集
  • 时区设置:--default-time-zone配置东八区

Docker在线安装MySQL 8

1. 标准安装流程

# 拉取官方镜像
docker pull mysql:8.0.36

# 启动基础容器
docker run -d \
  --name mysql8 \
  -e MYSQL_ROOT_PASSWORD=securepass123 \
  -p 3307:3306 \
  mysql:8.0.36

2. 验证容器状态

docker ps -a --filter name=mysql8
docker logs mysql8 --tail 50

MySQL镜像管理

1. 镜像版本选择策略

# 查看可用版本
docker search mysql --filter "is-official=true"

# 指定精确版本
docker pull mysql:8.0.36

2. 镜像安全扫描

docker scan mysql:8.0.36

MySQL容器化配置

1. 配置文件挂载

创建自定义配置文件:

# my-custom.cnf
[mysqld]
max_connections=500
innodb_buffer_pool_size=1G
query_cache_type=1
slow_query_log=1

启动时挂载配置:

docker run -d \
  -v /path/to/custom.conf:/etc/mysql/conf.d/custom.cnf \
  mysql:8.0.36

2. 安全加固配置

# 启动时设置密码策略
docker run -d \
  -e MYSQL_SECURE=1 \
  -e validate_password.policy=STRONG \
  mysql:8.0.36

MySQL容器操作命令

1. 容器生命周期管理

# 启动/停止
docker start mysql8
docker stop mysql8

# 配置更新后重启
docker restart mysql8

2. 进入容器操作

docker exec -it mysql8 mysql -uroot -p

MySQL数据库管理

1. 用户权限管理

-- 创建业务用户
CREATE USER 'app_user'@'%' IDENTIFIED BY 'ComplexP@ssw0rd!';

-- 权限分配
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'%';

-- 权限刷新
FLUSH PRIVILEGES;

-- 查看用户权限
SHOW GRANTS FOR 'app_user'@'%';

2. 数据库维护操作

-- 创建测试数据库
CREATE DATABASE test_db 
  CHARACTER SET utf8mb4 
  COLLATE utf8mb4_unicode_ci;

-- 定时任务启用
SET GLOBAL event_scheduler = ON;

-- 性能监控
SHOW ENGINE INNODB STATUS;

镜像私有仓库管理

1. 推送到私有仓库

# 标记镜像
docker tag mysql:8.0.36 private-registry:5000/mysql:8.0.36

# 推送镜像
docker push private-registry:5000/mysql:8.0.36

2. 从私有仓库部署

docker pull private-registry:5000/mysql:8.0.36

docker run -d \
  --name corp-mysql \
  -p 3308:3306 \
  private-registry:5000/mysql:8.0.36

数据持久化方案

1. 卷管理最佳实践

# 创建专用数据卷
docker volume create mysql_data

# 启动时挂载
docker run -d \
  -v mysql_data:/var/lib/mysql \
  mysql:8.0.36

# 查看卷信息
docker volume inspect mysql_data

2. 备份恢复策略

# 执行在线备份
docker exec mysql8 mysqldump -u root -p --all-databases > full_backup.sql

# 数据恢复操作
docker exec -i mysql8 mysql -u root -p < full_backup.sql

故障排查指南

1. 日志分析技巧

# 实时查看日志
docker logs mysql8 --follow

# 过滤错误信息
docker logs mysql8 | grep -i error

2. 常见问题解决

-- 密码重置步骤
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

-- 连接数调整
SET GLOBAL max_connections = 1000;

性能优化配置

1. 内存参数调整

# my.cnf优化配置
[mysqld]
innodb_buffer_pool_size=4G
innodb_log_file_size=1G
thread_cache_size=64
table_open_cache=4000

2. 查询优化设置

-- 慢查询配置
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

-- 索引分析
EXPLAIN ANALYZE SELECT * FROM large_table WHERE created_at > '2023-01-01';

安全防护措施

1. 网络层防护

# 限制容器网络访问
docker network create --subnet=172.20.0.0/24 mysql-net

docker run -d \
  --network mysql-net \
  --ip 172.20.0.100 \
  mysql:8.0.36

2. 数据库审计配置

# 审计日志配置
[mysqld]
audit_log=FORCE_PLUS_PERMANENT
audit_log_format=JSON
audit_log_policy=ALL

容器编排集成

1. Docker Compose部署

version: '3.8'

services:
  mysql:
    image: mysql:8.0.36
    environment:
      MYSQL_ROOT_PASSWORD: securepass123
      MYSQL_DATABASE: app_db
      MYSQL_USER: app_user
      MYSQL_PASSWORD: userpass123
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - backend

volumes:
  mysql_data:

networks:
  backend:
    driver: bridge

2. Kubernetes部署示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0.36
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: root-password
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

正文到此结束
评论插件初始化中...
Loading...