如何为 Xdebug 反转 SSH 隧道到远程 docker 容器?
How to reverse SSH tunnel to remote docker container for Xdebug?
SO 和其他地方有很多关于如何设置它的帖子。到目前为止,我没能成功。
设置
本地机器 - Windows 10,安装了 Cygwin、git bash 和 WSL2 Ubuntu;和 MacBook Air (Mojave)
主机 - AWS EC2 实例 运行ning Amazon Linux 2
Docker 容器 - CentOS 7.8 运行ning PHP with Xdebug
目标
利用从本地计算机到容器的反向隧道,从本地计算机远程调试容器中的 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 手册页并再次查看内容后,我意识到我绑定到 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 不起作用,但那是另一天的事情。
SO 和其他地方有很多关于如何设置它的帖子。到目前为止,我没能成功。
设置
本地机器 - Windows 10,安装了 Cygwin、git bash 和 WSL2 Ubuntu;和 MacBook Air (Mojave)
主机 - AWS EC2 实例 运行ning Amazon Linux 2
Docker 容器 - CentOS 7.8 运行ning PHP with Xdebug
目标
利用从本地计算机到容器的反向隧道,从本地计算机远程调试容器中的 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 手册页并再次查看内容后,我意识到我绑定到 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 不起作用,但那是另一天的事情。