こんにちは。ウェブ共同開発部の水野です。
早いもので、2016 年新卒として私がフェンリルの一員となってから 1 年が経ちました。
学生時代は C/C++ での開発を行っていたこともあり、ウェブ開発の世界は初めてのことばかりで驚きの連続でした。今回はそんな「驚き」の中から、Docker での開発環境構築を紹介したいと思います。
Docker とは
Docker は、Docker 社の開発したアプリケーション実行仮想環境です。
仮想環境というと VirtualBox などを思い浮かべる方が多いと思いますが、この Docker はコンテナと呼ばれるプロセスに近い単位での仮想環境となっているため、必要なプロセスのみを動作させることができます。結果として、プロセスの起動から終了までを高速に済ませることができます。また、Docker は Docker 自身が動きさえすれば OS やハードウェアなど環境の違いを気にせずコンテナを実行できることも魅力の一つです。
特に開発環境における大きな魅力は、Docker はミドルウェアやパッケージマネージャを含めて、構成をコード化し他の開発者と共有できる点にあります。つまり、構成ファイルをソースコードのリポジトリ内に含めることで、 OS やハードウェアによらずコマンドをいくつか叩くだけで開発環境が立ち上がります。複数人での開発を行う際は非常に重宝するツールです。
Docker を使うには基本的には公式サイトから環境に応じたインストールパッケージを取得し利用すれば OK ですが、Windows 用のパッケージは 64 ビット版の Windows 10 Pro が必要となり、Windows 10 Home や Windows7 など、条件を満たしていない場合は Docker Toolbox という VirtualBox の Linux 仮想環境上で Docker を動作させるためのパッケージからの利用となるのでご注意ください。
Docker による開発環境の構築
まず、 Docker で PHP のパッケージマネージャである Composer をインストールし実行する場合の設定ファイルを記述します。
Dockerfile
FROM php:5.6 WORKDIR /temp RUN apt-get update && apt-get install -y unzip git RUN curl -sS https://getcomposer.org/installer | php RUN mv composer.phar /usr/local/bin/composer RUN composer self-update ENTRYPOINT ["composer"] CMD ["--help"]
実行します。
$ docker image build -t composer . $ docker container run composer
これで Composer のヘルプテキストがターミナルに表示されれば成功です!
詳しく見ていきましょう。
FROM php:5.6 WORKDIR /temp
1 〜 2 行目では、ベースになるコンテナイメージの選択とカレントディレクトリの変更を行っています。FROM 命令はベースになるコンテナイメージを選択し、WORKDIR 命令はディレクトリの作成とカレントディレクトリの変更を一度に行ってくれます。
RUN apt-get update && apt-get install -y unzip git RUN curl -sS https://getcomposer.org/installer | php RUN mv composer.phar /usr/local/bin/composer RUN composer self-update
空行を挟んで 4 〜 7 行目では、Composer を利用するのに必要なツールや、Composer 自身のインストール・更新までを行っています。RUN 命令は後に続くシェルコマンドを実行してくれます。
ENTRYPOINT ["composer"] CMD ["--help"]
さらに空行を挟んで 9 〜 10 行目、これがこの構成ファイルの一番のキモです。ENTRYPOINT 命令も CMD 命令も、コンテナ起動時に実行されるシェルコマンドを指定するものですが、ENTRYPOINT 命令と CMD 命令を同時に記述した場合、コンテナ起動時に引数を与えることで CMD 命令の内容を上書きできます。これでこのコンテナは Composer コマンドと同様にパッケージのインストールやPHPのオートローダ管理などを柔軟に行えるようになります。
データボリュームの接続
さて、実は先ほどの構成ファイルから作成したコンテナを使って Composer コマンドを実行しても、パッケージを管理することはできません。なぜならば、インストールしたパッケージはすべて Docker コンテナの中で、ホストマシン側へパッケージを移していないからです。なので、インストールしたパッケージを使うときは必ずコンテナからホストマシンへ取り出す必要があります。
コマンドオプションで指定することもできますが、ここはデータを保存するためのコンテナを新しく立ち上げて、コンテナ同士を連携させましょう!
docker-compose.yml
version: '2' services: data: image: php:5.6 volumes: - ./:/data composer: build: ./composer volumes_from: - data
composer / Dockerfile
FROM php:5.6 WORKDIR /temp RUN apt-get update && apt-get install -y unzip git RUN curl -sS https://getcomposer.org/installer | php RUN mv composer.phar /usr/local/bin/composer RUN composer self-update ENTRYPOINT ["composer"] CMD ["--help"]
実行します。
$ docker-compose up -d $ docker-compose run --rm composer
先ほどと同じく、Composer のヘルプテキストが表示されれば成功です!
詳しく見ていきます。composer / Dockerfile は先ほどと同じく Composer のプロセスを実行するためのコンテナ構成ファイルですが、docker-compose.yml という名前のファイルが新しく増えています。
これは、コンテナ同士を連携させる際の設定をコード化できる設定ファイルで、これを使ってコンテナを連携させることで通常コンテナの処理終了時に破棄されるデータを保持したり、ホストマシンへ変更を反映させることができます。
services オプションで連携させる各コンテナを列挙します。ここで記述したコンテナはサービスと呼ばれ、サービスの個別実行時にはこの名前が使われます。
volumes オプションはホストマシンとコンテナとの共有ディレクトリを指定します。これを記述することでコンテナで処理をした結果をホストマシンへ反映させることができます。
volumes_from オプションは volumes オプションと似ていますが、こちらはここで指定したサービスで記述された共有ディレクトリの設定をそのまま利用することができます。
こうして作成した docker-compose.yml を実行することでコマンド一回でコンテナ同士を連携させて動作させることが可能となります。
おわりに
いかがだったでしょうか?
こうして作成した仮想環境は、OS やハードウェアの壁を超えて、様々な場面で利用することができます。今回は簡単な開発環境の作成を行いましたが、コンテナの組み合わせや設定次第で、本番環境にも利用できるだけのポテンシャルを秘めています。
環境構築の手間を大きく減らし、メンバーが開発に集中できる状態を作るのに便利なので、今後に注目です。
フェンリルのオフィシャル Twitter アカウントでは、フェンリルプロダクトの最新情報などをつぶやいています。よろしければフォローしてください!
フェンリルの Facebook ページでは、最新トピックをお知らせしています。よろしければいいね!してください!