如何使用 phpStorm 调试我的 docker 容器
How can I debug my docker container with phpStorm
在以下IP下我的容器运行在我的Webbrowser中成功
我还创建了一个卷来在我的容器和我的文件系统之间共享文件
docker run --name lampf -d -p 32775:80 -v /Users/sja/Sites/lamkepf2:/var/www/html --link=lampf_db:db codinglimo/apache_php540_gs_imgmck_pdflib9
现在我在我的容器中也成功安装了 xDebug xdebug.ini
zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so"
xdebug.remote_enable=on
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.profiler_enable=0
xdebug.profiler_output_dir="/temp/profiledir"
PHPStorm 也配置好了
http://img2.picload.org/image/iowdpww/xdebug.png
但是我 index.php 中的断点被忽略了?
我的错误是什么?
问题在谢尔盖的帮助下得到解决
我的新xdebug.ini
zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so"
xdebug.remote_enable=on
#xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_connect_back=On
xdebug.remote_handler=dbgp
xdebug.profiler_enable=0
xdebug.profiler_output_dir="/temp/profiledir"
您的 Docker 容器看不到 IP 为 127.0.0.1 的 PHP Storm IDE,通常主机是容器内的 172.17.42.1。另外 remote_connect_back 可能不会很好地工作。尝试这样设置:
xdebug.remote_host=172.17.42.1
xdebug.remote_connect_back=Off
您可能需要寻找一种正确的方法来了解容器中主机的 IP,172.17.42.1 只是默认值,但可能并非总是如此。
它只在容器内执行对我有用:
pecl install -o -f xdebug \
&& rm -rf /tmp/pear \
&& echo "zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so" > /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_host=172.17.42.1" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_connect_back=On" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "memory_limit = 64M" > /usr/local/etc/php/conf.d/php.ini
然后,重启容器。
172.17.42.1为主机默认IP,当运行Docker。
可以获取到你在容器中执行的宿主机IP:
/sbin/ip route|awk '/default/ { print }'
我找到了更自动化的解决方案
在我的 ENTRYPOINT i 运行 startServices 脚本
#!/bin/bash
HOST_IP=`/sbin/ip route | awk '/default/ { print }'`
head -n -1 /etc/php5/mods-available/xdebug.ini > /etc/php5/mods-available/xdebug.tmp
echo "xdebug.remote_host="$HOST_IP >> /etc/php5/mods-available/xdebug.tmp
rm /etc/php5/mods-available/xdebug.ini
mv /etc/php5/mods-available/xdebug.tmp /etc/php5/mods-available/xdebug.ini
/usr/bin/supervisord
它获取主机的当前 ip 地址并替换 xdebug.ini 中的行,然后 运行 supervisord 正在启动所有东西
我的初始xdebug.ini
zend_extension=xdebug.so
[xdebug]
; priority=999
xdebug.remote_autostart=true
xdebug.remote_enable = On
xdebug.remote_connect_back = Off
xdebug.remote_port = 9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.var_display_max_data = 2048
xdebug.var_display_max_depth = 128
xdebug.max_nesting_level = 500
xdebug.remote_host=127.0.0.1
在 运行 脚本之后,我会得到这样的东西
zend_extension=xdebug.so
[xdebug]
; priority=999
xdebug.remote_autostart=true
xdebug.remote_enable = On
xdebug.remote_connect_back = Off
xdebug.remote_port = 9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.var_display_max_data = 2048
xdebug.var_display_max_depth = 128
xdebug.max_nesting_level = 500
xdebug.remote_host=172.17.0.1
其中172.17.0.1是我当前主机ip
在以下IP下我的容器运行在我的Webbrowser中成功
我还创建了一个卷来在我的容器和我的文件系统之间共享文件
docker run --name lampf -d -p 32775:80 -v /Users/sja/Sites/lamkepf2:/var/www/html --link=lampf_db:db codinglimo/apache_php540_gs_imgmck_pdflib9
现在我在我的容器中也成功安装了 xDebug xdebug.ini
zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so"
xdebug.remote_enable=on
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.profiler_enable=0
xdebug.profiler_output_dir="/temp/profiledir"
PHPStorm 也配置好了
http://img2.picload.org/image/iowdpww/xdebug.png
但是我 index.php 中的断点被忽略了? 我的错误是什么?
问题在谢尔盖的帮助下得到解决
我的新xdebug.ini
zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so"
xdebug.remote_enable=on
#xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_connect_back=On
xdebug.remote_handler=dbgp
xdebug.profiler_enable=0
xdebug.profiler_output_dir="/temp/profiledir"
您的 Docker 容器看不到 IP 为 127.0.0.1 的 PHP Storm IDE,通常主机是容器内的 172.17.42.1。另外 remote_connect_back 可能不会很好地工作。尝试这样设置:
xdebug.remote_host=172.17.42.1
xdebug.remote_connect_back=Off
您可能需要寻找一种正确的方法来了解容器中主机的 IP,172.17.42.1 只是默认值,但可能并非总是如此。
它只在容器内执行对我有用:
pecl install -o -f xdebug \
&& rm -rf /tmp/pear \
&& echo "zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so" > /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_host=172.17.42.1" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_connect_back=On" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "memory_limit = 64M" > /usr/local/etc/php/conf.d/php.ini
然后,重启容器。
172.17.42.1为主机默认IP,当运行Docker。 可以获取到你在容器中执行的宿主机IP:
/sbin/ip route|awk '/default/ { print }'
我找到了更自动化的解决方案 在我的 ENTRYPOINT i 运行 startServices 脚本
#!/bin/bash
HOST_IP=`/sbin/ip route | awk '/default/ { print }'`
head -n -1 /etc/php5/mods-available/xdebug.ini > /etc/php5/mods-available/xdebug.tmp
echo "xdebug.remote_host="$HOST_IP >> /etc/php5/mods-available/xdebug.tmp
rm /etc/php5/mods-available/xdebug.ini
mv /etc/php5/mods-available/xdebug.tmp /etc/php5/mods-available/xdebug.ini
/usr/bin/supervisord
它获取主机的当前 ip 地址并替换 xdebug.ini 中的行,然后 运行 supervisord 正在启动所有东西
我的初始xdebug.ini
zend_extension=xdebug.so
[xdebug]
; priority=999
xdebug.remote_autostart=true
xdebug.remote_enable = On
xdebug.remote_connect_back = Off
xdebug.remote_port = 9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.var_display_max_data = 2048
xdebug.var_display_max_depth = 128
xdebug.max_nesting_level = 500
xdebug.remote_host=127.0.0.1
在 运行 脚本之后,我会得到这样的东西
zend_extension=xdebug.so
[xdebug]
; priority=999
xdebug.remote_autostart=true
xdebug.remote_enable = On
xdebug.remote_connect_back = Off
xdebug.remote_port = 9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.var_display_max_data = 2048
xdebug.var_display_max_depth = 128
xdebug.max_nesting_level = 500
xdebug.remote_host=172.17.0.1
其中172.17.0.1是我当前主机ip