如何在Linux环境下配置Docker版phpMyAdmin与本地MySQL、Nginx?
解决Docker phpMyAdmin连接本地MySQL报
mysqli_connect(): (HY000/2002): Connection refused的问题 部署场景
- 独立域名
- Ubuntu系统的VPS
- Nginx反向代理
- MySQL运行在VPS本地(非Docker容器)
- phpMyAdmin运行在Docker容器中
遇到的问题
phpMyAdmin登录时触发mysqli_connect(): (HY000/2002): Connection refused error,但直接在VPS本地用mysql -u testuser -h 127.0.0.1 -p测试连接时,用户名密码完全正确。多数AI工具只会排查用户名、密码、权限问题,没定位到真正原因——这是一个容易忽略的Docker网络端口问题。
初始配置详情
Nginx反向代理配置
server { server_name database.your-domain.com; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; # 安全Cookie配置 proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict"; # 连接超时配置 proxy_connect_timeout 60s; proxy_read_timeout 60s; proxy_send_timeout 60s; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/database.your-domain.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/database.your-domain.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = database.your-domain.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; listen [::]:80; server_name database.your-domain.com; return 404; # managed by Certbot }
MySQL配置
修改MySQL监听端口与绑定地址:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
在文件中设置:
port = 3306 bind-address = 127.0.0.1
重启MySQL服务:
sudo systemctl restart mysql
MySQL用户权限配置
登录MySQL:
sudo mysql -u root -p
执行SQL创建本地访问用户:
CREATE USER 'testuser'@'127.0.0.1' IDENTIFIED BY 'created_user_password'; GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'127.0.0.1'; FLUSH PRIVILEGES; SELECT User, Host FROM mysql.user;
查询结果确认用户创建成功:
+------------------+-----------+ | User | Host | +------------------+-----------+ | testuser | 127.0.0.1 | | debian-sys-maint | localhost | | mysql.session | localhost | | mysql.sys | localhost | +------------------+-----------+
phpMyAdmin Docker启动配置
#!/bin/bash docker run -d \ --name phpmyadmin \ -p 127.0.0.1:8081:80 \ -e PMA_HOST=127.0.0.1 \ -e PMA_PORT=3306 \ -e PMA_ABSOLUTE_URI=https://database.your-domain.com/ \ phpmyadmin/phpmyadmin
问题现象
按以上配置启动后,phpMyAdmin能正常打开登录页面,但输入用户名密码后无明显报错,最终触发504超时。
解决方案及原理
修改步骤
- 调整phpMyAdmin启动命令
将PMA_HOST=127.0.0.1替换为PMA_HOST=host.docker.internal,修改后的启动脚本:
#!/bin/bash docker run -d \ --name phpmyadmin \ -p 127.0.0.1:8081:80 \ -e PMA_HOST=host.docker.internal \ -e PMA_PORT=3306 \ -e PMA_ABSOLUTE_URI=https://database.your-domain.com/ \ phpmyadmin/phpmyadmin
- 更新MySQL绑定地址
默认bind-address=127.0.0.1仅允许宿主机本地连接,需改为允许Docker网段访问:
bind-address = 0.0.0.0
重启MySQL:
sudo systemctl restart mysql
- 更新MySQL用户权限
创建允许从Docker网关IP访问的用户(默认Docker网关IP为172.17.0.1,可通过docker inspect phpmyadmin确认):
CREATE USER 'testuser'@'172.17.0.1' IDENTIFIED BY 'created_user_password'; GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'172.17.0.1'; FLUSH PRIVILEGES;
原理说明
Docker容器内的127.0.0.1是容器自身的回环地址,而非宿主机的回环地址。初始配置中phpMyAdmin试图连接127.0.0.1:3306,实际是在访问容器内部的MySQL(容器内并未运行MySQL),因此触发连接拒绝。
host.docker.internal是Docker提供的特殊DNS解析,会指向宿主机的真实IP,让phpMyAdmin容器能正确访问宿主机上的MySQL服务。同时修改MySQL绑定地址和用户权限,确保Docker网段的请求能被MySQL接受。
内容的提问来源于stack exchange,提问作者T9b
相关产品推荐
相关产品推荐

