container manager 界面部署 mysql 在 dsm 7.2.1+ 上基本不可靠,因其无法配置认证插件、字符集、健康检查及挂载权限等关键项,导致容器秒退、sock 文件报错、权限拒绝和远程连接失败。

Container Manager 界面部署 MySQL 在 DSM 7.2.1+ 上基本不可靠,不是操作失误,而是它根本无法满足 MySQL 8.x 启动的最小配置要求。强行点“应用”后容器秒退、mysqld.sock 报错、远程连不上、中文乱码,都是表象;根源是界面不暴露关键参数入口。
为什么 Container Manager 创建的 MySQL 容器总闪退
根本原因有三:
-
MYSQL_DEFAULT_AUTHENTICATION_PLUGIN缺失:MySQL 8.0.4+ 默认用caching_sha2_password,但界面不提供该环境变量设置入口,初始化失败直接退出 - 挂载目录权限失控:宿主机目录 UID/GID 与容器内
mysql用户(UID 999)不匹配,/var/lib/mysql写入被拒,日志只显示 “Permission denied”,无具体路径提示 - 健康检查缺失 + 日志截断:界面不展示 stderr,
[ERROR] [MY-010262] Bind on TCP/IP port: Address already in use这类端口冲突错误被吞掉,你只看到“已停止”
docker-compose.yml 是唯一靠谱的启动方式
必须放弃图形界面,改用命令行部署。准备一个 docker-compose.yml 文件,放在 NAS 的共享文件夹里(如 /volume1/docker/mysql),内容需包含以下硬性项:
-
volumes必须映射./mysql:/var/lib/mysql和./conf:/etc/mysql/conf.d—— 后者用于挂载自定义custom.cnf -
command要显式传参:--default-authentication-plugin=caching_sha2_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci -
environment至少含:MYSQL_ROOT_PASSWORD(不含$、@等 shell 特殊字符)、MYSQL_INITDB_SKIP_TZINFO=1(避免时区初始化失败)、MYSQL_ALLOW_EMPTY_PASSWORD=no -
healthcheck必须加:test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"],否则容器“绿了”但mysqld没起来
远程连接前必须手动建用户,不能只靠 MYSQL_ROOT_HOST=%
MYSQL_ROOT_HOST=% 在 Container Manager 环境变量里填了也没用——它只影响初始化脚本行为,而 MySQL 8 的 root 默认仍绑定 localhost,且认证插件是 caching_sha2_password,多数 GUI 工具(HeidiSQL、旧版 Navicat)不支持。
正确做法是容器启动后,进容器执行:
docker exec -it mysql 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 自带套件(如 Photo Station)可能依赖其默认插件。
中文乱码和防火墙是最后两道坎
即使容器跑起来了、用户也建好了,SHOW VARIABLES LIKE 'char%'; 仍可能全是 latin1,因为:
-
Container Manager不支持挂载/etc/mysql/conf.d,所以custom.cnf必须通过docker-compose.yml的volumes显式挂载,且文件必须放在[mysqld]段里写character-set-server=utf8mb4 - 群晖防火墙默认拦 3306,需在“控制面板 → 安全性 → 防火墙”中手动放行该端口,并指定来源 IP 范围(别选“任何来源”)
最易忽略的是:NAS 本地网络出口可能被路由器或光猫的防火墙二次拦截,局域网能连不代表手机连 Wi-Fi 就一定能连——建议先用另一台局域网电脑测试,再排查外网穿透链路。











