PHP 公式の Docker イメージを使って PHP + Apache + Xdebug の環境を構築する
案件で Docker を使って開発環境の構築をしたのでメモとして残しておきます。
今回作成したファイルの Github ページはこちらです。
構築する環境
Docker Compose を使って以下の条件を満たした開発環境の構築を行います。
先輩からの強いおすすめにより、今回は Docker Compose を使って環境を構築したいと思います。
今回は PHP7.1 の Apache サーバーのみで Web サーバーのコンテナしか作成しないので Docker Compose で作成してもあまり意味ないかもしれませんが、 DB サーバーいれて開発環境を整えることの方が多いと思うので、勉強がてら Docker Compose で構築します。
インストール
自分は Mac なので Docker for Mac
を以下のページからインストールします。
ちなみに会員登録しないとインストールできないようですね。
インストールしたら docker
コマンド使えるようになってますので、バージョン確認とかしてみてちゃんと動いてるか確認しましょう。
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 ファイルの作成
使用するイメージファイルの指定や、コンテナ起動後のサーバー内で実行するコマンド等を定義していきます。
今回は CakePHP
と Xdebug
が動く環境を設定したいのでそのインストールコマンドなどを定義していきます。
# イメージファイルの指定 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 はそれらを使っていれていきます。
また、 ADD
と 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