Port Forwarding for WSL2+Vscode, Docker Desktop with Wordpress+Xdebug3(+Certbot)

Quickly setup port fowarding for WSL2 to receive Xdebug signal within a Docker Container

Port Forwarding for WSL2+Vscode, Docker Desktop with Wordpress+Xdebug3(+Certbot)
Photo by Gaelle Marcel / Unsplash

Structure

Editor: VScode in WSL2
Development files: in WSL2
Docker: Docker Desktop v4.14.1(WSL2 based engine)
Windows 11 Home or Pro

Key Command(Powershell)

To allow xdebug data into WSL2 via port forwarding.
netsh interface portproxy set v4tov4 listenport=9003 listenaddress=WINDOWS_HOST_IP connectport=9003 connectaddress=$($(wsl hostname -I).Trim());

WINDOWS_HOST_IP(Internet IP)

ipconfig

Xdebug.ini

# xdebug.start_with_request = yes
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.client_port=9003
xdebug.discover_client_host = 0
xdebug.client_host=WINDOWS_HOST_IP

Potential Networking Issues

  • Windows Host IP could be either
    • via WSL HOST IP: 172.xxx (Windows11 Home)
    • via Internet IP: 192.xxx (Windows11 Pro)
  • Make sure port 9003 is not blocked by the Firewall

Browser Extension

  • Xdebug helper
    To trigger debug mode

or set xdebug.start_with_request = yes to debug on every request

launch.json

for plugin development. For other usage, change the "pathMappings" accordingly.

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
        "name": "Listen for Xdebug",
        "type": "php",
        "request": "launch",
        "port": 9003,
        "pathMappings": {
            "/var/www/html/wp-content/plugins/the-custom-plugin": "${workspaceRoot}",
          }
    }
  ]
}

Dockerfile(Wordpress+xdebug3+Certbot)

Certbot Support for HTTPS environment

FROM wordpress:6.1.0-php8.1-apache

# Install packages under Debian
RUN apt-get update && \
    apt-get -y install git

# Install XDebug from source as described here:
# https://xdebug.org/docs/install
# Available branches of XDebug could be seen here:
# https://github.com/xdebug/xdebug/branches
RUN cd /tmp && \
    git clone https://github.com/xdebug/xdebug.git && \
    cd xdebug && \
    git checkout xdebug_3_1 && \
    phpize && \
    ./configure --enable-xdebug && \
    make && \
    make install && \
    rm -rf /tmp/xdebug

# Certbot
RUN apt update && \
    apt install python3 python3-venv libaugeas0 -y && \
    python3 -m venv /opt/certbot/ && \
    /opt/certbot/bin/pip install --upgrade pip && \
    /opt/certbot/bin/pip install certbot certbot-apache && \
    ln -s /opt/certbot/bin/certbot /usr/bin/certbot

# Run the following command to generate certificate
# docker exec CONTAINER certbot --apache --non-interactive --agree-tos --email $EMAIL --domains $DOMAINS

# Copy xdebug.ini to /usr/local/etc/php/conf.d/
COPY ./xdebug.ini /usr/local/etc/php/conf.d/

# Since this Dockerfile extends the official Docker image `wordpress`,
# and since `wordpress`, in turn, extends the official Docker image `php`,
# the helper script docker-php-ext-enable (defined for image `php`)
# works here, and we can use it to enable xdebug:
RUN docker-php-ext-enable xdebug