如何从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地址:
- 执行
docker network inspect [你的容器所在网络名],找到Gateway字段的IP(通常是172.17.0.1之类的) - 替换连接代码中的主机地址:
$db = new PDO("mysql:host=172.17.0.1;port=13306", "user", "pass");
- 执行
方案二:在PHP容器内部建立SSH隧道
适用场景:需要容器独立管理隧道,或无法直接访问宿主机端口
- 进入PHP容器,安装SSH客户端(以Debian/Ubuntu镜像为例):
docker exec -it [你的PHP容器名] bash apt-get update && apt-get install -y openssh-client - 在容器内部建立SSH隧道,将远程MySQL端口映射到容器本地的
127.0.0.2:13306:
(ssh -L 127.0.0.2:13306:[远程MySQL服务器IP]:3306 [远程SSH用户名]@[远程SSH服务器IP] -N-N参数表示只建立隧道不执行远程命令,可后台运行) - 保持隧道运行,此时你的原有连接代码即可正常工作:
$db = new PDO("mysql:host=127.0.0.2;port=13306", "user", "pass");
注意事项
- 确保宿主机的防火墙规则允许Docker容器访问
13306端口 - 如果使用方案二,建议将SSH隧道的启动命令集成到容器的启动脚本中,避免每次手动执行
内容的提问来源于stack exchange,提问作者dima.rus
相关产品推荐
相关产品推荐

