🎴

コンテナ技術の基本を徹底解説

2022/11/13に公開

はじめに

「コンテナ」という言葉を知っているだろうか?現在のIT技術で、コンテナは必要不可欠な技術である。多くのIT企業がコンテナを活用してコスト削減や生産性の向上を実現している。

そこで、今回の記事ではコンテナ技術の基本を徹底解説する。主に以下のような流れでコンテナ技術を解説しようと思う。

  • コンテナ技術とは
  • コンテナ化
  • コンテナ技術のメリット・デメリット
  • 主なコンテナ技術:DockerとKubernetes

コンテナ技術とは

コンテナ技術とは、1つの共有されたOS上で複数の独立したアプリケーションの実行環境を作成する技術である。より詳しく言えば、アプリけーションの動作に必要なOSの基本環境(カーネル)をDockerのようなコンテナエンジンを通して、コンテナ同士が共有できるようにすることでCPUやメモリなどのハードウェアのリソースと分離して仮想的な環境を作り出せる。

コンテナ技術の特徴

実行環境が軽い

コンテナ技術の特徴として、実行環境が軽いという点がよく挙げられる。コンテナの中では、仮想マシンのようにそれぞれ隔離されたOS環境が作成される。ホストとなるOSカーネル上で、そのOSカーネルの提供する環境隔離機能を用いて独自の実行環境を作り、その環境でアプリケーションを実行する。

一方で、仮想マシンはハードウェアとOSの間にハイパーバイザと呼ばれる管理層を挟んで、ハイパーバイザが提供する仮想的なハードウェア上で複数のOSを同時に操作できるようにする技術である。

本記事で紹介するDockerやKubernetesのようなコンテナ管理ツールでは、各コンテナに単一あるいは少数のアプリケーションを含め、コンテナを小さい粒度で扱うことができる。

高いポータビリティ

コンテナ技術の次の特徴としてあげられるのは高いポータビリティである。ポータビリティは様々な意味に解釈できる言葉だが、技術評論社の書籍『イラストでわかる DockerとKubernetes』では以下のように言及されている。(一部改変)本記事では1.に言及する。

  1. コンテナイメージの軽量さとその挙動の再現性の高さ
  2. 業界標準仕様によるコンテナへの統一的な操作方法

前述で、コンテナは軽量な実行単位であると言及した。それと同様に、コンテナイメージも軽量に作成できる。セキュリティの観点からも、コンテナイメージには実行するアプリケーションとそれが依存する最低限のコンポーネントだけを含めて小さく作るのがベストプラクティスになる。

GB(ギガバイト)級の容量になることも珍しくない仮想マシンイメージに対し、コンテナイメージは多くの場合数十MB~数百MB程度と軽量に作成される。そのため、異なる環境間でコンテナイメージを共有する際に迅速に行いやすいというメリットが考えられる。

さらに、コンテナイメージにアプリケーションが依存するコンポーネントすべてを詰め込むことで、コンテナをその作成時とは異なる環境で実行する際にも、その挙動の再現性を高められる。

コンテナ技術の問題点

OS依存が発生する

コンテナ技術はOSに依存しやすい

仮想化の場合、仮想マシン毎に独自のOSが搭載されているので、それぞれの仮想マシンで運用を分けられるものの、コンテナにおいては同一基盤上で異なるOSを動かすことはできない。

セキュリティリスクが高い

コンテナ化は仮想化と比較してセキュリティリスクが高くなる

複数のコンテナが特定のOS上で動作するので、大元のOSに不具合が生じた場合はすべてのコンテナに影響が出る。それゆえ、コンテナ化を行う際にはセキュリティレベルが高いサービスを活用しよう。

【注意・まとめ】仮想化とコンテナ化の違い

仮想化とコンテナ化は、ハードウェアのリソースを使って仮想的な環境を作成するという点では一致しているものの、両者は決定的な違いがある両者を混同しないようにしよう

仮想化とコンテナ化の違いには、主に以下のようなことが考えられる。

  • ゲストOS:仮想化では、仮想環境におけるアプリケーションの管理はゲストOS上で実行される。一方で、コンテナ化の場合はホストOSとプロセスが同期されている。それゆえにゲストOSを用意する必要がない。
  • 使用容量:仮想化で使用する仮想マシンは、アプリけーション以外にOSなどが容量に含まれるので使用容量が大きくなる傾向にある。コンテナは必要最低限のもの(例:ライブラリ)が容量としてカウントされるので容量を節約できる。
  • サーバ負荷:仮想化の場合、仮想マシン毎に独自のOSが搭載されており、アプリケーションを実行する際にメモリの使用料が増えてしまう。一方で、コンテナ環境で実行されるアプリケーションはOS環境を共有しているので仮想化よりも使用容量を減らせる。そのため、サーバの負荷を減らせる。
  • メンテナンス工数:仮想化における仮想マシンでは、メンテナンスの工数が大きくなる傾向にある。すべての仮想マシンに独自のOSが搭載されているので、OSアップデートやメンテナンスを個別に行わなければならない。一方で、コンテナ化の場合はコンテナを搭載しているサーバのみがメンテナンス対象となる。そのため、メンテナンス工数を削減できる。

主なコンテナ技術

Docker

Dockerとは、2013年3月にdotCloud社(現Docker社)が開発・リリースしたコンテナ管理ツールである。Dockerの最大の特徴は、煩雑なコンテナへの基本的な操作を「Build、Ship、Run」というシンプルなワークフローとして表現できることである。

「Build」「Ship」「Run」のそれぞれの言葉の意味を以下に示す。

  • Build:コンテナの材料からコンテナイメージを作成する
  • Ship:レジストリを用いたイメージの他ホストへの配布
  • Run:コンテナイメージからコンテナを実行

Kubernetes

Kubernetesとは、複数マシンから構成されるコンテナ群を管理するのに用いられるオーケストレーションエンジンである。k8sと表記されることがある。

【Kubernetesの主な役割】

  • 理想の状態をファイルで宣言すること
  • 理想状態に合致するようにコンテナを管理すること
  • 過去の状態を宣言しそれに戻すこと

おわりに

今回の記事では、コンテナ技術の基本的な知識を徹底解説した。コンテナ技術はエンジニアリングの効率を上げる上では必要不可欠である。今回の記事を通して、コンテナ技術についてより深く学びたいなら以下の記事を参照するといいだろう。

https://qiita.com/gold-kou/items/44860fbda1a34a001fc1

https://qiita.com/Kta-M/items/ce475c0063d3d3f36d5d

https://qiita.com/MahoTakara/items/85096f8b2632c802ab22

https://zenn.dev/esaka/articles/2d117655af1f03cf2444

参考サイト

https://psc-smartwork.com/topics/2021/08/162.html

https://www.topgate.co.jp/container

参考文献

https://gihyo.jp/book/2020/978-4-297-11837-2

GitHubで編集を提案

Discussion