今さら聞けないコンテナとは

# はじめに
**コンテナ**、IT業界にいる人間ならここ数年で何度も聞いたことがある単語だと思います。
一般的にモダンと言われているシステム開発において、積極的に使われている技術です。
なんとなくわかってはいるけど、従来の仮想化との違いを説明できない方もいると思います。
今回はコンテナの特徴と、従来のサーバ仮想化との違いについてわかりやすく説明したいと思います。

# コンテナとは
コンテナは、アプリケーションを実行するための実行環境をパッケージ化した技術です。

アプリケーションとその依存関係（必要なライブラリや設定など）を一つのまとまりにし、それを軽量でスケール可能な形式でパッケージ化します。
これにより、コンテナを使うことでアプリケーションの環境に依存せず、どんな環境でも同じように動作させることができます。

## 従来のサーバ仮想化との違い
従来のサーバ仮想化では各仮想マシンは独立した実行環境を持ち、それぞれにゲストOSが内包されます。
仮想マシンごとにリソース（CPU、メモリ、ストレージ）を割り当て、ひとつのサーバ上で異なるOSの実行環境を持つことができます。

コンテナでは、コンテナエンジンがサーバ上で実行環境を提供します。
コンテナはゲストOSを含まず、サーバのホストOS上で直接動作します。つまり、コンテナが複数あってもOSは共有されています。
個々のコンテナにOSを内包する必要がないので、コンテナは軽量で高速な実行が可能であり、サーバのリソースをより効率的に利用することができます。

![コンテナ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203022/a14aa7ba-d00b-6854-5a62-dd21c1dd8fb5.png)

## OSのバージョン違いの混在
ここまでの説明で、コンテナではサーバ仮想化と違ってOSを共有しているため、「**異なるOSの混在は不可能だ**」という理解になっていると思います。

実は同OSファミリーであれば、OSのバージョン違いやディストリビューション(各社の配付パッケージ)の混在は可能になります。

なぜOSのバージョン違いの混在が可能になるかと言うと、コンテナで共有しているのはOSのカーネル（OSの基本機能の役割を担う中核となるソフトウェア）のみだからです。

OSバージョン固有のライブラリや各ディストリビューションのライブラリは各コンテナ内に内包されます。
そのため、古いバージョンのOSを想定したアプリケーションも問題なく実行することができるのです。

イメージにするとこのようになります。
![コンテナ_OSバージョン違い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203022/85bfaf5c-be9e-05ad-51ac-68a91f1e9032.png)

この仕様により、例えばLinux系サーバでさえあれば、コンテナはRHELであろうがCentOSであろうがUbuntuであろうがアプリケーションを動作させることが出来ます。

:::note warn
あくまでも出来るのは**同OSファミリーのバージョン違い**の混在です。
異なるOSファミリー（例：LinuxとWindows）の混在は不可能です。
:::

:::note info
**この章のまとめ**
コンテナは、アプリケーションを実行するための実行環境をパッケージ化した技術。
従来のサーバ仮想化と違ってゲストOSを必要としないため、軽量で高速な実行が可能であり、サーバのリソースをより効率的に利用することが可能。
OSのライブラリはコンテナごとに変えることが可能なため、古いバージョンのOSを想定したアプリケーションも実行可能。
:::

# コンテナのメリット
コンテナ化することで何が嬉しいのかを紹介します。

## ポータビリティ（移植性）
コンテナのメリットとして「**どの環境でも同じように動く**」という点があげられます。
コンテナにはすべての依存関係が含まれているため、同じOSファミリーであればどこにでもアプリケーションを移植できます。
新しい環境を考慮してビルドをやり直す必要はありません。開発環境から本番環境まで、一貫した動作を保ちながらアプリケーションを実行することができます。

## 軽量で高速
サーバ仮想化と比べて、コンテナは軽量で素早く起動し、リソースの効率的な利用を可能にします。
コンテナは、OSの仮想化なしでホストOSのカーネルを共有するため、オーバーヘッドが少なくなります。

## スケーラビリティ
必要に応じて複数のコンテナを追加してアプリケーションのリソースを拡張することができます。
例えば、一時的なアクセス増加で処理の負荷が高い場合に、新しいコンテナを追加することでアプリケーション全体の処理能力を向上させることができます。
さらに、もし1つのコンテナに障害が発生した場合でも、他のコンテナが引き継ぐことでサービスの中断を最小限に抑えることができます。

