コンテナについて調べてみた

# はじめに
こんにちは。すぎもんです。:grinning:

あらゆる変化のスピードが早く、様々なニーズへの柔軟な対応が求められる昨今…
柔軟なシステム連携基盤を実現するために必要な「クラウドネイティブ」や「マイクロサービス」、またそれらを支える「コンテナ」について少しまとめてみました。


# アーキテクチャの変化
最近、クラウドネイティブという言葉を目にすることが増えました。
アーキテクチャ自体も変化していく中で、開発・運用手法も大きく変化しています。

自社サーバーやデータセンターを保有する企業も多かった**オンプレミス**の時代

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/c663ec13-fa97-f3c6-d296-ce2c795d8000.png)

オンプレ環境と併用してクラウド環境も活用する**クラウドリフト**、**クラウドシフト**によりオンプレミスのITシステムをクラウド環境に再現したり、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/609362d9-9582-8028-33cd-5eb83a5bdb44.png)

更には変化し続ける世界に適応するため<font color="red">**クラウドネイティブ**</font>（クラウド前提）へと変化しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/33de706d-19a9-f20e-0ae9-4aa9ae324a65.png)

:::note info 
**Check Point！**
クラウドネイティブは、その名の通り、一元的にクラウドサービスを活用したシステム基盤構築で開発、運用していくことで柔軟かつスピーディな業務推進を進めます。
:::

変化の激しい時代に沿って、システム環境やアーキテクチャそのものも変化しているようです。


### クラウドネイティブを支える技術
実際に「クラウドネイティブ」を実現するために、具体的にどのような技術が使われているのか調べてみました。

大きく5つがポイントとして出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/93cd0ecd-5049-e1ce-12f7-28c579c96356.png)

それぞれについて概要をまとめてみます。

| 技術 | 概要 |
|:-|:-|
| **コンテナ** | DockerなどOSレベルの仮想化技術です。 メリットは様々ありますが、機能単位で分割することでデプロイ等の運用負担をなくします。 |
| **サービスメッシュ** | マイクロサービスにより細分化されたサービスをどのように共有するかを制限する方法です。 |
| **宣言型API（Declarative APIs）** | サービス運用の複雑さを軽減し、シンプルなサービス運用ができます。 |
| **動的オーケストレーション** | 複数のコンテナのデプロイ、スケーリング、運用を行うための技術です。 |
| **マイクロサービス** | 機能単位でコンテナ化した各サービスを連携することで疎結合なシステム構成となり、迅速な開発サイクルや障害発生時に他に影響を与えないファイル連携基盤を実現します。 |

これらの技術を活用して、より効率的なアプリケーションやシステム開発を実現していくのが、「クラウドネイティブ」となります。


# マイクロサービスアーキテクチャとは
次に、クラウドネイティブの構成要素である「マイクロサービスアーキテクチャ」について整理します。

これまでは、アーキテクチャと言えば「モノリシック」が一般的でした。要は、1つのモジュールの中に全てが詰め込まれている状態です。どこかで変更があると全てに影響が出てしまうシステム構成のことです。

絵にするとこんなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/dc93f25c-1981-6c6f-1901-7a4744ef5b55.png)

::: note info
**Check Point！**
マイクロサービスは**疎結合**なのに対し、モノリシックは**密結合**となっていて、アプリケーションに変更が入った時の影響が大きい構成となります。
:::

### <font color="blue">■モノリシックアーキテクチャ</font>
+ **単一モジュール内の機能を<font color="blue">密結合</font>で連携**
  + アップデートはモジュール全体を対象にする必要があるため、開発サイクルは長期化
  + スケーリングにはサービス停止が必要
  + 不具合発生時の対応/プログラム更新時にサービス全体の停止が必要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/669ce262-599c-c7fb-b960-4c7fa330a5ff.png)


### <font color="orange">■マイクロサービスアーキテクチャ</font>
+ **コンテナ間を<font color="orange">疎結合</font>で連携**
  + コンテナ単体でのデプロイが可能なため、開発規模を限定した迅速な開発サイクルが可能
  + 柔軟な動的スケーリングが可能
  + 一部機能の不具合発生時に、他機能に影響を与えない信頼性

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4645d98b-a387-b868-533b-867d5e190ee4.png)


:::note info 
**Check Point！**
マイクロサービスアーキテクチャにおけるシステム構成では、アプリケーション単位で疎結合に連携し合うことが可能となります。
:::

アプリケーション単位での分割には、「コンテナ」という技術が使われているようです。


# コンテナって？
前述した通り、マイクロサービスアーキテクチャに欠かせない**コンテナ**技術は、意外と歴史が古く、2019年頃からPoCや開発環境でも使われ始め、最近では本番サービスでの活用へと広がっています。

コンテナが疎結合で独立していることによる大きなメリットは理解できましたが、もう少し踏み込んだコンテナの利点についてもまとめてみます。

### ■コンテナのメリットを図にしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/9524c59b-ef7f-ba39-2e80-510bc2bdbc34.png)

一般的かつ大きなメリットは4つです。

:::note info
**メリット**
+ **高可用性**
各アプリケーションがコンテナ毎に独立しているため他のコンテナへの影響が少ない。
+ **高可搬性**
APIで他のサービスとの連携が容易である。
+ **管理の容易性**
アプリ毎に環境が切り分けられているため管理が容易である。
+ **低コスト**
稼働環境自体は１つで良く、必要な時に必要な分だけ、必要な「コンテナ」を起動して利用するため、総合的にコストを抑えられる。
:::

# 最後に
いかがでしたでしょうか。まだまだコンテナについては知っておくべきことや技術的な面もありますが、今回は大きな概念的なところを中心に整理してみました。アーキテクチャの違いや、クラウドネイティブって？というところが少し整理できたように思います。

更に具体的なコンテナ技術についても整理していきたいと思いますので、また別の記事で。。
このブログでは、今後も様々なTopics記事や接続検証等、皆さんの役立つような記事を投稿していきたいと思います！
ここまで読んでいただきありがとうございました。それでは、また！:raised_hand: