この記事のターゲット
この記事は筆者の同僚エンジニアに向けて書いています。
まだDockerを触ったことがない人に対し、簡単ではありますが開発環境としてDockerを利用する魅力を記述していきます。
また当然ですが業務上書けないことは書きませんし、インターネット上に晒しても問題ない程度に無難に仕上げるつもりです。
忙しい人は最後だけ見れば良しということで
WEBアプリケーションの開発環境
WEBアプリケーションを開発するにあたり、一般的には最低限として以下のような環境の準備が必要です。
プログラミング言語の コンパイラ or インタプリタWEBサーバ(特に複数のWEBアプリケーションを開発する場合やより本番構成に近くする為)ミドルウェア類(RDBMSやKVS、Elasticsearchなど)
環境を準備するにあたり、これらの動作環境は開発マシン上に用意するすることが一般的ですが、さらに分類すると以下の3パターンのいずれかを利用する開発が一般的です。
Windows や Mac などに直接環境を構築するVirtualBoxやHyper-VにVM(Debian系やCentOS系)を用意し、VMマシン上に環境を構築するDocker環境を構築し、各種環境をDockerコンテナとして構築・動作させる
これらの3パターンについて個人的な見解として評価をすると以下のようになります。
▼直接環境を構築する場合
これは一番やってはいけないパターンです。
ホストマシン上に環境構築する場合は、動作させるソフトウェアのバージョン管理の疲弊します。
疲弊しないために自身のマシン内のソフトウェア類のバージョンに合わせてWEBアプリケーションの開発をすることになり、脆弱性を含んだソフトウェアを量産することになるでしょう。
▼VMマシン上に環境を構築する場合
VM上にWEBアプリケーション毎の環境を構築し、WEBアプリケーションが変わるたびにVMを切り替えます。
ホストマシンとVM間でWEBアプリケーションのソースコードを共有し、作業はホストマシン 実行はVM と役割を分けるのが一般的です。
また、私の過去の経験上、RDBMS内のデータやWEBサーバの設定ファイルなどまでホストマシン側に共有していない人が多く、VM様がご愁傷様した場合にスナップショットがあればそれから復元し、ない場合はゼロから作ることになります。
ただしスナップショットがすでにバグっていることも…( ^ω^)
なお、同一VM上に複数のWEBアプリケーションの開発環境を構築する場合は、上記の「▼直接環境を構築する場合」と何も変わりませんので何も意味を成しません。
▼Dockerコンテナとして構築・動作させる
おすすめです。
仕組みは後述します。
どの開発環境を選べばよいか
正直好きな環境を選べばよいと思います。
当然ですが既存のWEBアプリケーションの開発環境までDockerに移行する必要はないと思います。
(でも移行する場合は割と簡単にできるので、移行しても良いかと…)
さて、ここからが本題ですが、これからの開発であれば迷わずにDockerを利用することをお勧めします。
開発環境でDockerを利用する
▼Dockerって何?
Dockerではプログラムの実行環境やRDBMSなどの各環境をDockerイメージとして作成します。
このDockerイメージを動作させたものがDockerコンテナと呼ばれます。
Dockerコンテナは単にホストマシンのchrootさせたプロセスとして動作するイメージに近いです。
またDockerでは原則的に、WEBアプリケーションのソースコードやミドルウェア類の設定ファイルはホストマシンで用意し、以下のどちらかの方法でDockerコンテナから利用できるようにします。
- 実行時に共有する(変更が多いWEBアプリケーションのソースコード等が該当)
-
Dockerイメージに予め入れておく(変更が少ないミドルウェアの設定ファイル等が該当)
なお、RDBMS等の永続化したいデータについてもホストマシン側に置くようにし、RDBMSのDockerコンテナがそこに変更を行うように設計します。
以下の評判の良い記事が参考になります。
Dockerは優秀ではありますが、それ単体で利用する場合はコマンドライン上で長ったらしいコマンドを実行して動かすことになります。
とてもじゃないけど開発で利用する際には、運用していくのはしんどいです…。
Dockerを食わず嫌いする人や触ってみたけど難しいなと感じて挫折した人の大半はここで終わっているように感じてます。
さて、その問題をdocker-composeを利用して解決します。
docker-composeって何?
WEBアプリケーションの開発において、Dockerコンテナをまとめて動作させることが多いため、docker-composeというオーケストレーションツール を利用するのが一般的です。
以下の評判の良い記事が参考になります。
docker-composeを利用することで、Dockerコンテナの管理が用意となり、複数のコンテナを協調させて動作させるということは、ある意味のVMでやりたいことも可能となります。
VMを利用する場合はVM毎にCPUコアやメモリを割り振る必要がありますが、Docker+docker-composeを利用することにより「1台のバーチャルハードウェア上で複数のVMを動作させる」相当のことが可能になります。
つまり案件(またはWEBアプリケーション)毎にdocker-composeで構築することでVMをスイッチする手間がなくなり、WEBアプリケーションエンジニアがハッピーになれます。
じゃあうちの会社でのお勧めのDocker開発方法は?
近年勢いのあるPHPのWAFであるLaravelの利用が増えてきました。
Dockerを利用してLaravelの開発を行うのであれば、個人的にはLaradock一択だと思います。
主な理由は…
- ドキュメントがしっかり整備されている(英語だけど)
- 超たくさん色々なミドルウェアが整備されている(Laravelの$\tiny{ほぼ}$すべての機能を利用できる)
- 活発に更新されている
- めちゃめちゃ簡単に動かせる(主に環境変数ファイルとdocker-compose.ymlファイルだけ触ればよい)
- 筆者が慣れているため社内に提供できる情報が多い
LaradockをWin10 Home + Docker Toolboxで動作させる際に少しハマることがあるのは気になりますけどね…( ^ω^)