Mac下配置phpstorm+xdebug+docker(vmware虚拟机)进行断点调试

环境说明

本机Mac,安装PHPstorm,借助xdebug,远程调试位于VMware虚拟机(Ubuntu 14.04)中的Docker容器。

为什么要写这么复杂呢,因为如果你不需要在docker外面套VMware的虚拟机,可以直接从 虚拟机与Docker Remote API的配置 开始阅读,不需要docker的话,可以直接从 (在docker中)安装xdebug 开始阅读(PHPstorm的配置需要根据情况修改)~

VMware通过桥接网络,使得Ubuntu虚拟机与Mac本机位于同一网段,互相能ping通。

  • Mac IP: 192.168.0.105
  • Ubuntu配置静态IP: 192.168.0.200
  • 将Docker容器内的80端口映射为容器外的12345端口
  • Docker Remote API使用虚拟机的2375端口

附 Ubuntu 16.04 配置静态IP的配置文件( /etc/network/interfaces )内容:

1
2
3
4
5
6
auto ens33
iface ens33 inet static
address 192.168.0.200
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameserver 1.1.1.1 8.8.8.8 114.114.114.114

其中 ens33 可能会根据环境不同而不同,可以使用 ifconfig 查看,是 ens33 就填 ens33 ,是 en0 就填 en0

虚拟机与Docker Remote API的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
vim /lib/systemd/system/docker.service
// 修改 ExecStart=/usr/bin/dockerd -H fd:// 为下面的内容:
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
// 重新加载docker配置并重启
systemctl daemon-reload
service docker restart
// 查看是否成功开启Docker Remote API
root@master:~# ps -ef|grep docker
root 11619 1 1 08:16 ? 00:00:00 /usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
root 11629 11619 0 08:16 ? 00:00:00 docker-containerd --config /var/run/docker/containerd/containerd.toml
root 11752 1164 0 08:16 pts/0 00:00:00 grep --color=auto docker

测试是否成功开启Docker Remote API,在Mac本机的终端上测试(IP记得换成自己的):

1
docker -H tcp://192.168.0.200:2375 images

配置docker中的环境变量

需要配置两组环境变量:

  • PHP_IDE_CONFIG
    • serverName:IDE的配置名,先起个名字,具体配置我们在下面说
  • XDEBUG_CONFIG
    • remote_host 192.168.0.105
    • remote_port 9101

docker run

1
docker run -di -p 12345:80 --env PHP_IDE_CONFIG="serverName=cytotest" --env XDEBUG_CONFIG="remote_host=192.168.0.105 remote_port=9101"

docker-compose

docker-compose.yml:

1
2
3
4
5
6
7
8
9
version: "2"
services:
- web:
- image: xx
- ports:
- 12345:80
- environment:
- PHP_IDE_CONFIG: "serverName=cytotest"
- XDEBUG_CONFIG: "remote_host=192.168.0.200 remote_port=9101"

(在docker中)安装xdebug

(在docker容器中)依次执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 进入docker中的web根目录
cd /var/www/html
php -r "phpinfo();">1.txt
// 浏览器访问
http://192.168.0.200:12345/1.txt
// 全选后粘贴到:
https://xdebug.org/wizard
// 根据分析结果,复制xdebug的链接,在docker中使用wget下载
wget http://xdebug.org/files/xdebug-2.8.1.tgz

建议如下几步按xdebug官网的说明来进行:

1
2
3
4
5
6
7
8
tar -xvzf xdebug-2.8.1.tgz
cd xdebug-2.8.1
phpize
./configure
make
cp modules/xdebug.so /usr/lib/php/20151012
vim /usr/local/etc/php/php.ini

php.ini配置及说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[xdebug]
zend_extension=... // 根据你的情况修改,上一步cp到哪里就是哪里
xdebug.remote_enable=1 // 启用远程调试
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=192.168.0.105 // 远程调试机子的IP地址,这里就是Mac本机的IP地址,不清楚的可以在docker容器根目录中用 print_r($_SERVER['REMOTE_ADDR']); 打印出来
xdebug.remote_port=9101 // 默认9000,为避免冲突,建议修改
xdebug.idekey=PHPSTORM // idekey,要记住喔,后面会用到很多次
xdebug.auto_trace=1
xdebug.auto_exception_trace=1
xdebug.remote_autostart=1
xdebug.collect_vars=1
xdebug.collect_return=1
xdebug.collect_params=1
xdebug.show_local_vars=1
xdebug.profiler_enable=1
xdebug.trace_enable_trigger=1
xdebug.remote_log="/var/log/php.xdebug.log" // 日志位置,出了错误可以通过日志来寻找原因

然后把xdebug.so和php.ini复制到docker容器外:

1
docker cp container_id:/container/path/xx .

修改dockerfile,把xdebug.so和php.ini复制到相应位置,然后重新build和run。

PHPstorm中的配置

PHPstorm借助Docker Remote API操作虚拟机中的Docker:

下面这个图的image name说明可以看下下个图:

这个server name填写上面Docker环境变量中serverName对应的值,我这里就是cytotest。

根据自己的情况配置路径映射:

根据自己情况选:

至此PHPstorm的配置结束。

开始debug

切到PHPstorm,在代码右侧行号左键单击,即可在该行下断点。下好断点后,选第二个小虫子这个:

这时候PHPstorm会自动用默认浏览器打开刚才配置的start url,我们先不管,先点一下第四个小电话:

让小电话变成这个样子:

这个时候再去浏览器刷新一下,如果配置成功,则会在断点出停下来,并跳回PHPstorm的页面:

开始你的调试之旅吧~

如有错误,敬请指正,感谢~

参考资料

窝很可爱,请给窝钱