引言

随着ARM64架构服务器的普及,在这类设备上部署MySQL数据库成为越来越多开发者和运维人员的需求。Docker作为轻量级容器化技术,为跨平台部署提供了便利,但在ARM64架构下部署MySQL仍存在一些特殊考量,如镜像选择、架构适配和离线环境部署等问题。本文将详细介绍在ARM64架构服务器上使用Docker部署MySQL 8的完整流程,包括Docker离线安装、MySQL镜像处理、容器配置、数据备份恢复及跨平台部署技巧,帮助读者在各类环境中高效部署和管理MySQL容器。

一、环境准备与架构说明

1.1 ARM64与AMD64架构对比

架构 指令集 代表设备 MySQL镜像选择
AMD64 x86-64 普通PC、服务器 mysql:8.0
ARM64 AArch64 树莓派、鲲鹏服务器、M1/M2 Mac mysql:8.0或arm64v8/mysql:8.0

注意:ARM64架构也称为AArch64,选择镜像时需确保镜像支持ARM64架构,避免出现"exec format error"错误。

1.2 环境要求

  • 硬件:ARM64架构服务器(如华为鲲鹏、AWS Graviton、树莓派4等)
  • 操作系统:Linux(推荐Ubuntu 20.04+或CentOS 8+)
  • Docker:20.10+(需支持ARM64架构)
  • 网络:至少一台可联网服务器(用于下载Docker和MySQL镜像)

1.3 架构确认

在部署前,确认服务器架构:

# 查看CPU架构
uname -m  # ARM64架构输出aarch64,AMD64输出x86_64

# 查看操作系统信息
cat /etc/os-release

二、Docker离线安装(ARM64)

2.1 在线服务器准备Docker安装包

  1. 在联网的ARM64服务器上下载Docker安装包
# 创建工作目录
mkdir -p /tmp/docker-offline && cd /tmp/docker-offline

# 下载Docker安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh

# 下载Docker二进制包(适用于无法运行脚本的环境)
# 访问 https://download.docker.com/linux/static/stable/aarch64/ 选择合适版本
wget https://download.docker.com/linux/static/stable/aarch64/docker-20.10.24.tgz
  1. 下载MySQL 8 ARM64镜像
# 拉取ARM64架构的MySQL镜像
docker pull arm64v8/mysql:8.0

# 或使用官方镜像(自动适配架构)
docker pull mysql:8.0

# 保存镜像为tar文件
docker save -o mysql8-arm64.tar arm64v8/mysql:8.0

2.2 离线服务器安装Docker

  1. 传输安装文件到离线服务器

使用U盘、SCP或其他方式将以下文件传输到离线服务器的/tmp/docker-offline目录:

  • docker-20.10.24.tgz
  • mysql8-arm64.tar
  1. 安装Docker
# 解压Docker二进制包
cd /tmp/docker-offline
tar -zxvf docker-20.10.24.tgz

