はじめに
以前に 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
にて実施します。
利用方法
- ホスト(Mac)上のブラウザからlocalhostを開くとpublic_htmlに設置したファイルが見れます。
- PHPプログラム(web01コンテナ)からDBを参照する場合は、ホスト名にdb01を指定ください。
- ホスト(Mac)上からDBを参照する場合は、127.0.0.1:3306にて参照可能です。
まとめ
コンテナ上にあるApacheの設定変更の場合、設定ファイルをイメージ内に組み込んでじまうと、Dockerイメージのリビルドが必要となり、開発環境としては利便性が下がります。
そこで、今回は必要なファイルをホスト(Mac)上に置き、volumes
にてマウントすることで、ファイルの修正を容易にしました。
Docker Compose
は、Docker for Mac
に標準で含まれているため、インストールも容易で、別途インストールの必要もありません。
Vagrant
との組み合わせに比べ、より簡単に開発環境が用意できるかと思います。
たぶんWindows版でも稼働可能です。