前に何回かに分けて紹介したWordPressのDocker環境の構築方法を紹介しました。そのときはDocker Composeを使ってWordPress環境の公式環境を作成しました。

今回は作成したWordPress環境をベースに独自のDockerfileを作ってそこにXdebugを追加する方法を紹介します。

まずは前に作ったdocker-compose.ymlがこちらでした。

docker-compose.yml
version: '3.9'
services:
  wp:
    container_name: wp
    image: wordpress:php7.4
    restart: always
    working_dir: /var/www/html
    ports:
      - '8080:80'
    depends_on:
      - db
    volumes:
      - wpData:/var/www/html
      - ./my-theme:/var/www/html/wp-content/themes/my-theme
    environment:
      TZ: 'Asia/Tokyo'
      WORDPRESS_DB_HOST: 'db:3306'
      WORDPRESS_DB_USER: 'wordpress'
      WORDPRESS_DB_PASSWORD: 'wordpress'
      WORDPRESS_DB_NAME: 'wordpress_db'
      WORDPRESS_DEBUG: 1
  db:
    container_name: db
    image: mysql:8
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
    volumes:
      - dbData:/var/lib/mysql
    ports:
      - '3306:3306'
    environment:
      MYSQL_DATABASE: 'wordpress_db'
      MYSQL_ROOT_PASSWORD: 'wordpress'
      MYSQL_USER: 'wordpress'
      MYSQL_PASSWORD: 'wordpress'

volumes:
  dbData:
    driver: local
  wpData:
    driver: local

そこにあるwpコンテナの設定部分をいじっていきます。

Dockerfileを作成する

まずはWordPress環境をベースとしたDockerfileを作成します。DockerfileとはDocker上でコンテナを動かすための構成を書いたファイルです。

今までは公式イメージを使っていたのでDockerfileを使う必要はありませんでしたが、Xdebugを追加するに当たってDockerfileを作成しないといけないので作成します。

Dockerfile作成をするにしてもすでにあるWordPressイメージがあるのでWordPressを動かすための環境を1から作る必要はありません。Dockerの大きな特徴のひとつにDockerイメージをレイヤーの階層で構築していくことに特徴があります。実際、WordPressの公式イメージもPHPの公式イメージをベースに作っています。

以下がXdebugを追加するDockerfileです。

Dockerfile
FROM wordpress:php7.4

ENV PHP_IDE_CONFIG="serverName=wp"

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

COPY ./xdebug.ini /usr/local/etc/php/conf.d/

やっていることはいたってシンプルでWordPress公式イメージにXdebugを追加してXdebugを有効にしXdebugの環境設定をPHPの設定ファイルが入っているディレクトリに追加しているだけです。

DockerのPHP公式イメージは外部パッケージの追加方法がとても簡単でgdなどのパッケージの追加はもちろんXdebugといったPHPコアとは別のPECLのパッケージの追加も難しいことを設定することなく追加できます。

Xdebugの設定ファイルは以下のような形で作成します。

xdebug.ini
[xdebug]
xdebug.idekey= "wp"
xdebug.client_host = host.docker.internal
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.discover_client_host = 0
xdebug.remote_handler = "dbgp"
xdebug.client_port = 9001

上記はXdebug 3系の設定です。2系とはだいぶ設定が異なるので2系を入れたい場合は注意してください。

PHPの公式イメージはphp.iniがないですが、conf.dディレクトリに追加した外部パッケージの設定を追加すれば有効になるように作られています。なのでXdebugの設定のみを記述したxdebug.iniを作成しDockerfileがあるディレクトリと同じ場所に追加してください。

docker-compose.ymlを改修する

次にdocker-compose.ymlを改修します。先ほど説明した通りwpコンテナの設定の箇所のみ変更です。

wp:
  container_name: wp
  build: #変更箇所
    context: ./docker #変更箇所
    dockerfile: Dockerfile #変更箇所
  restart: always
  working_dir: /var/www/html
  ports:
    - '8080:80'
  depends_on:
    - db
  volumes:
    - wpData:/var/www/html
    - ./my-theme:/var/www/html/wp-content/themes/my-theme
  environment:
    TZ: 'Asia/Tokyo'
    WORDPRESS_DB_HOST: 'db:3306'
    WORDPRESS_DB_USER: 'wordpress'
    WORDPRESS_DB_PASSWORD: 'wordpress'
    WORDPRESS_DB_NAME: 'wordpress_db'
    WORDPRESS_DEBUG: 1

imageをbuildに変更してDockerfileのあるディレクトリを指定します。ディレクトリ構成はこんな形にします。

├── docker-compose.yml
└── wp
    ├── Dockerfile
    └── xdebug.ini

Dockerイメージをビルドする

これで独自イメージを作成する準備ができたので独自イメージをビルドをします。docker-compose.ymlのあるディレクトリに移動して下記のコマンドを実行します。

$ docker-compose build

これでビルドか完了したらdockerコンテナを立ち上げれば完了です。

まとめ

今回はDockerのWordPress環境にXdebugを追加する方法を紹介しました。docker-compose.ymlをベースに少しのDockerfileと設定ファイルで簡単にXdebugを追加することができます。Xdebugだけではなく別の外部パッケージの追加も応用して追加することはできるのでまた別の外部パッケージを追加する機会があったら紹介します。