コンテナを使う前にコンテナがなぜ利用されるかを知ってみる

記事タイトルとURLをコピーする

このブログは、サーバーワークス Advent Calendar 2023 の 17日目のエントリーです。 シリーズ2まであるので、他のブログも見てください。

qiita.com

昨日の投稿は、我らの中嶋氏がAmazon Connectについて投稿しおります。

blog.serverworks.co.jp

12月だというのに暖かく、半袖でブログを書いております。 アプリケーションサービス部の中村(哲)です。どうもこんにちは。

普段は、お客様へのAWSトレーニングを提供しております。 サーバーワークスが提供するトレーニングコンテンツの中で、お客様からよくご要望をいただく「コンテナ」についてご紹介します。 また今回はコンテナの内容でも、なぜコンテナが利用されるかを書いていきます。

アプリケーション開発のよくある課題

コンテナが何かを理解するために、まずは「アプリケーション開発のよくある課題」について見ていきましょう。 アプリケーション開発では、作成したソースコードを、複数の環境(サーバー) でテストします。一般的にはまず、開発者がローカル環境で作成したソースコー ドを「開発環境」に反映して、テストします。その後、本番環境と同様の運用を行っている検証環境でもテストします。この複数回のテストを経てはじめて、本番環境でアプリケーションを稼働させま す。なお、開発環境や検証環境は常に同じものを全員で使うわけではなく、プロジェクトや開発機能ごとに個別で用意することがあります。このようにアプリケーション開発では、開発環境、検証環境、本番環境のように、複数の環境が必要です。これらをすべて手動で構築すると作業工数 がかかるうえに、構築時に人的ミスが発生する可能性があります。

複数の環境を用意するには、各環境の構築やテストを行うので時間がかかる

またアプリケーションは、アプリケーションのソースコードだけではなく、そのソースコードを実行するためのソフトウェア(ランタイム)や依存関係があるライブラリなどが必要でです。そしてそれらをインストールしたり環境変数などを設定したりしてはじめて、アプリケーションは動作します。

アプリケーションの動作にはランタイムやライブラリ、環境変数の設定なども必要

そのため複数の環境を構築する際、各環境のランタイムやライブラリのバージョンを揃えておかないと、思わぬところで 不具合が発生する場合があります。たとえば本番環境だけライブラリの更新が漏れていると、検証環境までは問題なく動作していたアプリケーションが本番環境 では動作しないといったことも発生しか ねません。

環境間のバージョン差異による障害発生

このように、複数の動作環境を手動で、同じランタイムやライブラリのバージョンで揃えてミスなく構築することはとても難しいものです。

解決方法としてのコンテナ

ここまで述べた課題を解決する 1つの手法が「コンテナ」です。コンテナとは、アプリケーションやランタイム、ライブ ラリなど、アプリケーションの動作に必要なものをパッケージ化したものであり、仮想化技術の 1つです。

コンテナはスムーズな開発を手助けする

コンテナは、アプリケーションとランタイムなど、アプリケーションの動作に必要なものが含まれたイメージファイル (コンテナイメージ)から作成します。そしてこのコンテナイメージがあれば、 開発環境と本番環境のような異なる環境でも、同じコンテナを作成できます。そ のため、アプリケーションの動作環境を複数構築することが、コンテナなら容易またコンテナイメージではライブラリやランタイムのバージョンを指定すること も可能なので、コンテナであれば環境間のバージョンを揃えられる、というメリットもあります。 このように、異なる環境でも実行できる性質を可搬性(ポータビリティ)といいます。コンテナは可搬性がとても高い技術です。

コンテナは可搬性が高いので、同じバージョンの環境を複数作ることが用意

軽量なコンテナ

コンテナと似た技術に、サーバー仮想化があります。サーバー仮想化とは、仮想化ソフトウェアやハイパ ーバイザーによって CPUやメモリ、ストレージなどのハードウェアリソースを仮想的に作成することで、複数のOSを同一のハードウェア上で実行する技術です。この仮想的に作られたハードウェアリソースは仮想マシン、仮想マシン上で稼働する OSはゲストOSと呼びます。 一方、コンテナにはホストOSのカーネル機能を用いる必要最小限のリソースがありますが、サーバー仮想化のようなフル機能なゲストOSはありません。あくまでカーネル(OSの中核部分)はホストOSのものを使うことで、ゲストOSのオーバーヘッドを削減しているのです。そのため サーバー仮想化よりコンテナのほうが、起動が速く軽量です。このような特長があるため、コンテナは近ごろのアプリケーション開発で使われ ることが非常に多くなっています。

サーバー仮想化に比べてコンテナはゲストOSがない分、オーバーヘッドを削除できる

サーバー仮想化との違い

コンテナのイメージを掴んでもらうため、私がお客様にお伝えしているサーバー仮想化とコンテナの違いは、たとえるならサーバー仮想化は各部屋がそれぞれ 分かれているロッジ、コンテナは泊まるのに必要最低限なものだけを用意したテ ントのようなものです。ロッジの場合、各部屋にキッチンやお風呂、水道などが備わっており、ほかのロッジとそれらを共有しません。またロッジは、宿泊者によっては使わない設備も、最初から備わっています。このような特徴は、サーバー仮想化に通じるものがあります。 サーバー仮想化では各仮想マシンでゲストOSを持ち、それらを複数の仮想マシンで共有することはありません。一方テントの場合、キッチンやお風呂、水道などは、キャンプ場にあるものを共有で使います。またテントは立てたりしまったりが簡単にできます。コンテナは テントに似ています。コンテナではあくまでカーネルはホスト OSのものを使うので、複数のコンテナでカーネルは共有しています。またコンテナはアプリケーションに必要なものをまとめた軽量な箱な ので、作っては削除することが容易です。

まとめ

アプリケーション開発における課題や環境構築の手間などをご説明し、コンテナがなぜ解決策となるかもご紹介しました。またサーバー仮想化と違い軽量であることや今回説明はしませんでしたが、ゲストOSなどがなく必要なものしかない分セキュリティリスクなども低くなります。しかしメリットだけではなく、コンテナを利用する上でのデメリットとしてコンテナ独自の操作に加えて、複数コンテナの管理方法習得などラーニングコストやコンテナイメージに悪意のあるプログラムが含まれている場合などのセキュリティ対策も必要になります。このようなコンテナ管理や運用を行う上で、AWSではECRやECS、EKSなどのコンテナのマネージドサービスがありますので、これらのサービスをうまく使いより便利にコンテナを使ってみてください。

宣伝

今回ご紹介した内容は、2023年6月に執筆、発売しました いちばんやさしい新しいAWSの教本 人気講師が教えるDXを支えるクラウドコンピューティング にも記載しております。またAWSのコンテナサービスを使ってみたいという方に、何から始めれば良いかをわかりやすく説明したと思っておりますのでご興味がある方は、ぜひ読んでいただければと思います。

book.impress.co.jp

宣伝パート2

でも本を読むだけではなく、実際に手を動かしておしえてほしいよ。という方は、サーバーワークスのトレーニングをご検討していただけば幸いです。 お客様の課題やご要望に合わせてサーバーワークスのトレーニングチームが、講義とハンズオンを合わせたトレーニングを実施いたします。ご興味がある方は、お話をするだけでも構いませんので以下のサイトからご連絡いただければ幸いです!!

www.serverworks.co.jp