群晖DSM启动MySQL 8.0容器需四步缺一不可:1. 正确挂载/data至/var/lib/mysql;2. 设置非空无特殊字符的MYSQL_ROOT_PASSWORD;3. 手动指定端口(如3306)并映射;4. 挂载custom.cnf至/etc/mysql/conf.d启用utf8mb4及远程访问,再创建%用户、放行防火墙。

群晖DSM图形界面启动MySQL 8.0容器的关键步骤
直接在DSM里点几下就能跑起来,但跳过任意一步都可能连不上、数据不持久、甚至容器反复重启。核心是:挂载路径必须对、环境变量不能漏、端口映射要显式指定。
-
/volume1/docker/mysql8/data必须映射到容器内/var/lib/mysql—— 这是数据盘,不挂就等于没装数据库,删容器=丢库 -
MYSQL_ROOT_PASSWORD是唯一强制要求的环境变量,值不能为空、不能含特殊字符(如$、@、#),否则容器启动失败且日志只报error: database is uninitialized - 本地端口别选“自动”,一定要手动填
3306;若NAS已跑其他服务占了3306,可填3307,但客户端连接时必须用这个新端口 - 容器名称建议用纯英文+数字(如
mysql8-main),含中文或空格会导致后续命令行操作异常
配置文件怎么挂、为什么不能跳过
DSM图形界面本身不提供编辑 my.cnf 的入口,但MySQL 8.0默认不支持 utf8 字符集,也不开远程访问——这两个问题不解决,Navicat连上也建不了中文表,或者直接被拒绝连接。
- 先在NAS上创建配置目录:
/volume1/docker/mysql8/conf,里面放一个custom.cnf - 文件内容至少包含三段:
[client]、[mysql]、[mysqld],其中[mysqld]段必须有character-set-server=utf8mb4和collation-server=utf8mb4_unicode_ci - 挂载时,把
/volume1/docker/mysql8/conf映射到容器内/etc/mysql/conf.d(不是/etc/mysql/my.cnf!后者会被忽略) - 如果跳过这步,首次登录后执行
SHOW VARIABLES LIKE 'char%';会发现全是latin1,插入中文直接报错
远程访问连不上?大概率卡在这三个地方
容器跑起来了、端口也开了、密码也对,但就是连不上。90% 是因为 MySQL 8.0 默认只允许本地 root 登录,且认证插件从 mysql_native_password 改成了 caching_sha2_password,而多数GUI客户端(HeidiSQL、旧版Navicat)不原生支持后者。
- 进容器执行
docker exec -it mysql8-main mysql -uroot -p,输密码后运行:CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'your_strong_pass'; - 再执行:
GRANT ALL ON *.* TO 'admin'@'%' WITH GRANT OPTION;,然后FLUSH PRIVILEGES; - 别改 root 用户的认证方式——DSM某些套件依赖 root 的默认插件,硬改可能导致其他服务异常
- 如果用的是新版 Navicat(v16+)或 DBeaver,可在连接设置里手动指定认证插件为
caching_sha2_password,但不如新建用户省事
防火墙和DSM安全设置容易被忽略的细节
即使MySQL内部放行了 %,DSM自身的防火墙和“安全性”模块仍会拦截外部请求。这不是Docker的问题,是群晖系统层的保护机制。
- 进 DSM → 控制面板 → 安全性 → 防火墙 → 编辑规则 → 添加一条:协议 TCP、来源 IP(可填
192.168.1.0/24或具体设备IP)、目标端口3306、动作 允许 - 如果要用域名或外网访问,必须额外在“路由器”设置里做端口转发(NAS内网IP + 3306 → 路由器公网IP:3306),且确保ISP没封 3306 端口
- “安全性”模块里的“启用自动封锁”功能,会把连续输错三次密码的IP拉黑,测试时输错密码后记得去“封锁列表”里手动清除
实际部署中最麻烦的从来不是拉镜像或点启动,而是挂载路径写错、配置文件位置不对、远程用户权限没刷、防火墙规则漏加——四者只要缺一,整个流程就卡死在“连不上”。做完图形化配置后,务必进容器执行一次 mysql -h127.0.0.1 -uroot -p -e "SELECT USER(), VERSION();",确认服务真正在跑,再往外测。


















