PHP
MySQL
Docker
docker-compose
dockerformac

Docker for Mac (+ Docker Compose)でいい感じのLAMP開発環境を構築する


はじめに

以前に VagrantとDocker for Mac で〜 という記事を書きましたが、

現時点でのVagrant と Docker の組み合わせでは、若干の不具合がある事と、Dockerとは別にVagrantをインストール必要がありました。※詳しくは記事参照

そこで、今回は Docker for Mac に標準で含まれる、Docker Compose を用いて、環境を作成してみます。


Docker Compose とは?


  • 複数のコンテナを連携して利用する場合に、従来であれば、それぞれのコンテナを個別に、管理(起動・停止・構築など)していたものを、YAMLにて定義したファイルを用いて、複数コンテナを同時に管理できる仕組みです。


仕様

仕様は前回と同じですが、幾つか追加も行いました。


  • web用・DB用と、2つのコンテナを1つのdocker-compose.ymlにて定義しています。


  • docker-composeコマンドにて2つのコンテナは同時に起動・停止します。

  • ホスト(Mac)上のディレクトリを、web用コンテナ上の(Webサーバーの)ドキュメントルートにマウントし、ホスト(Mac)から直接、編集・更新ができます。

  • Apacheの設定もホスト(Mac)上から(.htaccesで変更できない項目も)追加・編集できるようにしました。

  • デバッグのため、WEBサーバーのアクセスログ・エラーログをホスト(Mac)上に出力するように変更しました。


ファイル構成

./

├ docker-compose.yml
├ web/
│ └ Dockerfile
├ var/
│ ├ logs/
│ └ public_html/ 
└ files/
└ apache_conf/
└ 00_virtualhost.conf


./docker-compose.yml


  • docker-compose にて連携を定義したファイル、詳細は後述


./web/Dockerfile


  • コンテナイメージ作成用のファイル、詳細は後述


./var/logs/


  • コンテナ内のApacheのログが保存されます。(docker-compose.ymlにて、コンテナへのマウントを定義しています、コンテナイメージのリビルドなしで変更可能です)


./var/public_html/


  • コンテナ内のApacheのドキュメントルートです。(docker-compose.ymlにて、コンテナへのマウントを定義しています、コンテナイメージのリビルドなしで変更可能です)


files/apache_conf/00_virtualhost.conf


  • Apacheの追加設定です。(docker-compose.ymlにて、コンテナへのマウントを定義しています、コンテナイメージのリビルドなしで変更可能です)


Dockerfileの詳細

オフィシャルのCentOSイメージを元に、できるだけシンプルにまとめました。

FROM centos:latest

# Install & Add repo
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# Install PHP5.6 & Apache
RUN yum --enablerepo=remi-php56 install php php-devel php-gd php-xml php-mbstring php-opcache php-mcrypt php-mysqlnd -y

# Clear yum cache
RUN yum clean all

# for web
EXPOSE 80

CMD /usr/sbin/httpd -DFOREGROUND


docker-compose.yml

version: '2'

services:
# mysql
db01:
image: mysql:5.6
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root

# web
web01:
build: ./web
image: web:24
ports:
- "80:80"
links:
- "db01:db01"
volumes:
- ./var/public_html:/var/www/public_html
- ./var/logs:/var/log/httpd
- ./files/apache_conf/00_virtualhost.conf:/etc/httpd/conf.d/00_virtualhost.conf


docker-compose.ymlの解説


version: '2'


  • 記載にはVersion1/2と選択できますが、今回はVer.2を用いいました。


services: db01: / web01:


  • 稼働するサービス(コンテナ)を定義します。Ver.2での記載では必須です。


image: mysql:5.6


  • 起動するコンテナイメージを指定しています。Dockerホスト内にイメージがない場合は、自動的にDockerHUBよりダウンロードされます。


ports:


  • 各コンテナで[フォワード先のポート:(コンテナで)解放するポート]を指定 


environment:


  • コンテナ起動時に実行するコマンド(MySQLでのrootユーザーのパスワードの設定)


build: ./web


  • DockerFileの保存先を指定


image: web:24



  • build:以下のimages:にてビルド後のイメージ名の指定、Ver.2のみ記載可能


links:


  • コンテナ間のリンクの指定


    • web01コンテナとdb01をリンク

    • web01からは、ホスト名db01にてdb01に接続が可能




volumes:


  • ホスト(Mac)上のファイル・ディレクトリをコンテナ上にマウント


    • ./var/public_html:/var/www/public_html



  • ./var/logs:/var/log/httpd

  • ./files/apache_conf/00_virtualhost.conf:/etc/httpd/conf.d/00_virtualhost.conf


コンテナの起動・停止


コンテナの起動

$ docker-compose up -d


  • 初回起動時には、イメージのビルド・コンテナの起動などをdocker-compose.ymlに沿って実行します。


  • -d オプションにてコンテナをバックグラウンドで実行



コンテナの停止

$ docker-compose stop


  • 関連するコンテナが停止されます。


Apacheの設定変更



  • 00_virtualhost.conf を適時修正の上、Web01コンテナを再起動させます。

  • Web01コンテナのみの再起動は$ docker-compose restart web01 にて実施します。


利用方法


  1. ホスト(Mac)上のブラウザからlocalhostを開くとpublic_htmlに設置したファイルが見れます。

  2. PHPプログラム(web01コンテナ)からDBを参照する場合は、ホスト名にdb01を指定ください。

  3. ホスト(Mac)上からDBを参照する場合は、127.0.0.1:3306にて参照可能です。


まとめ

コンテナ上にあるApacheの設定変更の場合、設定ファイルをイメージ内に組み込んでじまうと、Dockerイメージのリビルドが必要となり、開発環境としては利便性が下がります。

そこで、今回は必要なファイルをホスト(Mac)上に置き、volumesにてマウントすることで、ファイルの修正を容易にしました。

Docker Composeは、Docker for Macに標準で含まれているため、インストールも容易で、別途インストールの必要もありません。

Vagrant との組み合わせに比べ、より簡単に開発環境が用意できるかと思います。

たぶんWindows版でも稼働可能です。


 ソース

https://github.com/jey0taka/docker-compose-sample