コンテナって最近よく聞くけど、なかなか理解できないなぁ..
そのお悩みを解決します!
エンジニアの皆さん。
日々の業務、そして学習お疲れ様です!学習は順調に進んでいますか?
最近耳にしない日はないといっても過言ではない「コンテナ」。
自分の言葉で「コンテナ」の仕組みを説明することはできますか?
……。
………………。
説明できましたでしょうか?
本記事では「コンテナ」について、初心者にわかりやすいよう図解付きで解説していきます。
結論、こちらがコンテナの仕組みとイメージです。
今はまだ分からなくても全然大丈夫です!
本記事を読んだ後に「コンテナってこういうことだなぁ」って理解して頂ければ嬉しいです。
それではどうぞ!!
そもそもコンテナって何?
コンテナとはアプリケーションとその実行環境を1つにまとめあげる技術のことです。
動作に必要なホストOSの中核(=カーネル)をコンテナエンジンを通して、コンテナ同士が共有できるようにすることで、ハードウェアのリソースと切り離した仮想環境を作り出すことができます。
…何を言っているか良く分かりません。
コンテナを初めて耳にする方は、いきなり説明されても理解できないですよね。
そこでまずは私たちの日常生活にある物流業界でのコンテナについて、知りましょう!
物流業界でのコンテナとは
物流業界でのコンテナは輸送に使われる箱のことです。
このように貨物船に積まれたコンテナを見たことある方もいるのではないでしょうか?
もしこのコンテナがなかったらどうなるでしょう?
貨物の大きさや形がバラバラだから、積み上げ・積み下ろし作業が大変そう。
確かに大変そうですよね。
そこでコンテナが誕生しました。
コンテナに貨物が格納されていることで、積み上げ、積み下ろし作業が統一化され、コンテナ毎に別々の場所に輸送をすることが可能になりました。
このように物流業界でのコンテナは貨物の規格を統一化し、持ち運びやすくできるようしました。
物理基盤・仮想化技術・コンテナの違い
仮想化技術のコンテナも同じように規格を統一化し、持ち運びやすくするという理由で生まれました。物流業界でのコンテナと同様に「持ち運びできる入れ物」としてアプリの実行環境をひとまとめにしています。
ここで物理基盤から仮想化技術(ホストOS型)、そしてコンテナとどのような特徴があるか見てみましょう。
1. 物理基盤
物理基盤は最もレガシーなシステム構成です。
物理サーバの上に直接LinuxやWindowsといったOSそしてミドルウェア、アプリケーションをインストールするのが一般的です。
土地や建物全てを所有する一軒家に例えると、わかりやすいですね。
物理基盤にはこのようなメリットとデメリットがあります。
物理基盤での1番のデメリットはCPUやメモリ等のリソースを集約しないことで無駄が生まれてしまうことです。このデメリットを解消するために、仮想化技術が登場しました。
2. 仮想化技術
仮想化技術は仮想的に1台の仮想マシンを実行できるようにするシステム構成です。
今回のイラストはホストOS型の仮想化を載せていますが、仮想化技術にはこちらの2種類があります。
- ホストOS型
- ハイパーバイザー型(ベアメタル型)
各々の特徴について、詳細を知りたい方はこちらをの記事が分かりやすかったので、参考にしてみて下さい。
仮想化技術について解説 ホスト・ハイパーバイザー・コンテナの違いとは?
ちなみにAWSのサービスであるEC2は2のハイパーバイザー型になっているよ!
仮想化技術はアパートを例にあげるとわかりやすいですね。
土地や建物は共有してますが、各部屋毎に個別で契約が発生しているイメージです。
仮想化技術にはこのようなメリットとデメリットがあります。
仮想マシンは各々でゲストOSを起動する必要があり、メモリ消費に無駄が生まれてしまっていました。
同じゲストOSでもいいのになぁ。
このような声があり、コンテナが登場しました。
3. コンテナ
コンテナはアプリケーションとその実行環境を1つにまとめあげるようにするシステム構成です。
コンテナ内には、ゲストOSが含まれておらず、このようなものが含まれています。
- アプリケーションの実行に必要な設定ファイル
- ライブラリと呼ばれるプログラムの部品(ソフトウェア)
- ランタイムと呼ばれるプログラムの動作に必要なソフトウェア
これらのまとまりをイメージと呼び、このイメージからコンテナが各々独立して実行されます。
そのため、1つのホストOS上で他アプリケーションとの競合を意識することなくアプリケーションを実行できます。
シェアハウスを例にあげるとわかりやすいですね。
土地や建物だけでなく、生活に必要な家電もみんなで共有しているイメージです。
コンテナのメリット・デメリットは後ほど詳しく解説しますね。
これまで紹介した物理基盤・仮想サーバ・コンテナを比較するとこのようになります。
物理基盤 | 仮想化技術 (ホストOS型・ハイパーバイザー型) | コンテナ | |
性能 | ◎ 最も速い | △ I/Oが遅い | ◯ 速い |
OS | △ 1つだけ | ◎ 複数種類を混在可能 | ◯ カーネルは1つだけ、ディストリビューションは混在可能 |
リソースの使用 | △ システムで占有、リソースの無駄が多い | △ メモリの無駄が多い | ◎ カーネルが1つで効率が良い |
柔軟性 | △ 硬直的 | ◎ 非常に柔軟 | ◯ 単機能向け |
ユースケース | 高速なDB等 | 従来型の業務システム | 同一のものを大量に配備する必要があるもの(Webサービスのフロントエンド等) |
この表からも分かるように、コンテナが優れていることが分かりますね。
コンテナのメリット
コンテナにはこのようなメリットがあります。
1. 持ち運びがしやすい
コンテナは持ち運びがしやすいです。
なぜなら、ハードウェアやホストOSがコンテナ内に含まれていないためです。
先ほどお伝えしように、コンテナには、アプリケーションの実行に必要な設定ファイルやライブラリ、ランタイムのみが格納されています。
そのため、他サーバに移してもすぐにコンテナを実行することが出来ます。
物流業界のコンテナと同じで持ち運びがしやすいんだね!
2. 起動・処理を高速化できる
コンテナは起動・処理を高速化できます。
なぜなら、コンテナはゲストOSがなく、ホストOSのカーネルを共有しているためです。
これにより素早くアプリケーションを起動できます。
ホストOS型の仮想化技術と比較してみるとわかりやすいですね。
ホストOS型の仮想化技術はホストOSに加えゲストOSも起動する必要があるため、アプリケーションの起動に時間がかかってしまいます。
また仮想マシンはゲストOSがある分、CPUやメモリといったリソースの無駄も多くなります。
しかし、コンテナはゲストOSがないため、CPUやメモリを無駄に消費することがありません。
そのため、起動・処理を高速化させることができます。
3. リリースサイクルを高速化できる
コンテナはリリースサイクルを高速化できます。
これは①でお話ししたように持ち運びがしやすいためです。
そのため、リリースに伴う各環境への反映が容易に行えます。
顧客への急速なシステム提供が求められる現代でコンテナが広く普及されている意味が分かりますね!
4. バックアップへの切替を容易にできる
コンテナはバックアップへの切替を容易にできます。
これは1つのイメージを作っておけば、同じコンテナを複数起動することができるからです。
そのため1つのコンテナで障害が発生した場合、すぐに代替環境へ切り替えることができます。
仮想マシンよりも容易に切り替えができるよ!
コンテナのデメリット
ここまでコンテナのメリットをお伝えしてきましたが、勿論メリットばかりではありません。
次にコンテナのデメリットについてもお伝えします。
1. ホストOSへの依存が発生する
コンテナは土台となるホストOS以外のOSとの相性が悪くなることがあります。
つまりコンテナを他環境に移そうとした場合、ホストOSが異なると上手く動作しないことがあるとのことです。
これはコンテナ起動時に、ホストOSに対してマッピングを行うことでコンテナとホストOSを紐づけているためです。
そのため、土台となるホストOS以外のOSではコンテナとして起動することができません。
つまりLinux 用のカーネルを利用しているコンテナでは、WindowsやUNIXなどのカーネルに互換性がないOS 用のプロセスは動かせないんだね!
再現できるのは同じ Linux 系(CentOS・Ubuntu)など、ホスト OS と同系列でカーネルに互換性のある OS に限ります。
そのため、コンテナを別のOSに移行する場合は、作業に手間がかかってしまいます。
2. 学習コストが高い
コンテナは学習コストが高いというデメリットがあります。
なぜなら、覚えるコマンド操作が多く、どうしても学習時間がかかってしまうためです。
また、複数のコンテナを管理するツール(コンテナオーケストレーションツール)であるKubernetes(クバネティス)は簡単に習得できるようなものではないため難しいです。
コンテナを学ぶ時は意を決して臨もう..!
代表的なコンテナサービス
このような特性を持ったコンテナには、様々なサービスがあります。
代表的なコンテナサービスはこちらです。
Docker
Dockerは最も有名なコンテナなサービスです。
マルチOSに対応したオープンソースのコンテナサービスを提供しています。
他のコンテナサービスよりも環境構築の難易度が低く、OS内でいくつものコンテナを稼働させてもオーバーヘッドのリスクを最小限に保ちながら快適な稼働が実現することができます。
Dockerについてはこちらの記事で解説しているので、よければ参考にしてみて下さい!
Kubernetes
KubernetesはDockerに匹敵するコンテナサービスです。
Dockerに比べ、コンテナの管理面に強みを持っています。
そのため、Dockerで起動させたコンテナをKubernetesで管理するといったことを実現します。
DockerとKubernetesの違いについてはこちらの記事が分かりやすかったので、良ければ参考にしてみて下さい。
Kubernetesとは 概要や、dockerとの違いを5分で入門
まとめ
今回はコンテナの仕組みやそのメリット・デメリットについてご紹介しました。
「コンテナってこういうことなんだなぁ」って理解できましたでしょうか?
コンテナはクラウドで利用されることを前提にした「クラウドネイティブ」なシステムを実現するために、今後更に活用が進むことになります。
そのため、エンジニアとして避けて通ることができない技術です!
もっとコンテナについて学びたい!
こう思った方はUdemyの動画講座で学習を始めましょう!
こちらの記事で初心者におすすめの講座をご紹介しているので、よければ参考にしてみて下さい!
私もまだまだコンテナ勉強中です!一緒にがんばりましょう!!
それでは、これからも一緒に学んで、自己価値を高めていきましょう〜!
最後まで、お読み頂きありがとうございました!
参考文献
こちらの記事を作成するにあたり、たくさんのブログ記事を参考にさせて頂きました。
良ければ参考にしてみて下さい!
コメント