CodeStar Academy
  • Trang chủ
  • Khóa học
  • Lịch khai giảng
  • Blog
  • Liên hệ
    • Trang chủ
    • Khóa học
    • Lịch khai giảng
    • Blog
    • Liên hệ

    XDebug vs Docker

    • March 12, 2021
    • Posted by: Nhung Nguyen
    • Category: Uncategorized
    No Comments

    Thấy anh/chị em dùng docker khá là vất vả trong việc setup XDebug nên share config của dự án mình đang làm cho anh/chị em tham khảo.

    1. Dựng docker cho dự án

    Dự án hiện tại gồm 2 phần.
    ・ Hệ thống cũ bằng cakephp v2.x, php5.6
    ・ Hệ thống mới upgrade lên cakephp 4.x vs php 7
    ・ DB thì cả hai hệ thống dùng chung mysql 5.6.x
    ・ Verion upgrade thì dùng cache bằng Redis.
    Đầu tiên thì ta phải tạo dockerfile cho 2 phần hệ thống cũ vs hệ thống mới.
    Các bạn tham khảo 2 file dưới đây.

    Docker file cakev2.

    FROM php:5.6-apache
    
    #install all the system dependencies and enable PHP modules
    RUN apt-get update && apt-get install -y \
          libicu-dev \
          libpq-dev \
          zlib1g-dev \
          libzip-dev \
          libmcrypt-dev \
          libxml2-dev \
          mysql-client \
          curl \
          git \
          zip \
          unzip \
          vim \
        && rm -r /var/lib/apt/lists/* \
        && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
        && docker-php-ext-install \
          intl \
          mbstring \
          mcrypt \
          xml \
          pdo_mysql \
          pdo_pgsql \
          pgsql \
          zip \
          opcache
    
    # Install composer
    RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
    
    # Install Xdebug
    RUN curl -fsSL 'https://xdebug.org/files/xdebug-2.4.0.tgz' -o xdebug.tar.gz \
        && mkdir -p xdebug \
        && tar -xf xdebug.tar.gz -C xdebug --strip-components=1 \
        && rm xdebug.tar.gz \
        && ( \
        cd xdebug \
        && phpize \
        && ./configure --enable-xdebug \
        && make -j$(nproc) \
        && make install \
        ) \
        && rm -r xdebug \
        && docker-php-ext-enable xdebug
    ARG CAKEV2_XDEBUG_REMOTE_HOST
    ARG CAKEV2_XDEBUG_REMOTE_PORT
    ARG CAKEV2_XDEBUG_IDEKEY
    RUN echo "date.timezone=Europe/Warsaw" >> /usr/local/etc/php/php.ini \
        && echo "xdebug.default_enable=1" >> /usr/local/etc/php/php.ini \
        && echo "xdebug.remote_enable=1" >> /usr/local/etc/php/php.ini \
        && echo "xdebug.remote_port=$CAKEV2_XDEBUG_REMOTE_PORT" >> /usr/local/etc/php/php.ini \
        && echo "xdebug.remote_handler=dbgp" >> /usr/local/etc/php/php.ini \
        && echo "xdebug.remote_connect_back=0" >> /usr/local/etc/php/php.ini \
        && echo "xdebug.remote_host=$CAKEV2_XDEBUG_REMOTE_HOST" >> /usr/local/etc/php/php.ini \
        && echo "xdebug.idekey=$CAKEV2_XDEBUG_IDEKEY" >> /usr/local/etc/php/php.ini \
        && echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/php.ini \
        && echo "ServerName localhost" >> /etc/apache2/apache2.conf
    
    RUN a2enmod rewrite
    
    COPY host-conf/000-default.conf /etc/apache2/sites-available/000-default.conf
    
    RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
    

    Dockerfile cho bản cakephp v4.x

    #start with our base image (the foundation) - version 7.3.5
    FROM php:7.3.5-apache
    
    #install all the system dependencies and enable PHP modules
    RUN apt-get update && apt-get install -y \
          libicu-dev \
          libpq-dev \
          zlib1g-dev \
          libzip-dev  \
          mysql-client \
          git \
          zip \
          unzip \
          vim \
          redis-server \
        && rm -r /var/lib/apt/lists/* \
        && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
        && docker-php-ext-install \
          intl \
          mbstring \
          pdo_mysql \
          pdo_pgsql \
          pgsql \
          zip \
          opcache
    
    RUN pecl install -o -f redis \
    &&  rm -rf /tmp/pear \
    &&  docker-php-ext-enable redis
    
    #install composer
    RUN curl -sS https://getcomposer.org/installer | \
                php -- --install-dir=/usr/bin/ --filename=composer
    
    
    #set our application folder as an environment variable
    ENV APP_HOME /var/www/html
    
    #change uid and gid of apache to docker user uid/gid
    RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
    
    #change the web_root to laravel /var/www/html/public folder
    RUN sed -i -e "s/html/html\/webroot/g" /etc/apache2/sites-enabled/000-default.conf
    
    # enable apache module rewrite
    RUN a2enmod rewrite
    
    #copy source files and run composer
    COPY . $APP_HOME
    
    # install all PHP dependencies
    RUN composer install --no-interaction
    
    #change ownership of our applications
    RUN chown -R www-data:www-data $APP_HOME
    
    ARG CAKEV4_PHP_EXTENSION_XDEBUG
    ARG CAKEV4_XDEBUG_REMOTE_HOST
    ARG CAKEV4_XDEBUG_REMOTE_PORT
    ARG CAKEV4_XDEBUG_IDEKEY
    
    RUN echo $CAKEV4_PHP_EXTENSION_XDEBUG;
    #install & config xdebug
    RUN if [ $CAKEV4_PHP_EXTENSION_XDEBUG = "true" ] ; then \
        pecl install xdebug \
        && docker-php-ext-enable xdebug \
        && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
        && echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/xdebug.ini \
        && echo "xdebug.discover_client_host=true" >> /usr/local/etc/php/conf.d/xdebug.ini \
        && echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/xdebug.ini \
        && echo "xdebug.discover_client_host=true" >> /usr/local/etc/php/conf.d/xdebug.ini \
        && echo "xdebug.client_host=$CAKEV4_XDEBUG_REMOTE_HOST" >> /usr/local/etc/php/conf.d/xdebug.ini \
        && echo "xdebug.client_port=$CAKEV4_XDEBUG_REMOTE_PORT" >> /usr/local/etc/php/conf.d/xdebug.ini \
        && echo "xdebug.idekey=$CAKEV4_XDEBUG_IDEKEY" >> /usr/local/etc/php/conf.d/xdebug.ini \
        ;fi
    

    Sau khi tạo xong docker file cho 2 phần riêng thì mình tạo thêm một file docker-compose để tạo từng container cũng như liên kết các phần này vs mysql vs redis ( mình dựng cả phpmyadmin để dùng)

    File docker-compose.yml như dưới đây.

    version: '3'
    services:
      cakephpv2:
        build:
          context: ./cakev2
          args:
            - CAKEV2_PHP_EXTENSION_XDEBUG=${CAKEV2_PHP_EXTENSION_XDEBUG}
            - CAKEV2_XDEBUG_REMOTE_HOST=${CAKEV2_XDEBUG_REMOTE_HOST}
            - CAKEV2_XDEBUG_REMOTE_PORT=${CAKEV2_XDEBUG_REMOTE_PORT}
            - CAKEV2_XDEBUG_IDEKEY=${CAKEV2_XDEBUG_REMOTE_IDEKEY}
        depends_on:
          - mysql
        links:
          - "mysql"
        ports:
          - "8765:80"
        volumes:
          - ./cakev2:/var/www/html
          - ./cakev2/host-conf:/etc/apache2/sites-available/
          - ./logs/apache-cakephpv2:/var/log/apache2/
        extra_hosts:
          - "local.card.system:127.0.0.1"
        environment:
          - SECURITY_SALT=${CAKEV2_SECURITY_SALT}
          - MYSQL_URL=${CAKEV2_MYSQL_URL}
          - MYSQL_USERNAME=${CAKEV2_MYSQL_USERNAME}
          - MYSQL_PASSWORD=${CAKEV2_MYSQL_PASSWORD}
      cakephpv4:
        build:
          context: ./main
          args:
            - CAKEV4_PHP_EXTENSION_XDEBUG=${CAKEV4_PHP_EXTENSION_XDEBUG}
            - CAKEV4_XDEBUG_REMOTE_HOST=${CAKEV4_XDEBUG_REMOTE_HOST}
            - CAKEV4_XDEBUG_REMOTE_PORT=${CAKEV4_XDEBUG_REMOTE_PORT}
            - CAKEV4_XDEBUG_IDEKEY=${CAKEV4_XDEBUG_IDEKEY}
        depends_on:
          - mysql
          - redis
        links:
          - "mysql"
          - "redis"
        ports:
          - "8766:80"
        volumes:
          - ./main:/var/www/html
          - ./main/host-conf:/etc/apache2/sites-available/
          - ./logs/apache-cakephpv4:/var/log/apache2/
        extra_hosts:
          - "local.new.card.system:127.0.0.1"
        environment:
          - SECURITY_SALT=${CAKEV4_SECURITY_SALT}
          - MYSQL_URL=${CAKEV4_MYSQL_URL}
          - MYSQL_USERNAME=${CAKEV4_MYSQL_USERNAME}
          - MYSQL_PASSWORD=${CAKEV4_MYSQL_PASSWORD}
      mysql:
        image: mysql:5.6
        volumes:
          - mysql_data:/var/lib/mysql
        environment:
          - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
          - MYSQL_DATABASE=${MYSQL_DATABASE}
          - MYSQL_USER=${MYSQL_USER}
          - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        ports:
          - "6033:3306"
      phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links:
          - mysql
        environment:
          PMA_HOST: mysql
          PMA_PORT: 3306
          PMA_ARBITRARY: 1
          UPLOAD_LIMIT: 300M
        restart: always
        ports:
          - 8081:80
      redis:
        image: redis:4.0.5-alpine
        command: [ "redis-server", "--appendonly", "yes" ]
        hostname: redis
        volumes:
          - redis-data:/data
    volumes:
        mysql_data:
        redis-data:
    
    

    File .env dùng để setting các paramater cho phần docker như dưới đây( mấy cái *** thì các bạn tự điền tương ứng vs dự án của các bạn.

    #cake v2
    CAKEV2_PHP_EXTENSION_XDEBUG=true
    CAKEV2_XDEBUG_REMOTE_HOST=10.10.0.80
    CAKEV2_XDEBUG_REMOTE_PORT=9007
    CAKEV2_XDEBUG_REMOTE_IDEKEY=PHPSTORM
    
    CAKEV2_SECURITY_SALT=****
    CAKEV2_MYSQL_URL=mysql
    CAKEV2_MYSQL_USERNAME=root
    CAKEV2_MYSQL_PASSWORD=root
    
    #cakev4
    CAKEV4_PHP_EXTENSION_XDEBUG=true
    CAKEV4_XDEBUG_REMOTE_HOST=10.10.0.80
    CAKEV4_XDEBUG_REMOTE_PORT=9007
    CAKEV4_XDEBUG_IDEKEY=PHPSTORM
    CAKEV4_MYSQL_URL=mysql
    CAKEV4_MYSQL_USERNAME=root
    CAKEV4_MYSQL_PASSWORD=root
    CAKEV4_SECURITY_SALT=****
    
    #mysql
    MYSQL_ROOT_PASSWORD=root
    MYSQL_DATABASE=cakephp
    MYSQL_USER=****
    MYSQL_PASSWORD=***
    
    

    2. Cách cấu hình XDebug vs PHPStorm ###

    Liên quan đến phần cấu hình XDebug thì các bạn chú ý đến các param có chữ XDEBUG trong tên biến.
    Về cơ bản thì các paramater khsa là dễ hiểu. Có một cái chú ý là REMOTE_HOST thì các bạn phải setup đúng IP của máy mình.

    Chi tiết về việc setup các paramater này như thế nào thì các bạn có thể đọc thêm ở file dockerfile tương ứng vs từng môi trường cakev2 vs cakev4.

    Sau khi build hoàn chỉnh được hệ thống thì các bạn tiến hành setup trên PHPStorm ( verison của mình là phpstorm 2020.2)

    • Vào phần Refrenece > Languages & Frameworks > PHP > Debug Sửa Debug Port của Xdebug thành port 9007 ( port này được setting trong file .env). Nếu sửa thì sửa giá trị này thành giá trị set trong .env
      • Tạo 2 serveer Cakev2 vs Cakev4 như trong hình đính kèm. Chú ý sửa giá trị port vs absolute path cho đúng như trong hình.
    alt text

    • Run > Edit Configuration > Add – Chọn PHP Remote Debug. Tạo tương ứng cakev2 vs cakev4 tương ứng Chú ý setting giá trị IDE Key thành giá trị mình set trong file .env lúc chạy docker ( ở đây mình để là PHPSTORM) Ấn Validate để check xe config của mình đã hoàn thành chưa.

    Chúc các bạn ngày càng làm việc smart hơn

    Tác giả: Đặng Văn Hiến

    Leave a Reply Cancel reply

    Về chúng tôi

    CodeStar hướng đến việc mang lại những trải nghiệm mới cho Học viên trong mỗi buổi học thông qua việc tham gia vào các dự án tại CodeStar

    Địa chỉ

    Tầng 4, Tòa CT1, Bắc Hà C14, Tố Hữu, Trung Văn, Nam Từ Liêm, Hà Nội.

    0865183328

    [email protected]

    Quick Links

    Khóa học

    Lịch khai giảng

    Kênh Youtube

    Liên hệ


    Copyright © 2020. CodeStar

    Search