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

如何从PHP Docker容器通过SSH隧道连接远程MySQL服务器?

解决PHP Docker容器连接宿主机SSH隧道后的远程MySQL问题

问题根源:你在PHP容器中使用127.0.0.2:13306时,这个地址指向的是容器自身的回环网络,而非宿主机的SSH隧道端口,所以会出现连接拒绝错误。

以下是两种可行的解决方案:

方案一:直接访问宿主机的SSH隧道端口

适用场景:使用Docker Desktop(Windows/macOS)或Linux配置了宿主机网关映射

  • 对于Windows/macOS的Docker Desktop,直接使用Docker内置的宿主机域名host.docker.internal替换127.0.0.2:

    $db = new PDO("mysql:host=host.docker.internal;port=13306", "user", "pass");
    
  • 对于Linux环境,启动PHP容器时需要手动添加宿主机映射:

    docker run --add-host=host.docker.internal:host-gateway [你的PHP容器参数]
    

    之后同样使用host.docker.internal作为MySQL主机地址。

  • 也可以直接使用宿主机在Docker网桥中的实际IP地址:

    1. 执行docker network inspect [你的容器所在网络名],找到Gateway字段的IP(通常是172.17.0.1之类的)
    2. 替换连接代码中的主机地址:
      $db = new PDO("mysql:host=172.17.0.1;port=13306", "user", "pass");
      

方案二:在PHP容器内部建立SSH隧道

适用场景:需要容器独立管理隧道,或无法直接访问宿主机端口

  1. 进入PHP容器,安装SSH客户端(以Debian/Ubuntu镜像为例):
    docker exec -it [你的PHP容器名] bash
    apt-get update && apt-get install -y openssh-client
    
  2. 在容器内部建立SSH隧道,将远程MySQL端口映射到容器本地的127.0.0.2:13306:
    ssh -L 127.0.0.2:13306:[远程MySQL服务器IP]:3306 [远程SSH用户名]@[远程SSH服务器IP] -N
    
    (-N参数表示只建立隧道不执行远程命令,可后台运行)
  3. 保持隧道运行,此时你的原有连接代码即可正常工作:
    $db = new PDO("mysql:host=127.0.0.2;port=13306", "user", "pass");
    

注意事项

  • 确保宿主机的防火墙规则允许Docker容器访问13306端口
  • 如果使用方案二,建议将SSH隧道的启动命令集成到容器的启动脚本中,避免每次手动执行

内容的提问来源于stack exchange,提问作者dima.rus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:05:59