100日後にエンジニアになるキミ - 94日目 - 開発環境 - 仮想化について

昨日までのはこちら

[100日後にエンジニアになるキミ - 91日目 - 運用 - 監視について](https://qiita.com/otupy/items/532d0f78b103d3b39b2d)

[100日後にエンジニアになるキミ - 90日目 - 開発 - CIについて](https://qiita.com/otupy/items/25786feaaa1b1f4d203f)

[100日後にエンジニアになるキミ - 88日目 - データ - データ転送について](https://qiita.com/otupy/items/e720e175c83a84e101c9)

[100日後にエンジニアになるキミ - 86日目 - データベース - Hadoopについて](https://qiita.com/otupy/items/0016a1b9f496627619b6)

[100日後にエンジニアになるキミ - 76日目 - プログラミング - 機械学習について](https://qiita.com/otupy/items/6a4f960ba4df06e27050)

[100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて](https://qiita.com/otupy/items/f53e2e7d16adf80b5acf)

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

本日はに開発における仮想化についてです。

## 仮想化について

一般的にIT業界で`仮想化`というと`サーバーの仮想化`のことを指すと思いますが
`デスクトップ仮想化`などもあります。

`サーバーの仮想化`は1台のサーバー上で複数の仮想サーバーを運用することを言い
`デスクトップ仮想化`はサーバー上でPCのデスクトップ環境を再現する事を言います。

### サーバー仮想化の手法

サーバーは物理的には1台です。仮想化はソフトウェアによって
ハードウェアとしての物理的なリソース(CPU,メモリ,HDD,ネットワーク)などは共有し
その上に物理的な台数以上のサーバーが稼働しているように見せかける事になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/223e4cd8-82ad-ec3e-6344-d30ebe899d18.png)

参考：https://www.kagoya.jp/howto/rentalserver/virtualization/

サーバー上に複数のOSを載せることになるため、用語の区別として
サーバー自体のOSの事を`ホストOS`、`ホストOS`の上で稼働するOSの事を
`ゲストOS`と言っています。

仮想化のソフトウェアとしては`VMware`,`Hyper-V`,`Xen`などがあります。

また、最近のクラウドサービスの仕組みもこの仮想化の技術によって支えられており
`AWS EC2`などではOSやCPU、メモリを選択してゲストOSを作成します。

ゲストOSはバックアップを取ることができるため、万が一壊れてしまっても
すぐに復旧させることができるのが仮想化のメリットでもあります。

ゲストOSについては`仮想マシン（VM）`とも呼んだりすることがあります。

### デスクトップ仮想化

`デスクトップ仮想化`はサーバ上においたPC環境のデスクトップ画面を
遠隔地でも接続可能にし、セキュアな環境で利用する技術です。

端末側にデータやアプリケーションを置かずに
サーバ側にアクセスして処理する仕組みのため
ネットワーク環境さえあれば、場所や端末を問わず
安全にPC環境を利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/bb8da832-3e62-32b2-98b3-b2a3c99031ff.png)

参考：https://jpn.nec.com/solution/dtvsol/about/index.html

最近ではリモート業務も進んできているため
こう言ったデスクトップ仮想化を活用する事で
セキュリティーレベルをあげ
情報漏洩などを防ぐことが出来るようになります。

こちらも`VMware`などで実現することができます。 

### 仮想化のメリット

**コスト削減**

サーバーはフル稼働していなければ、リソースが余ることになります。
複数台のサーバーでリソースが余っている状態は
無駄なコストが発生していることになります。

サーバーのリソースをフル活用するために
仮想化を利用して台数を減らすことで
`コスト削減`を図ることができます。

電気代やサーバーの管理費、リプレース時のコストも下がる形になります。


**拡張性**

クラウドでの話になりますが、拡張性が高いというのが挙げられます。
ハードウェアを買い増すには増設計画を立てて稟議を通し
手続きなど手順を踏んだ上でようやく増設になります。

それでは急激なトラフィックの上昇に間に合わないので
こう言った手続きの手間暇を軽減させ
柔軟にサーバーの台数を変更できるのが
クラウドで仮想サーバーを使うメリットです。

繁忙期には増やし、閑散期には減らすと言ったことも容易であるので
運用コストも下がります。

**耐障害性**

物理的なサーバーのハードウェアに障害が発生した場合でも
仮想化したOSであれば他のサーバーに移行して利用することができます。

このような耐障害性に優れている点も仮想化の大きなメリットです。

### 仮想化のデメリット

**処理能力**

仮想化はサーバー上のソフトウェアで行うものであるため
パフォーマンスは物理的なサーバーの性能に依存します。

そもそもそこまでスペックの良くない機種での運用の場合
仮想化することで逆に処理能力が低下してしまうことも考えられるため
導入前に十分な性能が出せるのかを検証しておく必要があります。

**運用体制**

仮想化するにはどこで何のOSが動いて何を行なっているのか
整理をしておかなければなりません。
仮想化の技術に関する知識も必要であるため
運用面では学習コストなども考慮しなければなりません。

またバックアップや起動停止などの手順も複雑になるため
専門の知識は必要になってきます。

**セキュリティー面**

仮想化を行うことで、1つの物理サーバーに多数の機能が集約される
形になるためより一層セキュリティーを強化する必要があります。

### 仮想化の新潮流「コンテナ」

仮想化と言えば一昔前は`ゲストOS`を用いた仮想化がほとんどでした。

最近では`コンテナ`と呼ばれる技術が出てきています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/de9429ae-76ac-1832-4fef-69141eba086c.png)

参考：https://pfs.nifcloud.com/navi/tech/container_virtualization.htm

従来の仮想化では1台の物理マシン上には`ホストOS`が起動し
そのOS上で複数の`ゲストOS`が稼働していました。

しかし仮想化ソフトを使用した仮想化環境にもデメリットがあります。
複数OSを利用することによる性能劣化や
仮想化ソフトウェアの介在による複雑化などがあります。

そこで注目されているのが`コンテナ`です。

`コンテナ`は`ホストOS`上にアプリケーションの起動に必要な
アプリケーション・ライブラリ・設定ファイルなどをひとまとめにした
`コンテナ`を作成し`コンテナエンジン`上で動作させる技術のことです。

通常の仮想化と似ている点もありますが、大きく異なる点として
`ゲストOS`を用いないということです。

`コンテナ`では`ゲストOS`を起動することなく
アプリケーションの実行環境を構築することが可能になるため
仮想マシンに比べて少ないリソースで済むのが特徴です。

このような`コンテナ`技術を牽引するソフトウェアとしては
`docker`と言うものがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/cfc41fb8-2613-cc7b-82da-4e702bae9cb0.png)


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

まずは開発環境の作成が容易になるというのが大きなメリットです。
開発環境を1から作成するにはかなりの時間を要することがあります。

`コンテナ環境`ではあらかじめ作成した`コンテナ`を配布することで
比較的容易に開発環境の構築ができます。

加えて仮想化に比べてリソースの消費量が少ないので
負荷が小さくて済むのも大きなメリットです。

これにより、開発・更新のペースが早い現場では
かなりの工数削減が期待できます。

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

まずは比較的新しい技術であるため
学習コストがそれなりにかかるという事です。

複数のコンテナを運用する際の管理も
複雑になり大変だということもあります。

また開発の頻度が少なくリソースも少ない現場では
導入のメリットが少ないです。

## まとめ

仮想化の技術はインフラエンジニアにとっては欠かすことのできないものです。
当然、ソフトウェアの開発エンジニアにとっても開発環境の整備は重要なので
押さえておく必要があります。

最近ではOSの仮想化に変わる、コンテナ技術が出て来て
モダンな開発現場ではほぼほぼ100%に近い割合で浸透して来ています。

これからエンジニアとして働きたい人にとっては
こう言った技術体系を抑えておく必要もあります。

君がエンジニアになるまであと06日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython