お問い合わせ
「SmartCloud」問い合わせ
資料請求・お問い合わせ
2019.10.16DevOps入門
DevOpsやCI/CDを実現するための技術の一つとして、コンテナ技術があります。コンテナは、アプリケーションの実行環境を仮想化する技術の1つで、仮想マシンなどに比べるとリソース消費が少ない、起動が高速などの利点があります。
コンテナの技術的な詳細を解説する前に、物理マシン、仮想マシンとコンテナを比較してみましょう。
ハードウェアを1台、まるごと使用するケースです。性能面では最も優れていますが、柔軟性にかけるので、高速なデータベースや機械学習など、特定の用途のために使われることが多くなっています。
物理マシンに比べて柔軟性があるため、現在ではサーバーを構築する際に標準的に使われるようになっています。メリットは、各仮想マシンは完全に別々に動作するので、OSやミドルウェア、アプリケーションなどを個別に動作させることができます。デメリットはOSのインストールや設定などは従来通り必要なこと、起動やI/Oが遅いこと、それぞれの仮想マシンでOSが動作するのでメモリ消費の無駄が多いことなどです。
素早い起動と、メモリ消費が少ないのがメリットです。それぞれのコンテナは単機能なので、複雑なシステム構成では複数のコンテナを組み合わせる必要があります。Webアプリケーションサーバーを大量に並べたい時などに向いています。
コンテナのメリットは素早い起動にあるので、CI/CDにおいてWebアプリケーションのデプロイ(展開)先とするのが最も分かりやすい活用方法でしょう。メモリ消費量も少ないので、複数の開発者がそれぞれデプロイしてもサーバーのリソースを圧迫しません。
また、複数のアプリケーションが協調して動作する必要があるマイクロサービスアーキテクチャを採用してシステムを動かす場合などにも、コンテナが活用されます。
ただし、すべてのシステムをコンテナで動かすわけではなく、Webアプリケーションはコンテナ、バックエンドのデータベースは仮想マシンや物理マシンで動かすなど、適材適所での利用をする方がよいでしょう。
コンテナは、OSから見るとプロセスの一種となります。ただし、一般的なプロセスがファイルシステムやネットワークなどOSが提供するリソースを共有するのに対して、コンテナは独自のファイルシステムを持ち、IPアドレスも別途持つため、分離独立した1つのサーバーのように動作します。それでも、あくまでプロセスとして動作するので、起動速度も速く、メモリリソースの消費量も最小限で済みます。コンテナの構成要素を考える上で重要なのは以下の3つです。
それぞれについて、解説していきます。
コンテナは独自のファイルシステムを持つ、と説明しました。このファイルシステムの元になるのがコンテナのイメージです。イメージはディレクトリ構造を持ったファイルシステムを1つのファイルにまとめたもので、仮想マシンの仮想ハードディスクと同様に考えればよいでしょう。
コンテナでは単一のプロセスを起動すればよいので、イメージに含まれるファイルはプロセス起動に必要な最小限のファイルのみ含まれていればよいことになります。
通常、イメージ内のファイルもディストリビューションのパッケージ管理システムで管理されます。たとえばCentOSのコンテナイメージであれば、CentOSで提供されているRPMパッケージをインストールした形でイメージが作成されます。
さらに必要なパッケージ、たとえばWebサーバーをインストールするのであれば、イメージに対してyumコマンドなどを使用してパッケージを追加でインストールして、必要なイメージを作成します(下図参照)。
最近では、あらかじめソフトウェアをインストールした状態のコンテナイメージを配布するケースも増えてきています。このイメージを使ってコンテナを起動すれば、インストール不要ですぐにソフトウェアが使用可能な状態になります。
図1 イメージとコンテナの変移
コンテナのファイルシステムは、イメージを元に構成され、動作中は差分ファイルの形で修正部分を保持します。この差分ファイルはコンテナが削除された時点で一緒に削除されるので、加えられた変更は保持されずに消えてしまいます。このようなコンテナの特性から、ストレージの利用方法を考えておく必要があります。
まず考えられるのが、ファイルに対する修正をコンテナに保持しないで使い捨てにする方法です。データを永続化する必要がある場合には、ファイルサーバーやデータベースを用意して、そちらに格納しておきます。
別の方法として、イメージとは別にボリュームと呼ばれる仮想ストレージのファイルを用意し、コンテナに接続することで、ボリュームに格納されたデータはコンテナとは別に保持されます。
コンテナは起動されると、独自のIPアドレスを割り当てられて、仮想ネットワークに接続されて通信が可能になります。ネットワーク接続方法には、独自のネットワークを構成して外部との通信にはNAPT(ネットワークアドレスとポートの変換)で通信する方法と、直接外部のネットワークに接続する方法などがあります。
前者の場合、必要なコンテナのみNAPTで外部から接続させることができるので、IPアドレスなどの管理が容易になるメリットがありますが、コンテナとポート番号の紐付けを別途管理する必要があります。
後者の場合では複数のホストでコンテナを動作させている場合、何らかのIPアドレス管理の仕組みが必要となります。どちらが優れているというわけではないので、構築したいシステムに応じてネットワーク接続形態を決めればよいでしょう。
コンテナには様々な実装が存在していますが、代表例として上げられるのがDockerです。コンテナの技術的な面でのデファクトスタンダードになっています。
Dockerの特長をあげるとすると、Dockerfileを記述することによる自動化処理でしょう。たとえば、コンテナイメージを作成する際にコマンドを実行して必要なパッケージがインストールされたイメージを自動的に作成したり、コンテナを起動した時に決められた処理を行うなど、定型化された処理を自動化できます。
さらにシェルスクリプトやAnsibleのような自動化ツールを組み合わせることで、コンテナ関係の処理の多くは自動化することができるでしょう。
複数のコンテナ用ホストを用意し、クラスタを形成する場合、その上で動作するコンテナはかなりの数となります。これらを統合的に管理するためにコンテナオーケストレーションツールが利用されます。
コンテナオーケストレーションツールの代表例がKubernetes(K8s)です。k8sを利用すると、複数のホストに跨がってコンテナを実行することができます。たとえばホストに障害が発生してコンテナが停止してしまっても、自動的に検知してコンテナを別ホストで再起動するなど、システムの健全性を保つための仕組みも持っているので、システム管理者は個別のコンテナを細かく監視・管理する必要がない利点があります。
次回、コンテナオーケストレーションにフォーカスして解説していきます。お楽しみに。
(日本仮想化技術株式会社 代表取締役社長兼CEO/宮原 徹)
※記載されている会社名、製品名、サービス名は各社の商標または登録商標です。