Docker部署MySQL 8完全指南:ARM64架构适配与最佳实践
摘要: 本文详细介绍了在ARM64架构服务器上使用Docker部署MySQL 8的完整流程。首先对比了ARM64与AMD64架构差异,强调镜像选择的重要性。然后提供了Docker离线安装方案,包括文件传输、安装步骤和MySQL镜像导入方法。接着讲解了MySQL容器的基本部署命令、自定义配置文件设置以及容器管理技巧。最后涵盖MySQL远程访问权限配置等实用操作。文章特别针对ARM64环境提供适配方案
引言
随着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安装包
- 在联网的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
- 下载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
- 传输安装文件到离线服务器:
使用U盘、SCP或其他方式将以下文件传输到离线服务器的/tmp/docker-offline目录:
- docker-20.10.24.tgz
- mysql8-arm64.tar
- 安装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
- 配置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 自定义配置文件
- 创建自定义配置文件:
# 创建配置文件
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
- 查看容器日志确认配置是否生效:
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 架构迁移注意事项
-
数据迁移:
- 使用mysqldump备份数据
- 在目标架构上恢复数据,避免直接复制数据文件
-
性能调优:
- 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容器性能不佳
解决方案:
- 调整资源限制:
docker run -d \
--name mysql8 \
--memory=2g \
--cpus=1 \
...
- 优化MySQL配置:
[mysqld]
innodb_buffer_pool_size = 1G # 一般设置为物理内存的50%
innodb_log_file_size = 256M
max_connections = 500
query_cache_size = 0
九、生产环境最佳实践
9.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 \
...
- 限制网络访问:
# 创建专用网络
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 监控与日志
- 集成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
- 集中式日志:
# 使用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容器,无论是开发测试环境还是生产环境,都能找到合适的部署策略。在实际应用中,建议根据具体需求调整配置参数,并遵循安全最佳实践,确保数据库服务的稳定和安全。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)