ITエンジニアのTIPS集

Docker + PHP + MySQL + VSCodeでサクッと開発環境を作る

 今回はプログラミング環境に関する記事です。

 自分はWeb系のシステム開発でPHP系を使うことが多かったのですが、ほとんどの場合で開発環境の構築で少し面倒に感じる部分が多くありました。

 最近ようやくDockerを使い始めることができたので、テンプレート的に使えそうなものを Github に置いておきましたので、よかったら使ってみてください。

 matatabi3/docker-php-base

目次

  1. まえがき
  2. 解説
    2.1. docker-compose.yml
    2.2. php/Dockerfile
    2.3. mysql/Dockerfile
    2.4. Docker Compose 実行
    2.5. launch.json
    2.6. 補足
  3. あとがき

1. まえがき

 今回の記事は、既に Docker や AWS ECS をバリバリ使って開発環境や本番環境を運用している人向けではなく、ほとんどDockerを使った経験が無い人がとにかくPHP動かせたらいいです、という人向けの記事になります。

 チームで開発を進めていく上で、みんなが同じような環境で開発してることがとても大事というのは言わずもがなですが、少し昔から VirtualBox + Vagrant が流行って同じような開発環境を作成することが随分簡単になってきました。

 それより前は VirtualBox の仮想アプライアンスをエクスポートして、インポートするという流れでやっていたなー(遠い目)という記憶です。

 ですが、システム開発を進める上で扱うパッケージによっては、 Windows + VirtualBox の共有フォルダだとパフォーマンスが全く出ないなどの問題にぶち当たったり、技術が進歩してもなかなか解決の難しい課題があったりするのが悩ましいところですね。

 自分は今まで作業用PCの都合やめんどくさがっていたりでなかなか手を出せていなかった Docker をそろそろ触りたいなーと思い、自分でいろいろ試して仕事にも流用が進めていけそうな感触になってきたので、本格的にいろんな検証をやってみようとこの記事を書いています。

 まだまだ勉強不足なので、不備があればご指摘お願いしますー。


2. 解説

 今回は、シンプルに src ディレクトリが Docker 起動に DocumentRoot になり、 http://localhost にアクセスすれば src ディレクトリに保存されているものが動く構成としました。

 今これを応用して Laravel で環境を作っていますが、 Laravel は DocumentRoot に設定すべきディレクトリとフレームワークのルートが一致しないものなので、そのまま動かそうとすると少し変更が必要になります。

 なので、今回のものを使って PHP アプリを検証するときは、 src = DocumentRoot になるアプリケーションで使ってもらえたらと思います。

2.1. docker-compose.yml

 Docker Compose のファイルです。 Docker Compose についての解説は 公式 におまかせできればと思います m(_ _)m

 今回は、 PHPのコンテナとMySQLのコンテナ、あとそのコンテナたちのIPアドレスを固定するためのネットワーク周り設定を記載しています。

 ネットワーク周り

networks:
base:
ipam:
driver: default
config:
- subnet: 172.30.0.0/24

 base はネットワーク名に設定するラベルで、 subnet がコンテナに割り振るIPの subnet の設定です。
 今回のものをコピーして使う場合は、この辺りを変更しておくと、同時に2つの Docker Compose を実行してもネットワークがぶつからないようになると思います。

 MySQL周り

db:
build: ./files/mysql
networks:
base:
ipv4_address: '172.30.0.10'
ports:
- "3306:3306"
volumes:
- ./files/mysql/db:/var/lib/mysql
- ./files/mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
# user: mysql
user: "1000:50"
environment:
MYSQL_DATABASE: base
MYSQL_USER: base
MYSQL_PASSWORD: base123
MYSQL_ROOT_PASSWORD: root

 build はビルド時にどこの Dockerfile やらを見に行くのかのパス設定ですね。
 networks の箇所で先ほど設定した base のネットワークを指定して、 ipv4_address で固定IPを割り当てています。
 ports はコンテナ側からホスト(Dockerを実行しているマシン)にポート転送をするための設定です。
 volumes はコンテナにディレクトリを同期させる設定を書きます。今回はデータベースのデータの実体を ./files/mysql/db に永続化できるように設定しました。一応 git の追跡対象外にしてます。さらに、 docker-entrypoint-initdb.d こちらは公式の MySQL の Docker を指定して使う場合、このディレクトリにデータベースのダンプファイルを置いておくと、初回起動時に自動でインポートされるという便利な仕様ですね。プロジェクトに応じてここにダンプファイルを置くのが良さそうです。
 user の箇所は Docker 実行環境かMySQLのバージョンによって、 mysql ユーザーではエラーになるので、調整用です。
 environment は MySQL の各種設定です。

 PHP周り

