こんにちは、はんぺらです。
自分のMacのパソコンに開発環境を作りたんだけど、何を使って作ったら良いんだろう?MAMP?Docker?Vagrant?とかあるけど、何がどう違うんだろう?
それぞれの違いと、何を選んだ方が良いか解説します。
※自分がMacユーザーなので、Macユーザー用で説明しています。ただ、Windowsユーザーの方もMAMPをXAMMPに置き換えれば理解はできると思うので、よろしければ読んでみてください。
Contents
MAMP、Docker、Vagrantってどう違うの?
自分のパソコンに開発環境を構築する方法は幾つかあるのですが、その中で3つのメジャーな方法を今回は取り上げます。それが下記です。
- MAMP
- Docker
- Vagrant
開発環境を作ろうと思って調べると、上記のワードが検索結果に出てくるので、見た事はあるかと思います。
まず、上記を簡単にグループ分けしますと、MAMPと仮想化ツール(Docker,Vagrant)に分けられます。
MAMPではMacに直接Apache、Mysql、PHPをインストールして動かします。
一方、仮想化ツールは、Mac上に仮想環境を構築してそこでApache、Mysql、PHPをインストールして動かします。
例えて言うと、バッグに筆記用具を入れる時に、そのままバッグに投げ入れるか、筆箱に入れてバッグに入れるかのような違いですかね。
バッグがMacで、筆記用具がPHP、Mysqlで、筆箱が仮想化ツールです。。。中々例えて話すのは難しいですね。。。
それでは、この3つの中でどれを使ったほうが良いのでしょう?
まず、その前にPHPの開発環境でよく聞く、LAMP環境というものを理解しましょう。
PHPの開発環境でよく聞くLAMP環境って何?
LAMPとは、Linux、Apache、Mysql、PHPの頭文字を取って並べたものです。
Linuxとは
サーバーのOS(OperatingSystem)の一つで、MacのmaxOS(OS X)、WindowsのWindowsXPと同じ部類のものになります。
OSとはOperation System(オペレーティング・システム)の略で、アプリやデバイスを動作させるための基本となるソフトウェアのことです。 具体的には、キーボードやマウス・タッチパッドなどのデバイスから入力した情報をアプリケーションに伝え、またソフトウェアとハードウェアの連携を司る中枢的な役割を果たします。 パソコンやスマートフォンにはゲームやワープロ・表計算などさまざまな仕事をするアプリケーションがありますが、それらはOSごとに開発されるのが通常です。
http://www.toha-search.com/it/os.htm
Apacheとは
Webサーバーの一つです。その他、Nginxとかも有名です。
Webサーバーは簡単に言うと、Webブラウザ等のクライアントとアプリケーション(LAMP環境だとPHP)間の仲介役のイメージです。
クライアントからの要求を受け取り、それをアプリケーションに伝達し、アプリケーションからの返答を、またクライントに返す役割をしています。
クライアントとはWebブラウザやiOSアプリ、Androidアプリ等様々なものがクライアントになりえます。
Mysqlとは
データベース管理システムの一つです。その他、PostgreSQLやOracleSQLなども有名です。
データベース管理システムを簡単にいうと、沢山のデータを扱うために最適化されたシステムになります。
これがないと、自分でファイルからデータを検索して、抽出しなければいけないですし、実装も大変ですし、処理速度もかなり遅くなるので、データベース管理システムを使わないのは現実的にありえないですね。
その大変なことをSQLというものを利用して簡単に行えるようにしたのが、データベース管理システムになります。
PHPとは
サーバーサイドで動くプログラミング言語の一つです。Web開発で主に利用されます。
基本的には、何らかのOSに、上記で説明したWebサーバー、データベース管理システム、PHPがインストールされて、それが正常に連携されていればPHPの開発環境としては問題なく使用できると思います。
MacでPHP、Mysqlの開発環境を作る一番簡単な方法は、MAMPを使うこと
Macで開発環境を作るのに一番簡単な方法は、MAMPを使用することです。
MAMPとはMac、Apache、Mysql、PHPの頭文字を取って並べたもので、
LAMPとの違いは、LinuxがmacOSに変わっただけです。
MAMPを使うと、MAMPが代わりにmacOSに、Apache、Mysql、PHPをインストールし、且つそれを管理をしてくるので、簡単に開発環境が作れます。
なので、プログラミングを始めたばかりで、何もサーバーサイドの知識が無い方はMAMPを使ったほうが良いと思います。
でも、ずっとMAMPを使っていても、サーバーサイドの知識はつかないので、慣れてきたらVagrantなりDockerなり、他の方法をおすすめします。
サーバーサイドの勉強をしたいならVagrantがおすすめ
サーバーサイドの勉強をしたいのであれば、Vagrantで環境を構築することをおすすめまします。
Vagrantとは、違う環境に移行可能な開発環境を簡単に構築・管理し、配布することができる開発環境作成ツール。「ほんの数行書くだけで開発用の仮想マシンを構築できる」という優れものだ。
https://www.atmarkit.co.jp/ait/articles/1307/22/news076.html
Vagrantで仮想サーバーを立てると、何も入っていない空のサーバーに、自分でApacheとPHPとMysqlを入れないといけません。
それらをインストールするために、sshで仮想サーバーの中に入ったり、yumやrpmなどでソフトウェアをインストールしたりと色々と自分でしなければならない事が多いです。
ですが、自分で本番環境を作成するとなると、同様の事を本番サーバー上でしないといけいないので、勉強していてい損は無いと思います。
でもやっぱりDockerは使いこなせるようになっていた方がいいです
Dockerは、Linuxのコンテナ技術を使ったもので、よく仮想マシンと比較されます。VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。そのため、軽量で高速に起動、停止などが可能です。
https://knowledge.sakura.ad.jp/13265/
今一番ホットなのはDockerではないでしょうか?なので、Dockerは勉強はしておいたほうが良いです。
今自分の職場でもDocker使って、kubenetesで環境構築をしてます
kubenetesの需要も今はかなり上がっていて、Kubenetesを使うのであれば、Dockerの知識は必要ですので、今後の事を見越して、Dockerを勉強しておくのはありかと思います。
ただ、Dockerで開発環境を作るにしても、結局サーバー側の知識は必要ですので、一旦Vagrantなりを経由して、サーバー側の知識を付けてから、Dockerに進むと、Dockerの学習が早く進むかもしれません。
エンジニアにサーバーサイドの知識は必要なの?
自分がどんなエンジニアになりたいかどうかでサーバーサイドの知識が必要かどうかは変わってくると思います。
wordpressを入れて、HTML、CSS、PHPをちょろちょろっと弄る位だと、VagrantとかDocker等のインフラ寄りの知識は、ほぼ必要ないと思います。
また、アプリとか、PWAとかのフロントエンドをメインにやっていこうと思っている人も、サーバーサイドはBaaS等を使えば実現できるので、BaaSしか使わないって決めている人であれば、正直必要は無いかと思います。
でも、実際にアプリやサービスを作る時にBaaSだけで実装できるのか考えると、難しい所があるのも事実です。
僕も今、Firebase(BaaS)を使ってサービスを作成中ですが、色々と設計した結果、BaaSと自前サーバーの両方を使う事にしました。
ただ、今後もっとBaaSが発展してくれば、やりたい事は実現できるようになってくるかもしれません。
そうなると、インフラ等のサーバーサイドの知識は必要なくなってくるかもしれませんね。
まとめ
MAMP、Vagrant、Dockerと色々と開発環境を作るためのツールはありますが、自分の目標がどこにあるのかを明確にして、何を選んだ方が良いかを決めていけば良いかと思います。
自分の場合は、MAMP -> Vagrant -> Dockerの順で手を付けていったので、まだ学習はじめの方は取り敢えず、MAMPからやってみることをオススメします。