アジェンダ
- Dockerとはどんなものなのか基礎理解を深める
- Dockerのメリットは何なのか、どう活きるのか考えてみる
Dockerとは
ざっくり理解
アプリケーションの実行に必要な様々な環境を仮想上で構築し、その仮想環境の中でアプリケーションを実行できる技術です。そして、その仮想環境はイメージ化といって、他ユーザーへ共有できるので、同一の仮想環境を簡単に他ユーザーが構築させることができます。
また、この構築されることをコンテナ化といい、Linuxのコンテナ技術に由来しています。
コンテナ技術とは
アプリケーションの実行に必要なライブラリやツールなどをまとめて分離させる事で、一つのLinux OS環境下で複数のアプリケーションを実行する環境を構築できるLinuxの機能。
例えば、PHPの実行環境と、Rubyの実行環境はそれぞれに異なるので、コンテナ技術を使わずに対応しようとすると、ライブラリ間の競合や共有が原因で、各アプリケーションが正しく動作しない恐れが生じる。
コンテナ技術を用いると、それぞれが独立した実行環境のため、そういった恐れがなく、各アプリケーションの動作に影響しない。
Dockerを用いることで、WindowsやmacOSといった異なるOS間でも、同じ実行環境を構築できます。単純なLinuxのコンテナ技術は、当然Linux上でしか動作しませんし、単体のマシンでしか操作できません。
また、公式サイトにある膨大な数のDockerイメージによって、構築したい実行環境も整備しやすく、実際の操作自体もGUIやDockerコマンドといった専用のコマンドもあるので、操作しやすいこともメリットです。独自のイメージを生成する事で、各要件にあった実行環境もオリジナルで構築できることもポイントです。
なにより、利用するユーザー全員が共通言語を用いて作業できることは大きい利点かなと理解しています。
具体的には
例えば、PHPとRubyを実行させたいとします。
単純に一つのマシンで実行させるとしたら、PHPとRubyで、それぞれにライブラリやツールをインストールする必要がありますね。
しかし、PHPとRuby間でこれらの環境が干渉する恐れがあります。同じライブラリの一部分を共有している可能性もあります。PHPをバージョンアップさせたりする場合に、Rubyにも用いている環境も更新されたとしたら、その環境を用いているRubyは正しく動作しなくなるかもしれません。
上記のように、各プログラムやシステムの共有部分が競合したり干渉すると、正しくプログラムを実行できなくなるかもしれないのです。
集合住宅の各居室をプログラムと仮定すると、各居室の前にある廊下や階段などの共用部分は、各プログラムを実行する(各居室に入る)際に必要なライブラリやツールとなります。
この共用部分が、とある居室の住人Aによって勝手に荷物置き場(しかも通れない)にされると、別の居室の住人は居室に入居するのに弊害が起こります。
これを戸建てが各プログラムと仮定すると、各戸建て前にあるアプローチは戸建てに入るために必要なライブラリやツールです。
各アプローチはその戸建て専用のものですので、荷物をどれだけ置いたとしても隣の戸建てに影響することはありません。
それならば、今まで集合住宅で入居していたPHPとRubyの実行環境を分離させようということです。
PHPとRubyを各コンテナに切り分けることで、それぞれを戸建てにすれば、環境が互いに干渉せず、スムーズな実行環境を構築できるようになります。
また、これは一つのマシン内での話で終わらないのがDockerの技術です。冒頭に記載したように、構築したPHPとRubyの環境を、他のユーザーのマシンでも実行できるように共有することができます。
同じDockerイメージを共有しそれぞれがDockerコンテナを再現及び構築すると、複数のマシン間で同一の実行環境を揃えることができます。
実務的には
実務ではエンジニア1人が単独で開発を行うことはほぼないでしょう。複数のエンジニアが、一つのWebサービスを開発するにあたり同一の環境を構築する必要があります。またエンジニアも、初期メンバー固定ではないかもしれません。途中で離脱したり、新たなメンバーがジョインすることも頻繁にあるでしょう。
Dockerの技術を用いれば、メンバーの入れ替えがあっても、簡単に開発環境を構築することができます。環境構築に時間を大きく割くこと無く、すぐに開発作業に着手できます。
また、開発環境にとどまらず本番環境でもDocker技術の利点を活かすことができます。(※まだ、現時点では実際に実務で操作したことがないので、学習した知見になりますが)
ユーザーのマシン内で複数のプログラムを動作させるために、それぞれの実行環境を共存させると、ライブラリやツールの競合で、実行に弊害が生じる可能性を述べました。
これはサーバー上でも同じことが起こります。ですが、サーバー内で各コンテナを動作させ、実行環境を分離させることで、その影響をなくすことができます。
また、サーバーリソースの効率化という点でもDockerのコンテナ技術はメリットとなります。各プログラム毎にサーバーを運用すると、当然運用した台数だけコストがかかりますが、一つのサーバー内で複数コンテナを実行し、プログラムを動作させることで、それだけでサーバーのコスト削減になります。
Dockerって便利なツールですね。
おわりに
開発環境構築という観点でしか実務では対応したことがないので、本番環境で得られるメリットを享受したことがありません。今後はそこにもリアルで触れていきたいです。
また、Docker一強であった仮想コンテナ技術ですが、AWSより【Finch】というサービスが公開されているようで、そちらも気になります。
今回は以上です。
お時間頂きありがとうございました。