web:
build: ./files/php
depends_on:
- db
networks:
base:
ipv4_address: '172.30.0.100'
ports:
- "80:80"
volumes:
- ../src:/var/www/html
extra_hosts:
- "dev_host:172.30.0.1"

 MySQLとかぶっているものは省略しまして、
 depends_on は db を先に起動するという指示になります、今回くらいの設定だと不要かもしれません。
 extra_hosts は後ほど出てくるXdebug用の設定で、 172.30.0.1 を dev_host という変数に入れているイメージです。

2.2. php/Dockerfile

 PHP コンテナ用の Dockerfile で、 php7.2 を今回は指定して主に必要なライブラリ群を入れています。

FROM    php:7.2-apache
RUN usermod -u 1000 www-data \
&& groupmod -g 1000 www-data \
&& a2enmod rewrite \
&& pecl install xdebug-2.6.0 \
&& apt-get update -y \
&& apt-get install -y zlib1g-dev \
&& docker-php-ext-enable xdebug \
&& docker-php-ext-install pdo_mysql mysqli mbstring zip \
&& apt-get clean
COPY docker-php-ext-xdebug.ini /usr/local/etc/php/conf.d/

 COPY docker-php-ext-xdebug.ini でXdebugの設定ファイルを追加しています。ここの中に xdebug.remote_host = dev_host でリモートホストがどこかを指定するのですが、そこで先ほどの dev_host が使われます。

2.3. mysql/Dockerfile

 MySQL コンテナ用の Dockerfile で、 mysql5.7 を今回は指定して、微妙に設定をいじっています。

FROM mysql:5.7
RUN sed -e 's/^ *user *= *mysql$/user = root/' -i /etc/mysql/my.cnf
COPY ./my.cnf /etc/mysql/conf.d/

 RUN sed〜〜〜は、どうも mysql ユーザーで実行していると上手く動かなかったので、 my.cnf 内で root に変えています。
 また、文字コードの設定やらを my.cnf に用意しているので、 COPY でコンテナにコピーします。

2.4. Docker Compose 実行

 docker-compose.yml の保存しているディレクトリで、 $ docker-compose up と実行するとビルドが走り Docker が実行されます。
 待機状態になってからブラウザで http://localhost/mysql-test.php にアクセスして、「connected to mysql.」と表示されれば、コンテナ間の接続も無事完了になるので、あとは src ディレクトリにお好みの PHP アプリケーションを作成していく流れになるかと思います。

2.5. launch.json

 VSCode用のリモートでバッグ設定をgitリポジトリに梱包していますので、拡張機能の「PHP Debug」をインストールしておけば、 docker-php-base ディレクトリを VSCode で開いて F5 を押すだけでデバッグモードに入れます。
 mysql-test.php の2〜6行目あたりにブレイクポイントを設定してブラウザでアクセスすれば、ブレイクポイントで止まるようになっているはず。。。

2.6. 補足

 $ docker-compose up 実行後、使い終わったら Docker Compose を終了するためには、 Ctrl + c で終了できます。ただ、この状態だとコンテナだけが終了してネットワーク設定が裏で動きっぱなしになるようで、 $ docker-compose down まで実行しておいた方が、キレイに終了されます。
 困ったらとにかく $ docker-compose down してイメージを消していろいろ検証していくのが良さそうです。

  イメージを消す

  1. $ docker-compose down とにかく落とす!
  2. $ docker image ls で IMAGE ID を確認!
  3. $ docker rmi [IMAGE ID] で削除!

3. あとがき

 現状Linux環境で直接Dockerを実行する構成で作成しているので、とても調子よく動いていますが、おそらくWindowsやMacでそのままDockerを実行しようと思ってもおそらく良い感じには動かない想定です。

 なので、リポジトリからgit clone したらベースOSに依存しない形でどこでも簡単に環境構築をできるようにブラッシュアップしていきたいなーと思っています。(なんやかんやで家でもWindows機をまだまだ使っているので)

 Vagrantを使って、CoreOSや最小構成のUbuntuなどで今回のDocker構成と組み合わせつつ、デプロイやらテストも自動化できる仕組みに発展させられたら効率厨としては最高ですね。

 今回の構成は matatabi3/docker-php-base からダウンロードできます。

 みなさんのプログラミング生活に少しでも貢献できたら幸いです。