php - 如何将 SSH 隧道反向到 Xdebug 的远程 docker 容器?

标签 php amazon-web-services docker ssh xdebug

SO和其他地方有很多关于如何设置的帖子。到目前为止,我一直没有成功地让它工作。
设置
本地机器 - Windows 10,安装了 Ubuntu、Cygwin、git bash 和 WSL2;和 MacBook Air( Mojave )
主机 - 运行 Amazon Linux 2 的 AWS EC2 实例
Docker 容器 - 使用 Xdebug 运行 PHP 的 CentOS 7.8
目标
通过利用从本地机器到容器的反向隧道,从本地机器远程调试容器中的 PHP 代码。
当 PHP 代码本地安装在主机上时,我已经得到了这个工作,所以问题不在于 Xdebug。一旦我将 PHP 代码移动到容器中,调试就不再起作用了。
我试过的
设置从本地机器到主机 EC2 实例的反向隧道是可行的。为此,我正在做 ssh -vvv -i "aws.pem" -R 9000:localhost:9000 user@ec2instance在终端、cygwin 或 git bash 中并使用 nc -z localhost 9000 || echo 'no tunnel open' 进行测试在主机上。
当我docker exec -it container bash进入容器并运行nc,隧道不可用。
我正在使用 docker-compose:

version: '2'
services:
  web:
    image: 'privateregistry/project/container:latest'
    restart: always
    container_name: web
    ports:
      - '8082:80'
      - '447:443'
      - '9000:9000'
    volumes:
      - '.:/var/www/project'
我尝试过映射和不映射 9000 端口。我尝试了 ssh 隧道的变体:ssh -vvv -i "aws.pem" -R :9000:localhost:9000 user@ec2instancessh -vvv -i "aws.pem" -R 0.0.0.0:9000:localhost:9000 user@ec2instancessh -vvv -i "aws.pem" -R \*:9000:localhost:9000 user@ec2instancessh -vvv -i "aws.pem" -R 9000:172.20.0.2:9000 user@ec2instance (容器 IP)
我也试过使用 ssh -L没有运气。
几个帖子,像这样 one建议添加GatewayPorts yes在主机上。我也试过了,没有任何变化。
我没有尝试使用 --network=host ,主要是出于安全考虑。我也不想使用 ngrok,因为我希望能够使用 localhost 或 host.docker.internal对于xdebug.remote_host环境。
为了完整起见,这是我为 Xdebug 提供的内容:
[XDebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_handler="dbgp"
xdebug.remote_port=9000
xdebug.remote_host="host.docker.internal"
;xdebug.remote_connect_back=1
xdebug.idekey = VSCODE
xdebug.remote_log = "/var/log/xdebug.log"

最佳答案

我得到了这个工作。在阅读了 ssh 手册页并再次查看内容后,我意识到我正在绑定(bind)到 docker 容器 IP 而不是桥 (docker0) IP。
我将连接命令更新为 ssh -vvv -i "aws.pem" -R 9000:172.17.0.1:9000 user@ec2instance使用正确的 IP,隧道开始工作。我仍然启用了 GatewayPorts(根据手册页)并删除了 9000:9000 映射。
然后我将我的 xdebug.remote_host 值更新为相同的 IP,现在调试工作正常。不知道为什么 host.docker.internal 不起作用,但那是另一天。

关于php - 如何将 SSH 隧道反向到 Xdebug 的远程 docker 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62580411/

相关文章:

ios - 使用 iOS SDK 将文件上传到 AWS S3 时空白自定义元数据

php - 通过 Laravel 中的 Controller 动态执行种子命令

php - SQL 语法有问题

amazon-web-services - CloudWatch Insights 语法 - Sum() 字节

docker - 在bluemix上运行docker hub容器而不会崩溃(未找到有效主机)

docker - 如何使用 Docker Compose v2 使卷永久化

java - 无法将 docker 镜像推送到 heroku 注册表

charset=utf-8 的 PHP 邮件 header 将成为垃圾邮件

php - 知道如何实现吗?

amazon-web-services - 无 SDK 的 Amazon Transcribe Streaming API