You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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超时。


解决方案及原理

修改步骤

  1. 调整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
  1. 更新MySQL绑定地址
    默认bind-address=127.0.0.1仅允许宿主机本地连接,需改为允许Docker网段访问:
bind-address = 0.0.0.0

重启MySQL:

sudo systemctl restart mysql
  1. 更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:54:53