Docker + PHPStorm 搭建虚拟化开发环境

PHPStorm 2016.3 版本起, PHPStormDocker 提供了更友好的支持. 在之前的版本中, 想在 PHPStorm 中使用 Docker 容器内的 PHP 解释器(interpreter)来调试代码是比较麻烦的, 我们需要在 Docker 容器内安装并启动 sshd 服务(由于一个 Docker 只能服务单个进程, 还需要借助 supervisord 等进程管理工具来实现), 再配置 PHPStorm 通过 ssh 的方式访问容器内的 PHP 解释器. 不过现在, Docker 已成为了 PHPStorm 的一等公民. 那么是时候和 Vagrant 说再见, 投入 Docker 的怀抱啦. 当然, 如果你还是更喜欢 Vagrant, 可以参考我的前一篇博客, Vagrant + PHPStorm 搭建虚拟化开发环境的实践方案

容器

Dockerfile 配置, 容器基于Docker官方的 PHP 镜像, 并开启了 xdebug 扩展.

FROM php:7.1-fpm  
RUN pecl install xdebug  
RUN docker-php-ext-enable xdebug

ADD php.ini /usr/local/etc/php/php.ini  

然后,通过 socat 工具 (Mac下可通过 brew install socat 安装) 将 Docker 数据接口转换为一个 Tcp 网络接口暴露给 PHPStorm (从 PHPStorm 2017.1 起,API URL可直接填写 unix:///var/run/docker.sock, 而无需再借助 socat 做转发) , 具体命令如下:

$ socat TCP-LISTEN:2375,reuseaddr,fork,bind=localhost UNIX-CONNECT:/var/run/docker.sock

设置 Docker 配置, 在 API URL 一栏中填写经 socat 提供的 Tcp 接口

Remote Interpreter

Language&Frameworks 中找到 PHP 相关配置

修改 Interpreter 配置, 添加远程解释器(Remote Interpreter) 并选用 Docker 模式, 选择 Server 及对应的 Image

需要注意的是, 当使用 docker-compose(version:2) 工具启动容器时, 默认的 Docker 网络名称为 目录名_default, 具体可用 docker network ls 命令进行查看. 所以,当使用 docker-compose 时, 还需修改 Docker Container 配置, 将 Network mode 设为对应值.

运行单元测试, 可以看到, PHPStorm 已通过调用 Docker 容器中的 远程PHP解释器 来执行该测试代码了.

XDebug

php.ini 中加入 XDebug 相关配置:

[xdebug]
xdebug.remote_enable=1  
xdebug.remote_port=5902  
xdebug.remote_host=docker_host  

docker-compose.yml 文件中 extra_hosts 配置, 此处, 192.168.1.6 为宿主机的内网IP (ifconfig en0), extra_hosts 相当于向容器的 /etc/hosts加入 中加入 docker_host 192.168.1.6 映射关系. 这样, 当带有调试标志的请求到达容器内解释器中时, XDebug 会通过配置的 remote_portremote_host 通知宿主机IDE(PHPStorm), 进入调试状态. 需要注意的是, 在网络环境发生变化时, 宿主机的内网IP可能发生改变, 这个时候需要改变 docker-compose.yml 文件中的 extra_hosts 配置的IP地址, 并执行 docker-compose up -d 重新创建容器.

version: '2'  
services:  
  web:
    build: ./web
    container_name: med-news-web
    extra_hosts:
      docker_host: 192.168.1.6

PHPStorm 中设置 XDebug 端口及 Server 配置

需要注意设置项目在宿主主机的目录与在容器中目录的映射关系

开启监听状态

Chrome 浏览器中安装 XDebug Helper 插件

PHPStorm 中设置断点, 将 XDebug Helper 切换到 Debug 状态, 并刷新页面, 如下图, 程序已经进入调试状态了

Show Comments