运行数月后phpMyAdmin无法连接MySQL服务器的问题求助
问题背景
在Ubuntu服务器上运行两个Docker容器:MySQL(容器名mysql_db_server)和phpMyAdmin(容器名myadmin)。正常状态下phpMyAdmin可正常登录MySQL,但会随机出现无规律故障,间隔从1个月到4个月不等,故障时phpMyAdmin提示:
Cannot log in to the MySQL server
mysqli::real_connect(): (HY000/2002): No such file or directory
此时MySQL容器运行正常,进入容器可正常访问数据库、数据及表。
初始配置(可正常运行数月)
最初启动phpMyAdmin的命令:
docker run --name myadmin -d --link mysql_db_server:db -p 8080:80 phpmyadmin
此时容器内/etc/phpmyadmin目录无config.user.inc.php文件。
无效的尝试方案
参考相关方案创建config.user.inc.php(以config.sample.inc.php为模板),添加配置:
$cfg['Servers'][$i]['host'] = '127.0.0.1';
并通过挂载本地配置文件启动phpMyAdmin:
docker run --name myadmin -d --link mysql_db_server:db -p 8080:80 -v /local/dir/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php phpmyadmin
此操作导致phpMyAdmin立即出现上述连接错误,问题恶化。
当前临时解决方法
故障出现时,停止并删除phpMyAdmin容器,重新启动即可恢复,但无法根治。
根治解决方案
1. 放弃--link,改用Docker网络(推荐)
Docker的--link是老旧特性,存在网络不稳定问题,建议创建自定义Docker网络:
- 创建自定义网络:
docker network create mysql-net
- 重新启动MySQL容器,加入该网络:
docker run --name mysql_db_server -d --network mysql-net -e MYSQL_ROOT_PASSWORD=你的密码 mysql:对应版本
- 启动phpMyAdmin容器,加入同一网络,直接用MySQL容器名作为主机地址:
docker run --name myadmin -d --network mysql-net -p 8080:80 -e PMA_HOST=mysql_db_server phpmyadmin
2. 正确配置phpMyAdmin的主机地址(若坚持用--link)
如果继续使用--link,config.user.inc.php中的主机应设置为db(而非127.0.0.1),因为--link mysql_db_server:db会把MySQL容器映射为db主机名:
$cfg['Servers'][$i]['host'] = 'db';
然后重新挂载配置文件启动phpMyAdmin:
docker run --name myadmin -d --link mysql_db_server:db -p 8080:80 -v /local/dir/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php phpmyadmin
3. 启用phpMyAdmin的持久化会话与缓存(可选优化)
添加环境变量PMA_PERSISTENT=1,启用持久化连接,减少连接波动:
docker run --name myadmin -d --network mysql-net -p 8080:80 -e PMA_HOST=mysql_db_server -e PMA_PERSISTENT=1 phpmyadmin
内容的提问来源于stack exchange,提问作者Classified

