この記事のターゲット
この記事は筆者の同僚エンジニアに向けて書いています。
まだ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
で動作させる際に少しハマることがあるのは気になりますけどね…( ^ω^)