データインサイダー

コンテナとは

コンテナとは、ソフトウェアを標準化したモジュールで構築してポータビリティを高め、どのようなコンピューティング環境にも容易に導入できるようにする技術です。コンテナは、アプリケーションのコードとそのすべての依存関係を含めることができるように設計されているため、アプリケーションの実行に必要なすべてが1カ所にまとめられます。

ここ数年、コンテナは主要なソフトウェア開発ツールとなってきましたが、その理由の1つはコンテナの軽量さにあります。一般にコンテナは非常に小さく、そのサイズはわずか数メガバイトほどです。このため、ロードとアンロードを非常にすばやく行え、機能、パフォーマンス、ポータビリティ、管理のしやすさの面で優れています。

コンテナは、マイクロサービスの開発と導入の鍵を握る要素です。マイクロサービスは、1つの機能だけを実行するコンパクトなモジュールにアプリケーションを分割して、アプリケーションとアプリケーション開発を簡易化するアプローチで、すでに大きな影響を及ぼしています。IDCは、2021年までに新しいマイクロサービスの95%以上がコンテナで導入されると予測しており、その市場は今や数十億ドル規模となっています。

Microsoft、Google、Amazon AWSなどの主要なクラウドテクノロジープロバイダーは、DockerやKubernetesなどの一般的なツールを使用してコンテナを採用し、顧客向けの開発や導入作業の合理化を成功させています。

以下のセクションでは、コンテナのしくみについて深く掘り下げるとともに、コンテナが動作する主要なプラットフォームについて説明します。

コンテナと仮想マシン

コンテナと仮想マシンの違い

コンテナと仮想マシンは、どちらも仮想化の概念から生まれたものですが、仮想化の度合いが異なります。最大の違いは、仮想マシンには、仮想化されたオペレーティングシステムとアプリケーション、アプリケーションの依存関係が含まれていることです。そのため、一般的なコンテナのサイズがわずか数メガバイト足らずなのに対し、仮想マシンのサイズは数ギガバイトに及ぶこともあります。しかし、だからといって仮想マシンの用途がなくなったわけではありません。仮想マシンの場合は、1台のサーバーでいくつもの仮想マシンを同時に実行し、それぞれで別のオペレーティングシステムを動作させることができます。たとえば同じハードウェア上でWindowsサーバー、Unixサーバー、Linuxサーバーを同時に実行することが可能です。

コンテナの場合は、このようなことは不可能です。なぜなら、1つのデバイス上で実行するすべてのコンテナで同じオペレーティングシステムを共有しなければならないからです。このため、コンテナの使用が最も適しているのは、複数のOSを実行する必要のない環境です。

コンテナと仮想マシンの図

仮想マシンの代わりにコンテナを使用するメリット

仮想マシンと比べた場合、コンテナには次のような特長があります。

  • 小さい
  • すばやく起動できる
  • メンテナンスが容易
  • ポータビリティに優れている

サイズが小さいことが、スピードをもたらします。スピードは、コンテナの最大のメリットと言っても差し支えないでしょう。一般的な仮想マシンが起動に数分かかるのに対し、コンテナは多くの場合、数秒で起動します。コンテナでは、数十のアプリケーションを同時に起動するプロセスはほぼ瞬時に終了します。一方、仮想マシンで同じことを行った場合は、1時間あるいはそれ以上かかり、いくつものハードウェアが関わる可能性もあります。

仮想マシンにはオペレーティングシステムが組み込まれているため、その管理は複雑で時間もかかりがちです。データセンターの管理者はホストオペレーティングシステムにパッチを適用しなければならず、種類によって必要なツールや専門知識が異なることもあります。VMwareなどの複雑な仮想マシン環境ですべてを管理するのは簡単ではありませんが、コンテナなら1つのOS環境だけを管理すれば済むため、このような問題が緩和されます。

また、仮想マシンはクラウド(パブリッククラウドやプライベートクラウド)と物理サーバーが稼働するオンプレミス環境間で簡単には移動できません。しかし、コンテナなら、ある環境で開発して、別の環境に簡単に導入できます。

コンテナは安全なのか

コンテナは、多少の差はあっても、それ自体が安全性で非コンテナ環境より劣っているわけではありません。しかし、コンテナは新たなセキュリティ上の課題を生じさせます。これは、一般的なコンテナがこれまでにない複雑さを引き起こすことに大きな理由があります。コンテナイメージにはシステムライブラリなどの依存ファイルやファイルシステムが含まれているため、脆弱性が見つかることは珍しくありません。最も多用されているDockerの1,000コンテナについての分析では、さまざまなセキュリティの脆弱性がいずれについても見つかり、そのうち多くがクリティカルなものでした。このため、コンテナは安全ではないという認識が広まりました。

しかしながら、コンテナは本質的に安全性が低いというわけではありません。ただし、コンテナの開発や管理にあたっては、他のコンピューティング環境と同様にセキュリティに配慮する必要があります。

コンテナは仮想マシンより安全なのか?

仮想マシンとコンテナの安全性は、いずれもテクノロジーの管理方法など、多くの要素に左右されます。セキュリティは簡単に定量化したり、測定したりできるメトリクスではないため、2つのテクノロジーを直接比較することはできません。

適切に開発し、管理すれば、コンテナはかなり安全な環境となります。前述したように、コンテナは仮想マシンよりも複雑であり、仮想マシンが完全に隔離されて動作するのに対し、コンテナは予期しなかった方法で相互にやりとりすることもあるため、セキュリティの問題がさらに複雑になる可能性もあります。また、コンテナのホストOSのセキュリティについても考慮する必要があります。安全性の低いホストプラットフォームで稼働しているコンテナには、安全性の低いコンテナと同様のリスクがあります。

コンテナとクラウド

クラウドコンテナとは

クラウドコンテナとは、オンプレミス環境内ではなく、クラウドネイティブなサービス上で稼働しているコンテナです。コンテナはどちらの環境でも動作しますが、一般にクラウドネイティブなエコシステムの方が柔軟性に優れており、オンプレミス環境よりも少ないオーバーヘッドでコンテナの設定や運用を行えます。また、多くのクラウドサービスプロバイダーが、コンテナの運用やアプリケーションの開発とパフォーマンスを容易に管理できる、Webベースの監視ツールを提供しています。

Containers-as-a-Serviceとは

Containers-as-a-Service (CaaS)とは、企業がクラウドベースのサービスプロバイダーにコンテナの作成と管理を委託できる運用モデルのことです。CaaSでは、Software-as-a-Service (SaaS)やPlatform-as-a-Service (PaaS)などの他の「as-a-Service」モデルと同様に、再利用可能なソフトウェアコンポーネントがオンデマンドでリアルタイムに起動されます。CaaS環境では、コンテナと関連コンポーネントを運用できる包括的でクラウドネイティブなフレームワークがサービスプロバイダーによって提供されています。また、監視ツールも提供されていることが多く、利用企業は自社のコンテナの運用状況を詳細に把握できます。

CaaSモデルの一番のメリットは、コンテナを短時間で容易に構築して導入できることです。サービスプロバイダーがコンテナの監視を担うため、利用企業は業績に直接関わるコンテナの内容自体に集中することができます。

コンテナの監視とは

コンテナは、監視して、期待通りに動作しているかを確認する必要があります。従来の方法で開発されたソフトウェアと異なり、コンテナは、アプリケーションと基盤プラットフォームとの間に複数の抽象化レイヤーを生成します。このため、専用のツールが必要となり、従来の監視方法ではDevOpsの担当者が監視に行き詰まることになります。また、コンテナ環境は大規模に導入されることも多く、従来の監視方法では監視が困難です。適切に監視するには、コンテナを個別に監視できるとともに、全体としても監視できる高度なビジュアル化システムが必要です。この種の監視システムなら、開発者やDevOps担当者は、コンテナエコシステム内でわからないままになってしまいがちな問題を特定し、パフォーマンスやアクティビティのトレンドを発見することができます。

コンテナの種類

Linuxコンテナとは

Linuxコンテナは、Red Hatなどのベンダーが提供するオープンソーステクノロジーで、開発者はアプリケーションとコンテナランタイム環境全体をパッケージ化し、隔離することができます。Linuxコンテナには実行に必要なすべてのファイルが含まれているため、コンテナ化されているアプリケーションは、テスト環境、開発環境、本番環境などの環境間でシームレスに移動できます。テスト環境の複製に依存する従来の開発パイプラインを使用するよりも、Linuxコンテナを使用する方がはるかにスピーディーで効率が良いのは、このポータビリティによります。Linuxコンテナは、ポータビリティや構成、隔離が課題となっているさまざまな問題の解決策となります。また、その使いやすさから、数えきれないほどのITセキュリティの取り組みで重要な役割を果たすようになっています。

Linuxコンテナの実装は多数あり、いずれも、Linuxカーネル(具体的にはLinux名前空間とcgroup)が提供するメカニズムをベースとしています。たとえば、以下のものが挙げられます。

  • Docker
  • Linux-VServer
  • Imctfy
  • LXC
  • LXD
  • OpenVZ
  • rkt
  • Singularity
  • systemd-nspawn
  • Podman
  • Charliecloud
  • Kata Containers
  • Bottlerocket

Dockerとは

2013年に開発されたDockerは、コンテナベースのアプリケーションの構築、導入、管理を行え、開発ライフサイクルを通じてコンテナを容易に操作できる、業界標準のコンテナプラットフォームです。Docker Engineは、コンテナ環境を構築できるようにするもので、コンテナが稼働するオペレーティングシステムまたは仮想マシンとの対話を処理します。Docker Desktopには、コンテナとDockerイメージ(コンテナコードを実行するアプリケーション)を開発するツールが含まれています。

Dockerはマイクロサービスなのか

Docker自体はマイクロサービスではありませんが、Dockerを使用することでマイクロサービス(コンテナの主要なサブコンポーネント)を作成して運用できます。マイクロサービスは一般にコンテナ内に含まれており、コンテナはマイクロサービスに必要なインフラストラクチャをカプセル化する、と言い換えることもできます。

Kubernetesとは

Kubernetesは、コンテナのスケジューリング、管理、拡張に使用される、評価の高いオープンソースコンテナ管理システム(コンテナオーケストレーションプラットフォーム)です。Kubernetesには、特定のホストにコンテナを導入する機能、トラフィックの混雑時にコンテナをロードバランシングする機能、障害時にコンテナを再起動する機能、重大なインシデントの発生時にコードを自動でロールバックする機能が含まれています。

ほとんどの環境で、DockerプラットフォームとKubernetesプラットフォームは共存します。Kubernetesは、通常、コンテナのパッケージ化と実行をDockerに依存しています。Dockerがコンテナを構築するツールであるのに対し、Kubernetesはコンテナをグループとしてオーケストレーションするプラットフォームという位置付けになります。Kubernetesは高い評価を得ており、Docker社のオーケストレーションの代わりに使用されることが多くなっています。これは、Kubernetesが多数のコンテナを効率良く拡張できる、運用時の高可用性を確保するという2点で特に優れているためです。

Kubernetesはマイクロサービスなのか

Dockerと同様に、Kubernetesそのものはマイクロサービスではなく、マイクロサービスを含むコンテナをオーケストレーションするツールです。

Azureコンテナとは

Azureは、Microsoftのクラウドコンピューティングサービスであり、Azureコンテナは、Microsoftのプラットフォームで稼働するコンテナインスタンスです。Microsoftの最もシンプルなコンテナシステムは、Azure Container Instances (ACI)です。ACIは、マネージドサーバーレス環境で、オンデマンドでDockerコンテナイメージを実行できるように設計されています。Microsoftによれば、オーケストレーションが不要なケースでは、Azure Container InstancesはAzureにコンテナを導入する最もスピーディーでシンプルな方法です。複数のコンテナや拡張、アップグレードの連携が必要な複雑なアプリケーションには、フル機能を備えたAzure Kubernetes Service (AKS)を使用できます。

Amazon ECRとは

Microsoftと同様に、Amazonも複数のコンテナ関連サービスを提供しています。そのうち最もシンプルなものが、Amazon Elastic Container Registry (ECR)です。ECRは、開発者が自身のDockerイメージの保存、導入、管理を行える環境を提供する、マネージド型のDockerシステムです。コンテナイメージはAmazonのS3ストレージインフラストラクチャに保存され、データは自動的に暗号化されるとともに、複数の場所にバックアップされます。また、ECRは複雑な開発環境のIDおよびアクセス管理もサポートします。Amazon ECRは、次のセクションで触れるAmazon ECSと統合されるようにデフォルトで設計されています。

Amazon ECSとは

Amazon Elastic Container Service (ECS)は、Kubernetesと同様のオーケストレーションシステムですが、Amazon独自の専用システムです。Amazon ECRがコンテナイメージの保存、暗号化、管理に使用されるのに対し、Amazon ECSはそうしたコンテナ化されたアプリケーションの実行に使用されます。ECSは、Amazonが他のAWSサービスと緊密に統合するために開発したもので、一般にAmazon EKS (後述)よりもシンプルで料金も低く抑えられると考えられています。独自の拡張機能をすでに構築し、AWSというプラットフォームにロックインされることをいとわないAWSの長期ユーザーにとって、選択肢となりやすいコンテナオーケストレーションサービスです。

Amazon EKSとは

Amazon Elastic Kubernetes Service (EKS)は、Amazonが提供するコンテナオーケストレーションのためのクラウドベースKubernetesサービスです。EKSはECSと似ていますが、EKSのユーザーは、Amazon独自のサービスを使用する代わりに、自社のサーバーや他のクラウドサービス上で実行中のオープンソースKubernetesプラットフォームにフルアクセスできます。Amazonの多くの顧客が、自社のコンテナを他のサービスに移行できなくなるベンダーロックインを回避するためにEKSを採用しています。また、EKSは、サポートするコンテナイメージの数が圧倒的に多いなど、ECSよりもハイエンドの機能を備えています。ただし、そうした機能は料金が高く、管理や設定、セキュリティの確保に労力が必要になります。

Amazon EKSとECSは、両方を選べないため、どちらかを選ぶ必要があります。

AWS Fargateとは

AWS Fargateは、コンテナ向けのサーバーレスコンピューティングエンジンであり、基盤のサーバープラットフォームを意識せずにコンテナを導入できる、真のContainer-as-a-Serviceシステムです。Amazon ECSとAmazon EKSの両方に対応しており、ECS環境やEKS環境にサーバーをプロビジョニングして管理する必要がなくなります。ユーザーは使用したサーバーリソースの分だけ支払えばよく、コンテナ環境をシームレスに拡張できます。加えて、Fargateは、マシンへのパッチの適用、拡張、サイジングなど、サーバーに関連するあらゆる管理を不要にするように設計されています。仮想マシンをキャパシティ管理などのサーバー側の問題を心配せずに使用できるモノリシックなリソースプールに変えるのがFargateである、と言い換えることもできます。

 

Amazon EC2とは

Amazon Elastic Compute Cloud (EC2)は、AWSでコンテナや他のアプリケーションを実行するための評価の高いクラウドベースモデルで、一般的にはFargateよりもEC2の方がよく選択されます。EC2は正確にはIaaS (Infrastructure-as-a-Service)であり、コンテナサービスのプロビジョニングに使用されることが多いとはいえ、それ専用に構築されているわけではありません。14年以上の歴史を持つEC2は、ユーザー数の多さで知られており、Amazonの小売Webサイト自体も2010年にEC2に移行しています。現在業界で最も普及している成熟したクラウドコンピューティングプラットフォームの1つであるEC2のユースケースは無限にあり、EC2は、ほぼあらゆる種類のコンテナや仮想マシン環境を運用するプラットフォームとして広く選ばれています。

AWS App2Containerとは

AWS App2Container (A2C)は、既存のアプリケーションをコンテナ化して、Amazonのクラウドベースのコンテナサービスで使用できるようにする開発者向けのコマンドラインツールです。コードをゼロから書き直さずに、従来のモノリシックなサーバーベースのワークロードから移行でき、この変換(リファクタリング)は自動で行われます。.NetやJavaアプリケーションに対応しており、AWSのユーザーに無償で提供されています。

AWS Copilotとは

AWS Copilotは、AWSユーザーがECSおよびFargateプラットフォーム上でコンテナ化したアプリケーションを起動し、管理できるようにするコマンドラインツールです。Copilotを使用することで、ユーザーは、コンテナ化したアプリケーションを起動する際に、コンテナインフラストラクチャとその依存関係を自動で構築できます。AWSに本番環境を導入してコンテナを起動する一連のアクションをコードで定義すれば、Copilotがロードバランシングや、ステートフルなデータの保存といったコンポーネントの細部をバックグラウンドで処理します。

 
結論:コンテナ化を見据えるべき時の到来

従来のソフトウェアや仮想マシンからコンテナへの移行が本格化しています。Grand View Researchは、2018年には15億ドル規模であったコンテナ市場が、2025年までに26.5%拡大すると予測しています。Allied Market Researchは、同期間に31.8%というさらに急激な拡大を見込んでおり、コンテナテクノロジーの規模は2025年までに82億ドルに達すると見ています。

アプリケーションアーキテクチャのコンテナ化に取り組んでいない企業は、すぐに一歩を踏み出すことが極めて重要です。幸い、クラウドサービスプロバイダーは、コンテナの開発、導入、リファクタリングを容易にするツールやチュートリアルを提供して、コンテナへの移行を積極的にサポートしています。コンテナテクノロジーが仮想マシンに完全に取って代わることはないでしょうが、どの企業も環境を最適化し、競争力を維持するために、近い将来コンテナテクノロジーに投資することを迫られるのは間違いありません。