PhpStorm 多 docker 主机名解析

PhpStorm multi-docker hostname resolution

我有一个完全设置的 docker 环境,配备了 Xdebug,正确设置了 PhpStorm。我的环境有多个容器 运行ning 用于不同的功能。一切似乎都很好。 CLI/Web 交互都在断点处停止,没问题。然而...

我有一个代码片段如下:

// test.php
$host = gethostbyname('db'); //'db' is the name of the other docker box, created with docker-compose
echo $host;

如果我 运行 通过 bash 在 'web' docker 实例中:

php test.php
172.21.0.2

如果我运行通过浏览器:

172.21.0.2

如果我 运行 通过 PhpStorm run/debug 按钮 (Shift+F9):

docker://docker_web:latest/php -dxdebug.remote_enable=1 -dxdebug.remote_mode=req -dxdebug.remote_port=9000 -dxdebug.remote_host=172.17.0.1 /opt/project/test.php
db

没有解决!为什么会这样,我该如何解决?

碰巧,我的 docker 环境是用 docker-compose 构建的,所有相关容器都在同一个网络上,并且有一个适当的 depends_on 层次结构。

不过。 PHPStorm 实际上被设置为使用纯 docker,而不是 docker-compose。它可以很好地连接到 docker 守护进程,但是因为容器没有构建 composer-aware,所以它没有利用我的 docker-compose.yml 中定义的网络布局.一旦我告诉 PHPStorm 使用 docker-compose,它工作正常。

顺便说一句,我注意到在加载容器后 运行 一个 in-IDE 调试会话,并导致容器在脚本结束时退出。为了解决这个问题,我必须为 PHPStorm 创建一个镜像调试容器以供按需使用。我的配置如下:

version: '3'

services:
  web: &web
    build: ./web
    container_name: dev_web
    ports:
      - "80:80"
    volumes:
      - ${PROJECTS_DIR}/project:/srv/project
      - ./web/logs/httpd:/var/log/httpd
    depends_on:
      - "db"
    networks:
      - backend

  web-debug:
    << : *web
    container_name: dev_web_debug
    ports:
      - "8181:80"
    command: php -v

  db:
    image: mysql
    container_name: dev_db
    ports:
      - "3306:3306"
    volumes:
      - ./db/conf.d:/etc/mysql/conf.d
      - ./db/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
    networks:
      - backend

networks:
  backend:
    driver: bridge

这让我能够在-IDE 现场调试而不用杀死我的主 Web 容器。