【问题标题】:Can I store Xdebug inside separate docker container?我可以将 Xdebug 存储在单独的 docker 容器中吗?
【发布时间】:2020-10-07 20:20:09
【问题描述】:

我是 Docker 和 docker-compose 的新手。我已经遇到了最好将每个进程放在单独的容器中的观点。所以我把 Composer、npm、artisan、Redis、pma 等东西放在单独的容器中。

现在我正在尝试集成 Xdebug 并在 PhpStorm 中使用它。无法理解如何分开。我真的应该吗?我理解这个范式对吗?

我的 docker-compose.xml:

version: '3'

networks:
  laravel:

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    ports:
      - "8088:80"
    volumes:
      - ../src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - mysql
    networks:
      - laravel

  mysql:
    image: mysql:5.7.22
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - laravel

  php:
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: php
    volumes:
      - ../src:/var/www/html
    ports:
      - "9000:9000"
    networks:
      - laravel

  pma:
    image: phpmyadmin/phpmyadmin
    container_name: pma
    environment:
      PMA_HOST: mysql
      PMA_PORT: "3306"
    ports:
      - "7760:80"
    links:
      - mysql
    networks:
      - laravel

  redis:
    image: redis:5-alpine
    container_name: redis
    command: redis-server --bind 0.0.0.0 --requirepass secret@123
    networks:
      - laravel
    ports:
      - "6379:6379"
    restart: unless-stopped
    volumes:
      - ./redis:/data

  queues:
    build:
      context: ./queues
      dockerfile: Dockerfile
    container_name: queues
    command: php /var/www/html/artisan queue:listen
    depends_on:
      - nginx
      - redis
    volumes:
      - ../src:/var/www/html
    networks:
      - laravel

  laravel-echo-server:
    image: oanhnn/laravel-echo-server
    container_name: laravel-echo-server
    depends_on:
      - redis
    environment:
      LARAVEL_ECHO_SERVER_AUTH_HOST: http://localhost:8088
      LARAVEL_ECHO_SERVER_DEBUG: 'true'
      LARAVEL_ECHO_SERVER_DB: redis
      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_PREFIX: laravel_
      REDIS_PASSWORD: secret@123
      REDIS_DB: 0
    networks:
      - laravel
    ports:
      - 6001:6001
    restart: unless-stopped

  artisan:
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: artisan
    volumes:
      - ../src:/var/www/html
    depends_on:
      - php
      - mysql
    working_dir: /var/www/html
    entrypoint: ['php', '/var/www/html/artisan']
    networks:
      - laravel

  xdebug:
    build:
      context: ./xDebug
      dockerfile: Dockerfile
    container_name: xdebug
    depends_on:
      - php
    working_dir: /var/www/html
    networks:
      - laravel

  composer:
    image: composer:latest
    container_name: composer
    volumes:
      - ../src:/var/www/html
    working_dir: /var/www/html
    networks:
      - laravel

  npm:
    image: node:latest
    container_name: npm
    volumes:
      - ../src:/var/www/html
    working_dir: /var/www/html
    entrypoint: ['npm']
    networks:
      - laravel

  git:
    image: alpine/git
    container_name: git
    volumes:
      - ../src:/var/www/html
    working_dir: /var/www/html
    networks:
      - laravel

【问题讨论】:

  • Xdebug 只是另一个 PHP 模块/扩展,因此它必须在 PHP 所在的同一容器中(成为其中的一部分)使用。
  • 实际上,您可以这样做,而且这种方法有一些好处。作为起点检查文章Speeding Up PHP in Docker w/ XDebugDeveloping at Full Speed with Xdebug
  • @SerhiiPopov 这种方法将带有 php-fpm 的整个 Xdebug 嵌入到另一个容器中,这似乎不是 OP 的重点(因为他们似乎希望将调试器保留在一个容器中并且另一个应用程序)。除此之外,有趣的方法!

标签: php laravel docker xdebug


【解决方案1】:

不,您应该在您尝试调试的容器中包含 Xdebug(无论是 Laravel 还是任何其他 PHP 应用程序)。

实际上,您不应将应用程序中每个组件的每个部分都分解为不同的容器,而应根据应用程序内部的关注点分离概念来设置容器,通常基于它们在应用程序架构中的角色。

示例(每个项目符号都是一个容器):

  • 具有 API 的 HTTP 路由的应用程序服务器
  • 工匠队列
  • 带有 Angular/React/etc 的静态内容服务器(这个也可以与第一个捆绑)
  • Redis 数据库
  • MySQL 数据库

对于每一个,安装运行/调试/分析应用程序所需的一切(即 mysql+mysql-cli 或 PHP+composer+Xdebug)。

您可以在this answer阅读更多内容。

【讨论】:

  • 我认为在将应用程序部署到产品时会很有用,因为我们不需要在产品中使用 Xdebug,只需删除此容器即可。放在一个容器里怎么办?
  • 是的,但是因为它是一个扩展,你应该在镜像中安装它和/或在生产中禁用它。无法在单独的容器中使用它。
  • 理论上,我可以在板上用 PHP 和 composer 创建一个单独的容器,然后在上面安装 xdebug。还是闻起来很奇怪?
  • 是的,闻起来很奇怪。它无法调试应用程序(因为它不是应用程序的一部分)。
  • 您可以将文件从 Xdebug 导出到一个卷中,但您仍然需要在要调试的应用程序的 php.ini 上设置它以链接扩展文件。它没有在单独的容器中使用(如果主容器不存在,则不会存在),因此通常我们将它们放在一起(因为它涉及应用程序本身)。这属于high observability principle in this RedHat doc for designing cloud-native applications,它可能会给你一些见解。
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
相关资源
最近更新 更多