我可以将 Xdebug 存储在单独的 docker 容器中吗?
Can I store Xdebug inside separate docker container?
我是 Docker 和 docker 的新手。我遇到了将每个进程放在单独的容器中更好的观点。所以我把 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(无论是 Laravel 还是任何其他 PHP 应用程序)。
实际上,您不应该将应用程序中每个组件的每个部分都分解到不同的容器中,而应该根据应用程序内部的关注点分离概念来设置容器,通常基于它们在应用程序体系结构中的角色。
示例(每颗子弹都是一个容器):
- 具有 API HTTP 路由的应用程序服务器
- Artisan队列
- 带有 Angular/React/etc 的静态内容服务器(这个也可以与第一个捆绑在一起)
- Redis 数据库
- MySQL 数据库
并且对于每一个,安装run/debug/profile应用程序所需的一切(即mysql+mysql-cli,或PHP+composer+Xdebug)。
您可以在 this answer 阅读更多内容。
我是 Docker 和 docker 的新手。我遇到了将每个进程放在单独的容器中更好的观点。所以我把 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(无论是 Laravel 还是任何其他 PHP 应用程序)。
实际上,您不应该将应用程序中每个组件的每个部分都分解到不同的容器中,而应该根据应用程序内部的关注点分离概念来设置容器,通常基于它们在应用程序体系结构中的角色。
示例(每颗子弹都是一个容器):
- 具有 API HTTP 路由的应用程序服务器
- Artisan队列
- 带有 Angular/React/etc 的静态内容服务器(这个也可以与第一个捆绑在一起)
- Redis 数据库
- MySQL 数据库
并且对于每一个,安装run/debug/profile应用程序所需的一切(即mysql+mysql-cli,或PHP+composer+Xdebug)。
您可以在 this answer 阅读更多内容。