生半可な気持ちでプログラマになった男日記

日々地獄の中をさまよっている糞雑魚プログラマの技術ブログ。テニスが好きです。

PHP 公式の Docker イメージを使って PHP + Apache + Xdebug の環境を構築する

案件で Docker を使って開発環境の構築をしたのでメモとして残しておきます。

今回作成したファイルの Github ページはこちらです。

github.com

構築する環境

Docker Compose を使って以下の条件を満たした開発環境の構築を行います。

先輩からの強いおすすめにより、今回は Docker Compose を使って環境を構築したいと思います。

今回は PHP7.1 の Apache サーバーのみで Web サーバーのコンテナしか作成しないので Docker Compose で作成してもあまり意味ないかもしれませんが、 DB サーバーいれて開発環境を整えることの方が多いと思うので、勉強がてら Docker Compose で構築します。

インストール

自分は Mac なので Docker for Mac を以下のページからインストールします。

ちなみに会員登録しないとインストールできないようですね。

Docker Store

f:id:pachory:20180915232327p:plain
Docker Store

インストールしたら docker コマンド使えるようになってますので、バージョン確認とかしてみてちゃんと動いてるか確認しましょう。

docker version

f:id:pachory:20180915232420p:plain
docker version

今回利用するコマンド達

今回 Docker Compose で環境構築する際に使ったコマンド達です。

build

docker-compose.yml ファイルを元にビルドする。

docker-compose build

up

docker-compose.yml ファイルを元にコンテナの作成+起動を行う。

docker-compose up -d

オプションで -d をつけることでバックグラウンドで実行可能。

down

docker-compose.yml ファイルを元にコンテナの停止+コンテナの削除を行う。

docker-compose down

start

コンテナを起動する。

コンテナが存在する場合にのみ実行可能。

docker-compose start

stop

コンテナを停止する。

コンテナは削除しない。

docker-compose stop

ps

現在のコンテナ情報の一覧を表示する。

docker-compose ps

exec

コンテナのプロセスを実行する。

bash オプションを追加することでコンテナ内にアクセスできる。

docker-compose exec サービス名 bash

設定ファイルの作成

yml ファイルの作成

今回作成するサービス情報を docker-compose.yml に定義していきます。

version: "3"

services:
  web:
    container_name: web_container
    build: .
    volumes:
    - マウント元のローカルディレクトリパス:マウント先のディレクトリパス
    ports:
    - 8800:80

build の項目は Dockerfile があるパスを入力します。

今回は web サーバーのみなのでこのファイルは以上です。

Dockerfile ファイルの作成

使用するイメージファイルの指定や、コンテナ起動後のサーバー内で実行するコマンド等を定義していきます。

今回は CakePHPXdebug が動く環境を設定したいのでそのインストールコマンドなどを定義していきます。

# イメージファイルの指定
FROM php:7.1-apache

RUN apt-get update

# vim インストール
RUN apt-get install -y vim

# php 拡張のインストール
RUN apt-get install -y libicu-dev libpq-dev
RUN docker-php-ext-install intl pdo pdo_pgsql mbstring

# Xdebug のインストール
RUN pecl install xdebug

# apacheのrewriteを有効にする
RUN a2enmod rewrite
COPY ./apache/sites-available/000-default.conf /etc/apache2/sites-available/

# php.ini への設定追加
ADD ./php/php-extention.ini /usr/local/etc/php/conf.d/

EXPOSE 80

RUN でコンテナ内のサーバーコマンドを実行することができます。

なので大体 RUN コマンドを使って CakePHP が動く環境や Xdebug のインストールのコマンドを定義していきます。

また、 PHP 公式の Docker イメージでは PHP の extension をインストールする便利コマンドが用意されてるようなので extension はそれらを使っていれていきます。

また、 ADDCOPY どちらもコンテナへのファイルの複製になりますが、細かい差などはよく分からないので検証してくれている方のリンクを貼っておきます。。

基本 ADD でいいのかなーと思ったり。

[docker] COPY とADD の違いを試してみた

Dockerfile でコンテナへコピーするファイルの作成

CakePHP で使う extension の設定や apache rewrite の有効化だったり、 Xdebug の設定を定義したファイルを作成します。

000-default.conf

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf

  # 以下を追記しただけ
    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

コンテナ内の設定ファイルの内容をコピーして必要箇所を追記したファイルを作成しているだけです。

php-extention.ini

[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

extension = "pdo_pgsql.so"

[xdebug]
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so
xdebug.coverage_enable=1
xdebug.default_enable=1
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/tmp"
xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.remote_host=ホスト名
xdebug.remote_port=9000

今回の仕様に合わせて php.ini に追記すべき内容を記載しているだけです。

docekr-compose up コマンドを実行してコンテナを起動

docker-compose up -d

これでめでたく PHP 公式の Docker イメージを利用した環境が構築できました。

めでたし。

最後に

色々ご教示してくださった会社の方々、ありがとうございました。

また、 Docker コンテナの web サーバーにある Xdebug と PhpStorm を連携させる方法は追々記事書こうと思います。。

取り急ぎ参考になったページ貼っときます。

PhpStorm + Docker for Mac(docker-compose)での PHPUnit と Remote Debug の設定 - Shin x Blog