今さら聞けないことを書く会：コンテナ技術①

# はじめに
仕事でよく「コンテナ」という話をよく聞くが、実は良く分っていない。
みんな本当にわかっているんだろうか？？って思う。
正直自分は良く分っていない。
きっとわかっているようでわかっていない人も多いだろう。
それなら、これを機にいろいろ勉強しなおし、分かりやすく纏められないかと思い、記事を書くに至った。

# コンテナ技術の最初の壁
コンテナの何が分かりにくいか、振り返って考えてみると、
最初にぶつかる壁としては

- コンテナと通常の仮想化の違いが分からない
- 用語・製品が多くて良く分らない

という2点があがった。
なので、今回はこの2点について分かる範囲でまとめていきたい。

※本稿に記載した内容は個人の感想なので、間違っていても怒らないでください。

# １．コンテナ技術と普通の仮想化の違い
コンテナ技術でできることを学んでいくと、VMwareなどで仮想マシンを作るのと何が違うの？
という疑問にぶつかってしまった。
ここが上手く説明できないと理解が進まないし、お客さんにも提案できないので、いろいろ調べてみた。

### １．１．コンテナ技術でできること
コンテナ技術でできることを調べていくと、最終的にできることは
- １つのOS/カーネルで複数の環境が用意できる
- 同じ環境をどんどん増やすことができる
といった情報が多い。

確かに便利かもしれないが、単純にそれなら仮想マシンで良くない？と思ってしまう。

「同じような環境・OSを展開・用意する」という目的としては、普通の仮想化技術でも達せられからである。
ではコンテナ技術の凄いところはどこなのか？というと、その方法や展開した後の運用に差があるのだと思う。

### １．２．コンテナ技術の良いところ
コンテナ技術の良いところの１つとして、軽いというところが挙げられる。
何故軽いのか？
それはアプリケーションを動かすために必要な物が少ないから。

例えば仮想マシンであるプリケーションの環境を複数用意する場合、

<b>1.ハードウェア > 2.ホストOS/HyperVisor > 3.仮想マシン > 4.OS/カーネル > 5.アプリケーション</b>

と言うような形になります。

対してコンテナの場合、たとえHyperVisor上で動かしている環境の場合、

<b>1.ハードウェア > 2.ホストOS > 3.仮想マシン > 4.OS/カーネル > 5.コンテナ > 6.アプリケーション</b>

となる。

あれ？コンテナのほうが階層が多い？ってなるかもしれないが、
これが複数環境を用意していく場合、話が変わってくる。

＜普通の仮想マシンで複数環境を用意する場合＞
1.ハードウェア > 2.ホストOS/HyperVisor <font color="Red">> 3.仮想マシン > 4.OS/カーネル</font> > 5.アプリケーション
　 　　　　　　　　　　　　　　　　　 <font color="Red">> 3.仮想マシン > 4.OS/カーネル</font> > 5.アプリケーション
　 　　　　　　　　　　　　　　　　　 <font color="Red">> 3.仮想マシン > 4.OS/カーネル</font> > 5.アプリケーション
　 　　　　　　　　　　　　　　　　　 <font color="Red">> 3.仮想マシン > 4.OS/カーネル</font> > 5.アプリケーション
　 　　　　　　　　　　　　　　　　　 ：
　 　　　　　　　　　　　　　　　　　 ：

＜コンテナで複数環境を用意する場合＞
1.ハードウェア > 2.ホストOS > 3.仮想マシン > 4.OS/カーネル <font color="Red">> 5.コンテナ</font> > 6.アプリケーション
　　　　　　　　　　　　　　　　　　　　　　　　　　　　<font color="Red">> 5.コンテナ</font> > 6.アプリケーション
　　　　　　　　　　　　　　　　　　　　　　　　　　　　<font color="Red">> 5.コンテナ</font> > 6.アプリケーション
　　　　　　　　　　　　　　　　　　　　　　　　　　　　<font color="Red">> 5.コンテナ</font> > 6.アプリケーション
　　　　　　　　　　　 　　　　　　　　　　　　　　　　　 ：
　 　　　　　　　　　　　　　　　　　　　　　　　　　　　 ：


おわかりいただけただろうか。
複数環境を用意する場合、普通の仮想マシンであればOSから複数用意する必要がある。
OSは本来アプリケーションを動かすために必要な物以外のサービスも動いており、
その分リソースを多く消費する。

対してコンテナの場合、コンテナを増やすだけで済む。
もちろんコンテナを増やすことで多少のリソース消費はあるが、OSを増やすに比べると非常に少なくて済む。

ここが普通の仮想化に比べてて、コンテナ技術の優れている点の１つのようだ。

もちろん他にも
・環境を簡単に増やせる
　⇒仮想マシンだとテンプレートの展開やクローンが必要
・同じ環境を用意できる
　⇒仮想マシンでは様々な理由で環境の差異ができやすい
など利点はあると思うが、おいおい詳しく調べて記事にしていきたい。

# ２．用語・製品について
コンテナ関連の用語として
Docker
kubernetes
OpenShift
などを聞くが、それぞれ何が違うのか、そもそも同じレベルの用語なのかが分からなかった。

### ２．１．Docker
Dockerというのは何か
Dockerとはコンテナーを生成することができる機能を持つサービス。
コンテナエンジンという。

これと同じレイヤーの製品として

LXC(Linux Containers)

というものがある。

普通の仮想基盤のイメージとしてはESXサーバに位置づけか？

### ２．２．kubernetes
kubernetesとはDockerによってつくられるコンテナ環境を管理するツール。
Googleが開発したオープンソースで、

- オーケストレーションツール
- オーケストレータ

というような名称で呼ばれている。
イメージとしては仮想基盤を管理する、vCenterのような位置づけ。

このオーケストレーションツールにはkubernetes以外にも

- Dockerの「Swarm」
- CoreOSの「fleet」
- Rancher Labsの「Rancher」
- Mesosの「Marathon」

という製品がある。
Docker自身も管理ツールを出していたが、kubernetesが標準になっている。（なりつつある？）

### ２．３．Openshift
kubernetesをベースとして、Redhatが作った製品。
アプリケーションを開発したり、動かしたりするために便利な機能を追加したもの。

大まかなイメージとしてはこういう枠組み。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617803/da4e5966-b5e8-5471-339a-e1198c576710.png)


# まとめ
結局うまくまとめられたかどうかわからないが、
コンテナ技術について自分が調べたことを纏めてみた。

所感としては小規模であればコンテナ技術と通常の仮想化技術ではそれほど差が無く、
大きな環境になればなるほど良い面が出てくるのだなという感想。
引き続き、勉強していきたいと思う。

# 参考文献
https://speakerdeck.com/moriwaka/kontenatosabajia-xiang-hua-falsewei-ito-docker-kubernetes-openshift
https://www.osscons.jp/cloud/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89/?action=common_download_main&upload_id=698
https://www.ossnews.jp/compare/Docker/LXC