必须手动设置MYSQL_ROOT_PASSWORD,否则容器因数据库未初始化而退出;需正确拼写、固定端口3306、挂载/var/lib/mysql实现数据持久化,并配置远程访问权限及群晖防火墙放行。

必须手动设置 MYSQL_ROOT_PASSWORD,否则容器会立即退出——这是群晖上 MySQL 启动失败的最常见原因。
为什么不能跳过环境变量配置
群晖 Container Manager 的 MySQL 镜像(包括 mysql:5.7、mysql:8.0)启动时强制校验 MYSQL_ROOT_PASSWORD。不设这个变量,日志里只会显示 error: database is uninitialized and password option is not specified,然后容器反复重启或直接退出。
其他常见错误现象:
- 容器状态为
Exited (1),点开日志看不到有效报错 - 端口映射显示正常,但
telnet 192.168.x.x 3306拒绝连接 - 用 Navicat 连接时报
Access denied for user 'root'@'xxx',其实根本没启动成功
解决方法就是:在「环境变量」里明确添加一项:
MYSQ_ROOT_PASSWORD=your_strong_password
注意:MYSQL_ROOT_PASSWORD 拼写必须完全正确,大小写敏感,不能少字母。
端口映射必须固定为 3306(除非你有明确理由)
群晖默认启用“自动端口映射”,会导致每次重启容器后宿主机端口随机变化(比如变成 32789),外部工具无法稳定连接。
你应该在「高级设置 → 端口设置」中手动指定:
- 本地端口:
3306 - 容器端口:
3306 - 协议:TCP
如果提示“端口已被占用”,先检查是否已有其他 MySQL/MariaDB 容器或套件(如 DSM 内置的 MariaDB)在运行。可执行 docker ps 或在 Container Manager 的「容器」页查看。
数据持久化必须挂载 /var/lib/mysql 目录
MySQL 容器默认把数据库文件存在内存临时文件系统里。一旦容器删除或重建,所有数据彻底丢失——这不是 bug,是 Docker 镜像的设计逻辑。
务必在「卷」设置中添加一条挂载:
- 文件夹:选择 NAS 上一个专用共享文件夹(如
docker-mysql-data) - 装载路径:
/var/lib/mysql
不要挂载到根目录或系统共享文件夹(如 web、photo),避免权限冲突;也不要只挂载子目录(如 /var/lib/mysql/mysql),那会导致初始化失败。
远程访问需要额外两步授权
即使容器跑起来了、端口通了、密码也对,从局域网其他设备仍可能连不上,因为 MySQL 默认只允许 root@localhost 登录。
你需要进入容器执行授权命令:
docker exec -it mysql-container mysql -uroot -pyour_strong_password -e "GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'your_strong_password'; FLUSH PRIVILEGES;"
或者更安全的做法:新建专用用户(推荐):
CREATE USER 'appuser'@'%' IDENTIFIED BY 'strong_password';<br>GRANT ALL PRIVILEGES ON your_db.* TO 'appuser'@'%';<br>FLUSH PRIVILEGES;
注意:'appuser'@'%' 中的 % 表示任意 IP,若只要局域网访问,可用 '192.168.1.%' 替代。
真正容易被忽略的是:群晖防火墙和路由器端口转发。即使容器内 MySQL 正常监听 3306,DSM 自带防火墙默认会拦截外部入站请求。进「控制面板 → 安全性 → 防火墙」,确认已放行 TCP 3306;若需外网访问,还得在路由器做 3306 端口转发,并评估安全风险。


















