官方mysql:5.7镜像不支持arm64架构,需改用oracle官方提供的mysql/mysql-server:5.7.42 arm64原生镜像,并挂载自定义my.cnf配置文件以持久化utf8mb4字符集。

docker run 启动 MySQL 5.7 容器失败:no matching manifest for linux/arm64/v8
直接执行 docker run -d mysql:5.7 在 M3(ARM64)上会报错,核心原因是官方 mysql:5.7 镜像**只提供 x86_64 架构版本**,不包含 ARM64 支持。Docker 默认拉取的镜像是 amd64 的,而 M3 芯片无法原生运行 x86_64 容器(即使开了 Rosetta 2,Docker Desktop 也不自动做跨架构模拟)。错误典型提示是:
Error response from daemon: no matching manifest for linux/arm64/v8 in the manifest list entries
这不是网络或权限问题,是镜像本身缺失 ARM64 构建产物。
用 mysql:5.7.42-oracle-arm64 替代官方镜像
Oracle 官方其实为 MySQL 5.7.42 提供了 ARM64 原生镜像,但没放在 mysql:5.7 标签下,而是单独发布在 Docker Hub 的 mysql/mysql-server:5.7.42(注意是 mysql/mysql-server,不是 mysql)。这个镜像是 Oracle 官方构建、适配 ARM64 的完整发行版。
- 拉取命令必须用全名:
docker pull mysql/mysql-server:5.7.42 - 启动时指定 root 密码、端口映射和数据卷,例如:
docker run --restart=always \ --name mysql57 \ -p 3306:3306 \ -v ~/mysql57-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=Abcdef@123456 \ -d mysql/mysql-server:5.7.42
注意:mysql/mysql-server 镜像默认使用 /var/lib/mysql 作为数据目录,且支持 --character-set-server=utf8mb4 等参数;但不要加 --collation-server=utf8mb4_unicode_ci 到命令行——它不识别该参数,会导致容器启动失败。
连接前必须初始化并确认字符集
首次启动后,容器会自动初始化数据库,但默认字符集仍是 latin1,容易导致中文乱码或 JDBC 连接异常。不能依赖启动参数一次性设好,必须进容器手动确认和调整:
- 等待约 30 秒让初始化完成(
docker logs -f mysql57看到MySQL init process done. Ready for start up.) - 执行:
docker exec -it mysql57 mysql -uroot -pAbcdef@123456 - 执行 SQL 检查当前设置:
SHOW VARIABLES LIKE 'character_set%'; - 如果显示非
utf8mb4,需修改配置文件并重启容器(见下一步)
持久化 utf8mb4 配置需挂载自定义 my.cnf
仅靠环境变量或命令行参数无法持久化 MySQL 5.7 的服务端字符集配置。必须挂载一个定制的 my.cnf 文件到容器内 /etc/my.cnf,否则每次重建容器都会回退。
- 在本地创建
~/mysql57-conf/my.cnf,内容如下:
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' skip-character-set-client-handshake = TRUE [client] default-character-set = utf8mb4
- 启动容器时加上挂载:
-v ~/mysql57-conf/my.cnf:/etc/my.cnf:ro - 务必加
:ro(只读),否则 MySQL 5.7 启动时会因权限问题拒绝读取 - 若已有运行中的容器,先
docker stop mysql57 && docker rm mysql57,再用新命令重跑
这个步骤最容易被跳过——没挂载配置文件,连 Navicat 或 Spring Boot 都可能报“Client does not support authentication protocol”或乱码,不是密码错,是协议和编码没对齐。











