Php 从Docker容器内部使用XDebug进行远程调试不起作用

Php 从Docker容器内部使用XDebug进行远程调试不起作用,php,intellij-idea,docker,xdebug,remote-debugging,Php,Intellij Idea,Docker,Xdebug,Remote Debugging,我正在尝试设置停靠的AMP环境,但无法使远程调试器工作。我的设置如下: 我有一个运行mysql的数据库容器,它工作得很好。我用以下Dockerfile构建了一个Docker映像“phpmysqli” FROM php:apache RUN docker-php-ext-install mysqli mbstring # zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so RUN pe

我正在尝试设置停靠的AMP环境,但无法使远程调试器工作。我的设置如下:

我有一个运行mysql的数据库容器,它工作得很好。我用以下Dockerfile构建了一个Docker映像“phpmysqli”

FROM php:apache

RUN docker-php-ext-install mysqli mbstring

# zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so
RUN pecl install xdebug
RUN echo 'zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so' >> /usr/local/etc/php/php.ini
RUN touch /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_enable=1 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_autostart=0 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_connect_back=1 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_port=9000 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_log=/tmp/php5-xdebug.log >> /usr/local/etc/php/conf.d/xdebug.ini;

RUN echo 'date.timezone = Europe/Berlin' > /usr/local/etc/php/conf.d/date.ini
我打电话

docker run --rm -ti  --name web -p 127.0.0.1:8080:80 -v /path/to/projects:/var/www/html --link db:db  phpmysqli
在此phpinfo之后,php-i分别显示xdebug 2.3.2已启动并正在运行

接下来,我在IntellijIDEA内部设置了一个名为“Docker”的服务器,其中包含主机
127.0.0.1
、端口
8080
和调试器Xdebug。我在docker run语句中设置了类似于卷映射的路径映射

在PHP->Debug设置中,我检查了我是否对传入连接使用端口
9000
,是否接受外部连接,是否不会忽略来自未注册服务器的连接

在此之后,我还创建了一个名为Docker的新PHP远程调试配置。服务器是Docker,会话id是XDEBUG\u IDEA

我可以调用容器上的PHP文件,我可以通过链接连接到数据库。。。但是由于某种原因,当我尝试启动调试会话时,什么都没有发生。我尝试使用cookie(是的,我在XDEBUG助手中将
XDEBUG\u IDEA
设置为会话id)。我尝试将
XDEBUG\u SESSION\u START=XDEBUG\u IDEA
作为
GET
发送


你能告诉我我错过了什么吗?

你可以试试这个配置。php apache build提供了两种编译和启用模块php的方法。 最好使用
docker php ext enable xdebug
设置正确的文件配置

FROM php:5.4-apache

# Enable and configure xdebug
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
RUN sed -i '1 a xdebug.remote_autostart=true' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_mode=req' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_handler=dbgp' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_connect_back=1 ' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_port=9000' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_host=127.0.0.1' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_enable=1' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

关闭:
xdebug.remote\u connect\u back=0

添加:
xdebug.remote\u host=192.168.0.102[您的docker主机/机器IP]

对于我使用Submite在PHP、NGINX docker环境中的应用,我让它可以使用以下设置:

xdebug.remote_enable = 1
xdebug.remote_mode = req
xdebug.remote_port = 9001
xdebug.remote_connect_back=0
xdebug.remote_host=host.docker.internal

我花了很长时间才弄明白的一个问题是将远程_主机设置为host.docker.internal

如果您不想更改容器中的xdebug配置,并想使用
xdebug.remote\u connect\u back=1
使其工作,您可以将HTTP头
X-Forwarded-For
设置为
host.docker.internal
的IP,从而定义PHP
$\u服务器['HTTP\u X\u Forwarded\u']
xdebug喜欢并使用哪个作为客户端IP而不是
$\u服务器['REMOTE\u ADDR']

不知道是什么问题,但您应该在容器中连接一个
docker exec-it web_id bash
,并在内部进行调试,就像在Windows上的任何Linux服务器上出现这种问题一样?如果是,您的Docker主机使用什么?(vagrant,other?)我正在运行Ubuntu15.04a解决方案进行尝试:使用
docker run--net=host启动容器(并删除
-p 127.0.0.1:8080:80
)。这将使您的容器和Docker主机共享相同的网络接口。因此,从容器的角度来看,
localhost
将是Docker主机。xdebug在确定如何连接到调试程序时可能会遇到较少的问题这与--link不兼容我尝试了“pecl安装xdebug”,但它返回了一个错误:pecl/xdebug需要PHP(版本>=5.5.0),安装的版本是5.4.45找不到有效的软件包安装失败我有相同的错误。我将“FROM php:5.4-apache”更改为“FROM php:7.0-apache”,它解决了我的问题:)请阅读关于
xdebug.remote\u connect\u back的文档它告诉我们:如果启用,xdebug.remote\u主机设置将被忽略,xdebug将尝试连接到发出HTTP请求的客户端。它检查$\u服务器['HTTP\u X\u FORWARDED\u']和$\u服务器['REMOTE\u ADDR']变量,找出要使用的IP地址。显然,启用该选项后,远程主机ip设置将被忽略。host.docker.internal仅适用于Windows版docker或Mac版docker,而不适用于linux环境中运行的docker@bender不再是这种情况:如果您试图在WSL2下配置xdebug,请注意host.docker.internal不指向子系统,需要解决方法: