Docker安装MySQL包含x86和arrch64架构

在这里插入图片描述

拉取镜像x86

docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/mysql:5.7.44

拉取镜像arm版本

docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_mysql:5.7.43
或者
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_mysql:8.4.5

创建目录

mkdir -p /data/mysql/conf
mkdir -p /data/mysql/data

运行容器

docker run -d \
  --name mysql-container \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=Y2Npnn8A82imQeX1 \
  -v /data/mysql/conf/my.cnf:/etc/my.cnf \
  -v /data/mysql/data:/var/lib/mysql \
  --privileged=true \
  --restart=always \
  registry.cn-hangzhou.aliyuncs.com/qiluo-images/mysql:5.7.44

查看容器状态:

docker ps

创建my.cnf如下

[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]
skip-host-cache
skip-name-resolve
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
explicit_defaults_for_timestamp = true
symbolic-links = 0
!includedir /etc/mysql/conf.d/

# Custom settings
lower_case_table_names = 1
wait_timeout = 2147483
interactive_timeout = 2147483
max_connections = 20000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 512
max_allowed_packet = 500M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 64M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
key_buffer_size = 512M
thread_cache_size = 32
query_cache_size = 128M
default-storage-engine = INNODB
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 4G
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 1G
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 32M
myisam_max_sort_file_size = 10G
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

详细说明

[client]
# 客户端连接使用的端口号
port = 3306
# Unix socket文件路径,用于本地连接
socket = /var/run/mysqld/mysqld.sock

[mysqld_safe]
# 进程ID文件存储路径
pid-file = /var/run/mysqld/mysqld.pid
# MySQL服务器socket文件路径
socket = /var/run/mysqld/mysqld.sock
# 进程优先级,0表示默认优先级
nice = 0

[mysqld]
# 跳过主机缓存,加速连接
skip-host-cache
# 跳过DNS反向解析,提高连接速度
skip-name-resolve
# MySQL服务运行的系统用户
user = mysql
# 进程ID文件路径
pid-file = /var/run/mysqld/mysqld.pid
# 服务器socket文件路径
socket = /var/run/mysqld/mysqld.sock
# 服务器监听端口
port = 3306
# MySQL安装基础目录
basedir = /usr
# 数据库数据文件存储目录
datadir = /var/lib/mysql
# 临时文件目录
tmpdir = /tmp
# 错误消息文件目录
lc-messages-dir = /usr/share/mysql
# 启用TIMESTAMP列的显式默认值处理
explicit_defaults_for_timestamp = true
# 禁用符号链接(安全考虑)
symbolic-links = 0
# 包含额外的配置文件目录
!includedir /etc/mysql/conf.d/

# Custom settings
# 表名存储为小写(1=小写,0=区分大小写)
lower_case_table_names = 1
# 非交互式连接超时时间(秒),约25天
wait_timeout = 2147483
# 交互式连接超时时间(秒),约25天
interactive_timeout = 2147483
# 最大并发连接数
max_connections = 20000
# 最大连接错误数,超过则阻塞主机
max_connect_errors = 6000
# 最大打开文件数
open_files_limit = 65535
# 表缓存大小
table_open_cache = 512
# 最大允许的数据包大小
max_allowed_packet = 500M
# 二进制日志缓存大小
binlog_cache_size = 1M
# 内存表最大大小
max_heap_table_size = 8M
# 临时表最大大小
tmp_table_size = 64M
# 顺序读取缓冲区大小
read_buffer_size = 2M
# 随机读取缓冲区大小
read_rnd_buffer_size = 8M
# 排序操作缓冲区大小
sort_buffer_size = 8M
# 表连接操作缓冲区大小
join_buffer_size = 8M
# MyISAM索引缓存大小
key_buffer_size = 512M
# 线程缓存大小
thread_cache_size = 32
# 查询缓存大小
query_cache_size = 128M
# 默认存储引擎
default-storage-engine = INNODB
# 每张InnoDB表使用独立的表空间文件
innodb_file_per_table = 1
# InnoDB最大打开文件数
innodb_open_files = 500
# InnoDB缓冲池大小(重要性能参数)
innodb_buffer_pool_size = 4G
# InnoDB写IO线程数
innodb_write_io_threads = 4
# InnoDB读IO线程数
innodb_read_io_threads = 4
# InnoDB线程并发数,0表示无限制
innodb_thread_concurrency = 0
# InnoDB清理线程数
innodb_purge_threads = 1
# 事务提交时日志刷新方式(2=每秒刷新,性能较好)
innodb_flush_log_at_trx_commit = 2
# InnoDB日志缓冲区大小
innodb_log_buffer_size = 2M
# InnoDB日志文件大小
innodb_log_file_size = 1G
# InnoDB日志文件组中的文件数量
innodb_log_files_in_group = 3
# InnoDB最大脏页百分比
innodb_max_dirty_pages_pct = 90
# InnoDB锁等待超时时间(秒)
innodb_lock_wait_timeout = 120
# 批量插入缓冲区大小
bulk_insert_buffer_size = 8M
# MyISAM排序缓冲区大小
myisam_sort_buffer_size = 32M
# MyISAM排序临时文件最大大小
myisam_max_sort_file_size = 10G
# SQL模式设置(严格模式,禁止不安全的操作)
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