## 本番環境でのトラブル減少
コンテナにはすべての依存関係が含まれているため、環境差異が起こらず、本番に近い構成での自動テストやベンチマークなどが行えます。
その結果、本番環境での動作前に未然にトラブルを防ぐことが期待できます。

:::note info
**この章のまとめ**

**コンテナのメリット**

■ポータビリティ（移植性）
・コンテナにはすべての依存関係が含まれているため、同OSファミリーであればどの環境でも動作可能。

■軽量で高速
・コンテナ内に仮想OSを含まずホストOSのカーネルを共有するため、軽量で高速起動が可能。

■スケーラビリティ
・負荷発生時のコンテナの追加が容易なため可用性が高い。

■本番環境でのトラブル減少
・本番に近い構成での自動テストやベンチマークなどが行えるため、本番障害を未然に防ぐことが期待できる。
:::

# コンテナのデメリット
コンテナのメリットはいくつもありますが、デメリットもあります。
具体的にどのようなデメリットがあるのかを紹介します。

## カーネルの共有による制約
コンテナはホストOSのカーネルを共有するため、ホストと同じOSファミリーである必要があります。
Linuxホスト上で動作するLinuxコンテナは問題ありませんが、Windowsホスト上でLinuxコンテナを実行する場合など、異なるOSファミリーのコンテナを実行することはできません。

## セッション管理の複雑性
コンテナは通常、短期間の実行を前提としており、コンテナが再起動や再作成されると、セッション情報も失われます。
永続的なセッション情報が必要な場合は、外部のデータベースやセッションストアなどを利用する必要があります。

:::note info
**この章のまとめ**

**コンテナのデメリット**

■カーネルの共有による制約
・コンテナはホストOSのカーネルを共有するため、互換性のあるホストと同じOSファミリーである必要がある。

■セッション管理の複雑性
・永続的なセッション情報が必要な場合は、外部のデータベースやセッションストアなどを利用する必要がある。
:::

# コンテナの注目度
独立行政法人情報処理推進機構（IPA）が公開したDX白書2023を見てみると、日本においてコンテナを活用している、または活用を検討しているの合計値が2割を超えています。
一方のアメリカでは、コンテナを活用している、または活用を検討しているの合計値が7割を超えています。
![独立行政法人情報処理推進機構（IPA）- DX白書2023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203022/43d2ce73-27f8-38c1-d960-fafe1236ba4c.png)
[独立行政法人情報処理推進機構（IPA）- DX白書2023](https://www.ipa.go.jp/publish/wp-dx/gmcbt8000000botk-att/000108041.pdf)

上記の結果からも、コンテナの注目度はかなり高いことがわかります。

:::note info
**この章のまとめ**
コンテナを活用している、または活用を検討している合計値

日本：2割
アメリカ：7割

日本人はコンテナに苦手意識がある？
:::

# さいごに
コンテナ技術は、現代のソフトウェア開発で一般的になりつつあるテクノロジーです。
その利点を最大限に活用するためには、学習が必要ですが、メリットも多いので是非採用したい技術だと思います。

:::note info
**最近よく聞くけど今さら聞けない技術用語**について、いくつか記事を書いています。
良かったらそちらもご覧ください。
:::
https://qiita.com/shinkai_/items/efe653174e8dc1bcd625

https://qiita.com/shinkai_/items/0fd5d72b6a584c16a8ec

https://qiita.com/shinkai_/items/79e539b614ac52e48ca4

https://qiita.com/shinkai_/items/4dcd8742cc524ceaa3a2

https://qiita.com/shinkai_/items/13e76a5641d9ec9a41d2

# 参考
[日本ヒューレット・パッカード合同会社 - Dockerコンテナと仮想化の違いとは？SynergyとDevOps](https://community.hpe.com/t5/hpe-blog-japan/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%A8%E4%BB%AE%E6%83%B3%E5%8C%96%E3%81%AE%E9%81%95%E3%81%84%E3%81%A8%E3%81%AF-synergy%E3%81%A8devops/ba-p/6980068?profile.language=ja)

[ThinkIt - 「コンテナ」の概要を知る](https://thinkit.co.jp/article/17301)