【问题标题】:How to reverse SSH tunnel to remote docker container for Xdebug?如何将 SSH 隧道反向到 Xdebug 的远程 docker 容器?
【发布时间】:2020-10-16 05:01:44
【问题描述】:

在 SO 和其他地方有很多关于如何设置的帖子。到目前为止,我一直未能成功。

设置
本地机器 - Windows 10,安装了 Cygwin、git bash 和 WSL2 并安装了 Ubuntu;和 MacBook Air(莫哈韦沙漠)
主机 - 运行 Amazon Linux 2 的 AWS EC2 实例
Docker 容器 - 使用 Xdebug 运行 PHP 的 CentOS 7.8

目标
利用从本地机器到容器的反向隧道,从本地机器远程调试容器中的 PHP 代码。

当 PHP 代码本地安装在主机上时,我已经得到了这个工作,所以问题不在于 Xdebug。一旦我将 PHP 代码移动到容器中,调试就不再起作用了。

我的尝试
设置从本地机器到主机 EC2 实例的反向隧道是可行的。为此,我在终端、cygwin 或 git bash 中执行 ssh -vvv -i "aws.pem" -R 9000:localhost:9000 user@ec2instance 并在主机上使用 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@ec2instance
ssh -vvv -i "aws.pem" -R 0.0.0.0:9000:localhost:9000 user@ec2instance
ssh -vvv -i "aws.pem" -R \*:9000:localhost:9000 user@ec2instance
ssh -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 专家或 Amazon EC2 用户,但无论如何都没有一点意义:1) 你在那里使用什么 Web 服务器/PHP 运行器?如果它是 php-fpm,那么它默认使用相同的 TCP 9000 端口。我建议使用 9001 或类似的代替 Xdebug 通信以避免任何可能的冲突。 2)反向 SSH 运行意味着在目标端(服务器或容器内部,如果那是 SSH 端所在的位置)您在本地连接,而 SSH 通过将其转发到您的本地 PC 来完成其余的工作。因此,如果您的 SSH 隧道最终位于容器内,我希望看到 xdebug.remote_host=127.0.0.1
  • 这是一篇关于“普通”SSH 和 PhpStorm 的文章。但是您可以使用它来查看它的一般工作原理,看看您是否可以为您的实际设置获取任何有用的信息:jetbrains.com/help/phpstorm/…
  • 我对此也不太确定:- '9000:9000' -- 它到底是做什么的?在您的设置中如何使用 SSH?据我了解,这表明 Docker 使用端口 9000 接受该端口上的传入连接并将其转发到容器内部(在同一端口上)。这是 SSH 的,所以它可以连接到容器中吗?以防万一,我的观点是 Xdebug 启动了与您的 IDE/编辑器的连接,而不是其他方式。本地 Docker 容器不需要这样的行(因为 IDE/编辑器无法监听该端口)。
  • 我使用的是 php-fpm,但使用的是 unix 套接字,而不是 TCP 端口。我确实尝试过使用和不使用端口映射。不需要它是有道理的。我会仔细看看那篇文章。

标签: php amazon-web-services docker ssh xdebug


【解决方案1】:

我得到了这个工作。在阅读了 ssh 手册页并再次查看内容后,我意识到我正在绑定到 docker 容器 IP 而不是桥 (docker0) IP。

我使用正确的 IP 将我的连接命令更新为 ssh -vvv -i "aws.pem" -R 9000:172.17.0.1:9000 user@ec2instance,隧道开始工作。我仍然启用了 GatewayPorts(根据手册页)并删除了 9000:9000 映射。

然后我将我的 xdebug.remote_host 值更新为相同的 IP,并且现在可以进行调试了。不知道为什么 host.docker.internal 不起作用,但那是另一天。

【讨论】:

    猜你喜欢
    • 2017-01-22
    • 2019-04-14
    • 1970-01-01
    • 2016-10-01
    • 2020-07-13
    • 2012-08-13
    • 2012-06-06
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多