二、登录 MySQL 并设置用户授权

  1. 进入 MySQL 容器
docker exec -it mysql-container bash
  1. 登录 MySQL
mysql -u root -p
输入密码:Y2Npnn8A82imQeX1

🎯 三、设置 root 用户远程访问权限

  1. 查看用户和主机
USE mysql;
SELECT host, user FROM user;
  1. 本地登录授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'Y2Npnn8A82imQeX1' WITH GRANT OPTION;
  1. 允许任何主机访问(远程授权)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Y2Npnn8A82imQeX1' WITH GRANT OPTION;
  1. 授权给特定主机(可选)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost.localdomain' IDENTIFIED BY 'Y2Npnn8A82imQeX1' WITH GRANT OPTION;

或只赋予部分权限:

GRANT SELECT,DELETE,UPDATE,CREATE,DROP ON *.* TO 'root'@'%' IDENTIFIED BY 'Y2Npnn8A82imQeX1';
  1. 刷新权限(必执行)
FLUSH PRIVILEGES;

(一)两大引擎强强联手

在 MySQL 8.2 中,主库默认使用 InnoDB 存储引擎,这是 MySQL 中最常用的存储引擎,支持事务、行级锁、外键等特性,适合处理写操作频繁的业务。而从库则可以使用 MyRocks 存储引擎,MyRocks 是基于 RocksDB 开发的存储引擎,在读取性能和压缩比方面表现出色,适合处理读操作频繁的业务。

InnoDB 就像是一个稳重的大哥,擅长处理各种复杂的写操作,保证数据的一致性和完整性;MyRocks 则像是一个灵活的小弟,在读取数据时速度飞快,能够轻松应对大量的读请求。两者联手,就像组成了一个超级战队,让数据库在读写分离方面有了质的飞跃。

(二)如何实现双引擎配置

说了这么多,大家一定想知道如何在 MySQL 8.2 中配置双引擎读写分离吧。其实,配置过程并不复杂,只需要在数据库的配置文件中进行一些简单的设置即可。

首先,需要确保 MySQL 8.2 版本已经正确安装,并且已经启用了 MyRocks 存储引擎。如果没有启用,可以通过以下命令启用:

INSTALL PLUGIN rocksdb SONAME 'librocksdb.so';

然后,在配置文件 my.cnf 中添加以下配置:

[mysqld]

slave_storage_engine=rocksdb

这样,从库就会使用 MyRocks 存储引擎,而主库仍然使用 InnoDB 存储引擎。需要注意的是,在配置双引擎之前,需要确保主从复制已经正确配置,并且主从库的数据已经同步完成

MySQL 容器部署脚本 (deploy_mysql.sh)

1. 部署前准备 创建数据目录(如果脚本未自动创建)

sudo mkdir -p /data/mysql/{conf,data,logs}
sudo chmod -R 750 /data/mysql
#!/bin/bash

# 配置区(部署前必改项)
CONTAINER_NAME="mysql-container"
MYSQL_PORT=3306
ROOT_PASSWORD="Y2Npnn8A82imQeX1"  # 生产环境建议使用密钥管理
DATA_DIR="/data/mysql"
IMAGE="registry.cn-hangzhou.aliyuncs.com/qiluo-images/mysql:5.7.44"

# 目录结构检查
check_dirs() {
  local required_dirs=(
    "$DATA_DIR/conf"
    "$DATA_DIR/data"
    "$DATA_DIR/logs"
  )

  for dir in "${required_dirs[@]}"; do
    if [ ! -d "$dir" ]; then
      echo "初始化目录: $dir"
      mkdir -p "$dir"
      chmod 750 "$dir"
    else
      echo "目录已存在: $dir"
    fi
  done

  # 初始化配置文件(如果不存在)
  if [ ! -f "$DATA_DIR/conf/my.cnf" ]; then
    echo "生成默认my.cnf..."
    cat > "$DATA_DIR/conf/my.cnf" <<EOF
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
max_connections=1000
innodb_buffer_pool_size=1G
log-error=/var/log/mysql/error.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=2

[client]
default-character-set=utf8mb4
EOF
  fi
}

