Using xdebug through Docker container in PhpStorm

Viewed 4222

I've read some posts about this but none helped in my case or simply overlooked the missing piece.

I cannot get xdebug to work on PhpStorm using a Docker container.

Docker-compose.yml

version: '2'

services:
  web:
    image: nginx:latest
    volumes:
    - .:/usr/share/nginx/html
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    - ./nginx/logs:/var/logs/nginx
    - ./nginx/site-enabled/default.conf:/etc/nginx/sites-enabled/default.conf
    ports:
    - "80:80"
    depends_on:
    - php

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_DATABASE: local_db
      MYSQL_USER: root
      MYSQL_PASSWORD: 1234
    ports:
    - "3306:3306"

  php:
    build: images/php
    volumes:
    - .:/usr/share/nginx/html
    - ./config/docker/php/php.ini:/usr/local/etc/php/php.ini
    - ./config/docker/php/ext-xdebug.ini:/usr/local/etc/php/conf.d/ext-xdebug.ini
    - ./config/docker/php/php-fpm.conf:/usr/local/etc/php-fpm.conf
    user: www-data
    depends_on:
    - db

config/docker/php/ext-xdebug.ini

zend_extension="/usr/lib/php7/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.overload_var_dump=1
xdebug.default_enable=1
xdebug.remote_autostart=1
xdebug.idekey=PHPSTORM
xdebug.remote_connect_back=1
xdebug.remote_host=172.20.0.1 # ip of host inside docker container
xdebug.remote_log=/usr/share/nginx/html/xdebug.log

error from xdebug.log

Log opened at 2017-05-31 11:01:14
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Checking header 'REMOTE_ADDR'.
I: Remote address found, connecting to 172.20.0.1:9000.
W: Creating socket for '172.20.0.1:9000', poll success, but error: Operation now in progress (29).
E: Could not connect to client. :-(
Log closed at 2017-05-31 11:01:14

In PhpStorm I'm using remote debugger with following settings:

server

Host - 127.0.0.1  
Port - 80 

Absolute path on server

/usr/share/nginx/html

IDE session key

PHPSTORM
2 Answers

I've found that the following config on ext-xdebug.ini works for Docker for Mac

xdebug.remote_connect_back=0
xdebug.remote_host=host.docker.internal

Docker automatically defines host.docker.internal within containers. So we simply point xdebug to think host.docker.internal is the IP of host machine (which obviously is). This way, we don't have to rely on ever changing internal IP between docker container and host.

More information can be found here https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

Related