# 将Docker文件复制到/usr/bin
sudo cp docker/* /usr/bin/

# 启动Docker服务
sudo dockerd &

# 验证Docker是否启动成功
docker --version
docker info
  1. 配置Docker服务(可选)
# 创建systemd服务文件
sudo tee /etc/systemd/system/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP \$MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF

# 重新加载systemd配置
sudo systemctl daemon-reload

# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 检查Docker状态
sudo systemctl status docker

2.3 导入MySQL镜像

# 导入MySQL镜像
docker load -i mysql8-arm64.tar

# 查看镜像
docker images | grep mysql

三、MySQL容器部署与配置

3.1 基本部署命令

# 创建数据目录(持久化数据)
mkdir -p /data/mysql/{data,conf,log}
chmod -R 777 /data/mysql  # 简化权限,生产环境需精细化设置

# 启动MySQL容器
docker run -d \
  --name mysql8 \
  -p 3306:3306 \
  -v /data/mysql/data:/var/lib/mysql \
  -v /data/mysql/conf:/etc/mysql/conf.d \
  -v /data/mysql/log:/var/log/mysql \
  -e MYSQL_ROOT_PASSWORD=Root@123456 \
  -e MYSQL_DATABASE=appdb \
  -e MYSQL_USER=appuser \
  -e MYSQL_PASSWORD=App@123456 \
  --restart=always \
  --network=bridge \
  arm64v8/mysql:8.0 \
  --lower-case-table-names=1 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_general_ci \
  --default-authentication-plugin=mysql_native_password

参数说明

  • -v:挂载宿主机目录,实现数据持久化
  • -e:设置环境变量,如root密码、数据库、用户等
  • --restart=always:Docker重启时自动启动容器
  • 最后的参数为MySQL配置选项:
    • lower-case-table-names=1:表名不区分大小写
    • character-set-server=utf8mb4:设置默认字符集
    • default-authentication-plugin=mysql_native_password:使用传统密码认证插件,兼容旧客户端

3.2 自定义配置文件

  1. 创建自定义配置文件
# 创建配置文件
cat > /data/mysql/conf/my.cnf <<EOF
[mysqld]
# 基本设置
user = mysql
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
default-storage-engine = InnoDB
lower_case_table_names = 1
max_connections = 1000

# 日志设置
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

# 性能设置
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
query_cache_size = 0
query_cache_type = 0
EOF

# 重启容器使配置生效
docker restart mysql8
  1. 查看容器日志确认配置是否生效
docker logs mysql8 | grep "character-set-server"
docker logs mysql8 | grep "lower_case_table_names"

3.3 容器状态管理

# 查看容器状态
docker ps | grep mysql8

# 停止容器
docker stop mysql8

# 启动容器
docker start mysql8

# 重启容器
docker restart mysql8

# 查看容器详细信息
docker inspect mysql8

# 查看容器资源使用情况
docker stats mysql8

四、MySQL配置与远程访问

4.1 进入容器并登录MySQL

# 进入容器
docker exec -it mysql8 /bin/bash

# 登录MySQL
mysql -uroot -pRoot@123456

4.2 配置远程访问权限

-- 创建数据库和用户
CREATE DATABASE IF NOT EXISTS appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'App@123456';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'%';

-- 允许root远程访问(生产环境不推荐)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

-- 刷新权限
FLUSH PRIVILEGES;

4.3 解决旧客户端连接问题

MySQL 8默认使用caching_sha2_password认证插件,可能导致旧客户端连接失败:

-- 修改root用户认证插件
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Root@123456';

-- 修改普通用户认证插件
ALTER USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'App@123456';
FLUSH PRIVILEGES;

4.4 防火墙配置

如果服务器启用了防火墙,需要开放3306端口:

# 临时开放端口
sudo firewall-cmd --add-port=3306/tcp --zone=public --permanent
sudo firewall-cmd --reload

# 或关闭防火墙(不推荐)
sudo systemctl stop firewalld
sudo systemctl disable firewalld

五、数据备份与恢复

5.1 容器内备份

# 创建备份目录
mkdir -p /data/mysql/backup

# 备份所有数据库
docker exec mysql8 mysqldump -uroot -pRoot@123456 --all-databases --single-transaction > /data/mysql/backup/all-db-$(date +%Y%m%d).sql

# 备份指定数据库
docker exec mysql8 mysqldump -uroot -pRoot@123456 --databases appdb --single-transaction > /data/mysql/backup/appdb-$(date +%Y%m%d).sql

5.2 容器内恢复

# 将备份文件复制到容器内
docker cp /data/mysql/backup/appdb-20231001.sql mysql8:/tmp/

# 进入容器恢复数据
docker exec -it mysql8 /bin/bash
mysql -uroot -pRoot@123456 appdb < /tmp/appdb-20231001.sql

5.3 自动化备份脚本

创建备份脚本并添加到定时任务:

# 创建备份脚本
cat > /data/mysql/backup/backup.sh <<EOF
#!/bin/bash
BACKUP_DIR="/data/mysql/backup"
DATE=\$(date +%Y%m%d_%H%M%S)
DB_USER="root"
DB_PASS="Root@123456"
CONTAINER_NAME="mysql8"

# 创建备份
docker exec \$CONTAINER_NAME mysqldump -u\$DB_USER -p\$DB_PASS --all-databases --single-transaction > \$BACKUP_DIR/all-db-\$DATE.sql

# 压缩备份文件
gzip \$BACKUP_DIR/all-db-\$DATE.sql

# 删除7天前的备份
find \$BACKUP_DIR -name "all-db-*.sql.gz" -mtime +7 -delete
EOF

# 添加执行权限
chmod +x /data/mysql/backup/backup.sh

# 添加到crontab,每天凌晨3点执行备份
echo "0 3 * * * /data/mysql/backup/backup.sh" | crontab -

六、Docker Compose部署(可选)

6.1 安装Docker Compose

# 下载Docker Compose二进制文件(ARM64版本)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-aarch64" -o /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

6.2 创建docker-compose.yml文件

version: '3.8'

services:
  mysql:
    image: arm64v8/mysql:8.0
    container_name: mysql8
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "Root@123456"
      MYSQL_DATABASE: "appdb"
      MYSQL_USER: "appuser"
      MYSQL_PASSWORD: "App@123456"
      TZ: "Asia/Shanghai"
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - /data/mysql/conf:/etc/mysql/conf.d
      - /data/mysql/log:/var/log/mysql
      - /data/mysql/backup:/backup
    command:
      --lower-case-table-names=1
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
    networks:
      - mysql-network

networks:
  mysql-network:
    driver: bridge

6.3 使用Docker Compose管理

# 启动服务
docker-compose up -d

# 查看状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

# 停止服务并保留数据
docker-compose down --volumes

七、跨平台部署与架构适配

7.1 多架构镜像选择

镜像名称 架构支持 说明
mysql:8.0 自动适配 Docker会根据宿主机架构自动拉取对应镜像
arm64v8/mysql:8.0 仅ARM64 明确指定ARM64架构镜像
mysql/mysql-server:8.0 多架构支持 官方提供的多架构镜像

7.2 跨架构镜像构建

如果需要为不同架构构建自定义MySQL镜像,可使用Docker Buildx:

# 启用Buildx
docker buildx create --use

# 构建多架构镜像
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t yourusername/mysql:8.0 \
  --push .

7.3 架构迁移注意事项

  1. 数据迁移

    • 使用mysqldump备份数据
    • 在目标架构上恢复数据,避免直接复制数据文件
  2. 性能调优

    • ARM64架构服务器可能需要调整MySQL性能参数
    • 参考官方文档针对ARM架构优化配置

八、常见问题解决

8.1 容器启动失败

问题:容器启动后立即退出或状态为restarting

解决方案

# 查看日志定位问题
docker logs mysql8

# 常见原因及解决:
# 1. 权限问题
chmod -R 777 /data/mysql

# 2. 端口冲突
netstat -tulpn | grep 3306  # 查找占用进程
docker run -p 3307:3306 ...  # 更换宿主机端口

# 3. 配置文件错误
mv /data/mysql/conf/my.cnf /data/mysql/conf/my.cnf.bak  # 暂时移除自定义配置
docker restart mysql8

8.2 中文乱码问题

问题:数据库中文显示乱码

解决方案

-- 检查数据库字符集
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

-- 确保以下参数为utf8mb4
-- character_set_client = utf8mb4
-- character_set_connection = utf8mb4
-- character_set_database = utf8mb4
-- character_set_results = utf8mb4
-- character_set_server = utf8mb4
-- collation_server = utf8mb4_general_ci

8.3 数据持久化问题

问题:容器删除后数据丢失

解决方案

  • 确保正确挂载数据卷:-v /data/mysql/data:/var/lib/mysql
  • 定期备份数据
  • 避免使用docker rm -v命令删除容器(会删除匿名卷)

8.4 性能问题

问题:MySQL容器性能不佳

解决方案

  1. 调整资源限制
docker run -d \
  --name mysql8 \
  --memory=2g \
  --cpus=1 \
  ...
  1. 优化MySQL配置
[mysqld]
innodb_buffer_pool_size = 1G  # 一般设置为物理内存的50%
innodb_log_file_size = 256M
max_connections = 500
query_cache_size = 0

九、生产环境最佳实践

9.1 安全加固

  1. 非root用户运行
# 创建用户和组
groupadd -r mysql --gid=999
useradd -r -g mysql --uid=999 mysql

# 修改目录权限
chown -R mysql:mysql /data/mysql

# 使用--user参数运行容器
docker run -d \
  --name mysql8 \
  --user=999:999 \
  ...
  1. 限制网络访问
# 创建专用网络
docker network create mysql-net

# 仅允许特定容器访问MySQL
docker run -d \
  --name mysql8 \
  --network=mysql-net \
  --network-alias=mysql \
  -p 127.0.0.1:3306:3306 \  # 仅绑定本地地址
  ...
  
# 应用容器连接到同一网络
docker run -d \
  --name app \
  --network=mysql-net \
  ...

9.2 监控与日志

  1. 集成Prometheus监控
# 使用包含exporter的镜像或单独部署mysqld-exporter
docker run -d \
  --name mysql-exporter \
  -e DATA_SOURCE_NAME="root:Root@123456@(mysql8:3306)/" \
  --network=mysql-net \
  prom/mysqld-exporter:latest
  1. 集中式日志
# 使用ELK栈或其他日志收集工具
docker run -d \
  --name mysql8 \
  -v /data/mysql/log:/var/log/mysql \
  --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  ...

9.3 高可用部署

对于生产环境,建议使用主从复制或集群方案:

# docker-compose.yml示例(主从复制)
version: '3.8'

services:
  mysql-master:
    image: arm64v8/mysql:8.0
    container_name: mysql-master
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "Root@123456"
      MYSQL_DATABASE: "appdb"
      MYSQL_USER: "repl"
      MYSQL_PASSWORD: "Repl@123456"
    volumes:
      - ./master/data:/var/lib/mysql
      - ./master/conf:/etc/mysql/conf.d
    command:
      --server-id=1
      --log-bin=mysql-bin
      --binlog-do-db=appdb
      --lower-case-table-names=1
      --character-set-server=utf8mb4

  mysql-slave:
    image: arm64v8/mysql:8.0
    container_name: mysql-slave
    restart: always
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "Root@123456"
    volumes:
      - ./slave/data:/var/lib/mysql
      - ./slave/conf:/etc/mysql/conf.d
    command:
      --server-id=2
      --relay-log=mysql-relay-bin
      --read-only=1
      --lower-case-table-names=1
      --character-set-server=utf8mb4
    depends_on:
      - mysql-master

十、总结

本文详细介绍了在ARM64架构服务器上使用Docker部署MySQL 8的完整流程,从Docker离线安装、MySQL镜像处理,到容器配置、数据备份恢复,再到生产环境最佳实践,涵盖了部署过程中的各个方面。重点解决了ARM64架构适配、离线环境部署、旧客户端兼容性等关键问题,并提供了Docker Compose部署方案和高可用配置建议。

通过本文的指南,读者可以在各类ARM64设备上高效部署和管理MySQL容器,无论是开发测试环境还是生产环境,都能找到合适的部署策略。在实际应用中,建议根据具体需求调整配置参数,并遵循安全最佳实践,确保数据库服务的稳定和安全。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