# 安全合规检查
security_check() {
  # 检查是否使用默认密码
  if [ "$ROOT_PASSWORD" = "123456" ]; then
    echo "安全警报:禁止使用默认密码!"
    exit 1
  fi

  # 检查数据目录权限
  if [ "$(stat -c %a "$DATA_DIR/data")" != "750" ]; then
    chmod 750 "$DATA_DIR/data"
  fi
}

# 清理旧容器
cleanup_old() {
  if docker ps -a --filter "name=$CONTAINER_NAME" | grep -q "$CONTAINER_NAME"; then
    echo "移除旧容器..."
    docker rm -f "$CONTAINER_NAME" || { echo "容器移除失败"; exit 1; }
    # 防止文件锁冲突
    rm -f "$DATA_DIR/data/mysql.sock" 2>/dev/null
  fi
}

# 启动MySQL
start_mysql() {
  echo "启动MySQL容器..."
  docker run -d \
    --name "$CONTAINER_NAME" \
    --privileged=true \
    --restart=always \
    -p "$MYSQL_PORT:3306" \
    -v "$DATA_DIR/conf/my.cnf:/etc/my.cnf" \
    -v "$DATA_DIR/data:/var/lib/mysql" \
    -v "$DATA_DIR/logs:/var/log/mysql" \
    -e MYSQL_ROOT_PASSWORD="$ROOT_PASSWORD" \
    -e TZ=Asia/Shanghai \
    --health-cmd="mysqladmin ping -uroot -p$ROOT_PASSWORD" \
    --health-interval=10s \
    "$IMAGE"

  # 等待健康检查
  local timeout=30
  while ! docker inspect --format='{{.State.Health.Status}}' "$CONTAINER_NAME" | grep -q "healthy"; do
    if ((timeout-- == 0)); then
      echo "MySQL启动超时!错误日志:"
      docker logs "$CONTAINER_NAME" | tail -20
      exit 1
    fi
    sleep 2
  done
}

# 主流程
check_dirs
security_check
cleanup_old
start_mysql

# 输出部署信息
echo "--------------------------------------------------"
echo "MySQL 5.7 部署成功!"
echo "容器名称: $CONTAINER_NAME"
echo "连接信息:"
echo "  Host: $(hostname -I | awk '{print $1}')"
echo "  Port: $MYSQL_PORT"
echo "  User: root"
echo "  Password: $ROOT_PASSWORD"
echo "数据目录: $DATA_DIR/data"
echo "配置文件: $DATA_DIR/conf/my.cnf"
echo "日志目录: $DATA_DIR/logs"
echo "管理命令:"
echo "  docker exec -it $CONTAINER_NAME mysql -uroot -p$ROOT_PASSWORD"
echo "  docker logs -f $CONTAINER_NAME"
  1. 启动服务
chmod +x deploy_mysql.sh
./deploy_mysql.sh
  1. 关键路径说明
/data/mysql/conf	MySQL配置文件	/etc/my.cnf
/data/mysql/data	数据库文件(持久化存储)	/var/lib/mysql
/data/mysql/logs	错误日志和慢查询日志	/var/log/mysql
  1. 安全加固建议
    密码策略
# 进入MySQL执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY '更复杂密码';
SET GLOBAL validate_password_policy=STRONG;

禁用远程root登录

DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1');
FLUSH PRIVILEGES;

启用SSL(需配置证书)
5.# 在my.cnf添加:

[mysqld]
ssl-ca=/etc/mysql/ca.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
  1. 备份方案
    每日全量备份脚本 (mysql_backup.sh):
#!/bin/bash
docker exec $CONTAINER_NAME mysqldump -uroot -p"$ROOT_PASSWORD" --all-databases | gzip > /backup/mysql_$(date +%Y%m%d).sql.gz
find /backup -name "mysql_*.sql.gz" -mtime +7 -delete
  1. 性能调优参数
    在/data/mysql/conf/my.cnf中添加:
[mysqld]
innodb_buffer_pool_size = 2G           # 建议为物理内存的50-70%
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2     # 平衡性能与可靠性
  1. 故障排查命令
# 查看连接数
docker exec $CONTAINER_NAME mysqladmin -uroot -p$ROOT_PASSWORD status

# 检查锁等待
docker exec $CONTAINER_NAME mysql -uroot -p$ROOT_PASSWORD -e "SHOW ENGINE INNODB STATUS"

# 分析慢查询
cat /data/mysql/logs/mysql-slow.log | mysqldumpslow -s t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

❀͜͡傀儡师

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值