Xubuntu 20.4、Xdebug 3 和 Docker:无法从容器连接到主机

Xubuntu 20.4、Xdebug 3 和 Docker:无法从容器连接到主机

我已经为此奋斗了一段时间,现在我终于成功了 :-)

我在 Ubuntu 20.04 笔记本电脑中安装了 xdebug 的 php 容器:

  rest-example-php-8:
    container_name: rest-php
    build: ./docker/php/
    expose:
       - 9000
    depends_on:
      - rest-example-mysql
      - rest-example-redis
    volumes:
      - .:/var/www/html
      - ./docker/php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
      - ./docker/php/conf.d/error_reporting.ini:/usr/local/etc/php/conf.d/error_reporting.ini
    extra_hosts:
      - "host.docker.internal:host-gateway"

构建文件:

FROM php:8.0-fpm

RUN pecl install xdebug \
    && docker-php-ext-enable xdebug

以及 xdebug 配置

[xdebug]
xdebug.mode=debug
xdebug.client_port=9003
xdebug.start_with_request=yes
xdebug.discover_client_host=true
xdebug.client_host=host.internal.docker
xdebug.idekey=PHPSTORM
xdebug.log = "/var/log/xdebug.log"
xdebug.output_dir = "/var/log/profiler"

当我尝试使用 phpstorm 或直接在使用 bash 的容器中执行任何 php 脚本时,出现此错误:

Xdebug: [Step Debug] Could not connect to debugging client. Tried: fe80:0:0:0:e898:eeff:fefb:e968%vetha93964b:9003 (fallback through xdebug.client_host/xdebug.client_port) :-(

这是使用 PHP storm 的情况,如果我直接在容器中执行此操作:

Could not connect to debugging client. Tried: host.internal.docker:9003 (fallback through xdebug.client_host/xdebug.client_port) :-(

我尝试过的事情:

  1. 更改客户端主机。我试过 ips 和主机名,但没有成功

  2. 在我的宿主机上打开我的9003端口,根据nmap查看是否开放:

    nmap localhost 启动 Nmap 7.80 (https://nmap.org) 于 2021-08-04 19:53 CEST Nmap 扫描报告 localhost (127.0.0.1) 主机已启动(延迟 0.000061 秒)。未显示:998 个关闭的端口 港口国服务 631/tcp 开放 ipp 9003/tcp 开放 未知

  3. 我还检查了 PHP Storm 正在监听

sudo lsof -i -P -n | grep LISTEN | grep 9003
java       4566      myuser   54u  IPv6 543552      0t0  TCP *:9003 (LISTEN)

问题似乎出在主机上,我也尝试从容器访问主机的 9003,但没有成功。

有谁知道发生了什么事,我还能测试什么?任何帮助都将不胜感激 :-)

答案1

我自己发现了问题...我的 docker-composer.yaml 文件中缺少网络配置,我添加了它,现在看起来像这样:

version: '3.7'

services:

  rest-mysql:
    container_name: rest-mysql
    image: mysql:latest
    environment:
      MYSQL_DATABASE: gotrendier
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    networks:
      - go-rest.local
    ports:
      - "3307:3306"

  rest-php-8:
    container_name: rest-php
    build: ./docker/php/
    expose:
       - 9000
    networks:
      - go-rest.local
    volumes:
      - .:/var/www/html
      - ./docker/php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
      - ./docker/php/conf.d/error_reporting.ini:/usr/local/etc/php/conf.d/error_reporting.ini
    extra_hosts:
      - "host.internal.docker:host-gateway"

  nginx:
    container_name: rest-nginx
    image: nginx
    restart: unless-stopped
    networks:
      - go-rest.local
    volumes:
      - ./docker/nginx/.htpasswd:/etc/nginx/.htpasswd:ro
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./docker/nginx/config:/etc/nginx/conf.d:ro
      - ./:/var/www/html
    ports:
      - "80:80"

  rest-redis:
    container_name: rest-redis
    image: redis:alpine
    networks:
      - go-rest.local
    ports:
      - "6380:6379"

networks:
  go-rest.local:

相关内容