(No.6) おじさんが、LINE風アプリを開発する - 仮想機械、コンテナについて調べてみるよ - その１

# 前回までのあらすじ
- GitHubを利用して、おじさんの成果物を公開する準備が整いつつあるよ
    - [(No.1) おじさんが、Git・GitHubを利用できるようにしてみる - GitHubにユーザを登録する](https://qiita.com/resojisan/items/4cd09b7a5f33ca8a925d)
    - [(No.2) おじさんが、Git・GitHubを利用できるようにしてみる - GitHubを利用してみる](https://qiita.com/resojisan/items/75dcc83ea55af0db329f)
    - [(No.3) おじさんが、Git・GitHubを利用できるようにしてみる - GitHubからリポジトリを複製（クローン）する](https://qiita.com/resojisan/items/f119d8b71e3bba9eadec)
- 目標を立てたよ、LINE風アプリが作れるようになることを目指すよ
    - [(No.4) おじさんが、何を開発するのか目標を立てるよ](https://qiita.com/resojisan/items/6a8690d21fe9ab00189d)
    - [(No.5) おじさんが、LINE風アプリを開発する - メッセージの送受信を考えてみるよ](https://qiita.com/resojisan/items/6418171fcc80bc3122cf)

# 調査の目的
- おじさんの開発環境はmacOS。おじさん以外の人でも試すことの出来る成果物を（なるべく）作成したいんだよ。
    - OS（オペレーティングシステム）等の環境差異(macOS? Windows? Linux?)が問題になりそうだよ。
    - 開発環境の差異を改善(解消？)する手段として、仮想機械やコンテナと呼ばれるものが利用出来るかもだよ？？
    - 目的に合致する技術があるのか調査してみるよ。

## 仮想機械（仮想マシン、バーチャルマシン、VM）
- [仮想機械](https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E6%A9%9F%E6%A2%B0)
    - コンピュータ等のハードウェア（機械）そのものを、ソフトウェアで模倣して再現する仕組みと理解したよ。
    - おじさんのコンピュータのなかに、別のコンピュータの動きを再現したソフトウェアを動作させるようなものだよ。
    - 任天堂のゲーム機である[Wii U](https://ja.wikipedia.org/wiki/Wii_U)の[バーチャルコンソール](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB)のようなものだと思うよ。  
（Wii Uのなかで、ファミリーコンピュータを動作させるようなもの）
    - [エミュレータ](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF)とも呼ぶことがあるらしいよ。
    - この仕組を利用すると、例えば、macOS上にWindowsやLinux等の、macOSとは異なる種類のOSを動作させることも出来るみたいだよ。
    - 様々な条件のコンピュータを、所有するコンピュータの上で再現出来るようなので、おじさんの目的の一つである「開発環境の差異を解消する」ことに利用出来そうな技術だと感じるよ。（たぶん）
    - 「仮想機械」と書くと字数が多いので、おじさんは「仮想マシン」と呼ぶことにするよ。

## 仮想機械（以後、仮想マシンと呼ぶ）の種類
- 大別して2種類の方式があるようだよ。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419842/a69cdb7b-22b2-0715-1eca-ace4ba717a7a.png)
    - （１）ホストOSタイプ
        - ハードウェア（機械）の上にWindows／macOS／Linux等のOSがあり、ハードウェアの資源（CPUやメモリ等）をOSが管理して、OSの上で動作するアプリ等に資源を振り分ける。（この根本にあるOSをホストOSと呼ぶ）
            - 後述の仮想マシンがいなければ、おじさんが普段利用しているコンピュータの構成と変わらないってことだよ。
        - 仮想マシンと呼ばれるハードウェアの動作を模倣するアプリをホストOSの上で動作させる。これは、コンピュータのなかに、仮想のコンピュータを動作させることを意味するよ。
        - 仮想マシンの上に、Windows／Linux等のOSをインストールするみたいだよ。
        - それぞれの仮想マシンの上では、OSが動作しているので、そのOSの上でアプリを動作させることが可能だよ。
            - 仮想マシンの上で動作するOSのことをゲストOSと呼ぶよ。
        - 上図（左）の例では、２つの仮想マシンが動作しているので、ホストOS + 仮想マシン(x2）で、3台分のコンピュータが1台のコンピュータで動作することになるよ。
        - ホストOS上のアプリと、仮想マシンは同時に利用することが可能だよ。（macOS上でChromeを操作しつつ、それと同時に、Windowsを動作させるようなことも可能）
        - ホストOSからみれば、仮想マシンも他のアプリと同じ位置付けのようだよ。
        - ホストOSタイプの製品や[オープンソースソフトウェア(OSS)](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)には次のようなものがあるよ。
            - [VMware Fusion](https://www.vmware.com/jp/products/fusion.html)
            - [VMware Workstation Player](https://www.vmware.com/jp/products/workstation-player.html) 
            - [Oracle VirtualBox](https://www.virtualbox.org/)
            - [Parallels Desktop](https://www.parallels.com/)
            - [QEMU](https://www.qemu.org/)
    - （２）ハイパーバイザータイプ
        - [ハイパーバイザー](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6)
        - [Oracle VMの仮想化とは](https://www.oracle.com/technetwork/jp/articles/nakajima-ovm-095944-ja.html)
        - [ハイパーバイザーとシステム仮想化について学び、クラウド環境で機能する仕組みを理解する](https://www.ibm.com/developerworks/jp/cloud/library/cl-hypervisorcompare/index.html)
        - 本物(実機)のハードウェアの資源（CPUやメモリ等）を、ホストOSの代わりに仮想マシンに振り分けたり、仮想マシンを管理することが仕事のようだよ。
        - 多目的・多機能なホストOS(macOS／Windows／Linux）を必要としないため、ホストOSタイプよりも効率が良いみたいだよ。
            - [Oracle VMの製品解説によると](https://www.oracle.com/technetwork/jp/articles/nakajima-ovm-095944-ja.html)「ハイパーバイザータイプは従来型のホストOSタイプと比べて、仮想マシンと実際のハードウェアがより直接的にやりとりができる仕組みになっています。OSとハードウェアでやりとりする命令や転送するデータが経由するレイヤが薄い分、従来型の仮想化ソフトウェアとは比較にならないパフォーマンスを誇ります。ホストOSタイプのサーバー仮想化ソフトウェアは、通常使っているWindowsやLinuxなどのOS上にインストールできて簡単に仮想環境を構築できますが、オーバーヘッドが発生するため、開発で使えても実運用には向きません」と主張してるよ。本当のことかどうかは、おじさんにはわからないよ。
        - ホストOSタイプとハイパーバイザータイプの性能比較が出来れば面白そうだけど、実際に計測してみないとわからないよね。
        - ホストOSと比較すると、仮想マシンを動作させることに特化した仕組みと言えそうだよ。
        - ハイパーバイザータイプの製品や[オープンソースソフトウェア(OSS)](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)には次のようなものがあるよ。
            - [VMware vSphere Hypervisor](https://www.vmware.com/jp/products/vsphere-hypervisor.html)
            - [Oracle VM Server](https://www.oracle.com/virtualization/vm-server-for-x86/)
            - [Xen](https://xenproject.org/)
    - ホストOSタイプ？ハイパーバイザータイプ？
        - ホストOSにハイパーバイザーの機能が組み込むなどして、ハイパーバイザーの機能を持つOSもあるみたいだよ。
        - ホストOS上の１アプリとして仮想マシンを動作させる方式よりも、仮想マシン〜ハードウェア間の距離が近いのかな？？
            - [Hypervisor framework(macOS)](https://developer.apple.com/documentation/hypervisor)
            - [Hyper-V(Windows)](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/about/)
            - [KVM(Linux)](https://www.linux-kvm.org/page/Main_Page)

## 仮想マシンやハイパーバイザーをハードウェアで支援する機能
- [Intel製CPUの場合： Intel VT](https://www.intel.com/content/www/us/en/virtualization/virtualization-technology/intel-virtualization-technology.html)
    - [Intel® Virtualization Technology: Best Practices for Software Vendors](https://software.intel.com/en-us/articles/intel-virtualization-technology-best-practices-for-software-vendors)
        - ゲストOS〜ハードウェアとの間で発生する仕事を、専用のハードウェアが対応することで、処理効率を高めるものみたいだよ。
        - Intel VT（や、AMD-V等）が存在しない場合は、汎用的なCPUが頑張ることになるので、性能面で不利になるみたいだよ。
        - 具体的に何をやってくれているのかは、もう少し調べないと、おじさんわからないよ。
- [AMD製CPUの場合： AMD-V](https://www.amd.com/en/technologies/virtualization)

# あとがき
- 次のことがぼんやりわかった（気になった）ように思うよ。
    - 仮想マシン
        - ソフトウェアでコンピュータ（ハードウェア）を模倣／再現した環境を仮想マシンと呼ぶみたいだよ。
        - 仮想マシンはmacOSなどのOS（オペレーティング・システム）上で動作するアプリのようなものだよ。
        - 仮想マシン上にWindows／LinuxといったOS（オペレーティング・システム）を動作させることが出来るよ。
        - macOS上でWindowsを動作させるようなことが可能だよ。
        - 開発環境の差異を吸収する目的に利用することも可能な気がしたよ。
    - 仮想マシンの種類（ホストOSタイプとハイパーバイザータイプ）
        - ホストOSタイプ： ホストOS上で動作するアプリの一つとして、仮想マシンを動作させるようなもの。仮想マシンがハードウェアの機能にアクセスするには、OSを介して間接的にアクセスする必要があるみたいだよ。
        - ハイパーバイザータイプ：　ホストOSの代わりに、仮想マシンを動作／管理するプログラムのことを指すみたいだよ。ホストOSと比較して、仮想マシン〜ハードウェア間の距離が短いので、仮想マシンとしての効率はホストOSよりも優れているみたいだよ。
        - ホストOSにハイパーバイザーの機能が組み込まれているOSも存在するようだよ。（例：macOSのHypervisor framework、WindowsのHyper-V、LinuxのKVM等）
    - 仮想マシンやハイパーバイザーをハードウェアで支援する機能
        - CPUの種類によっては、仮想マシンやハイパーバイザーを効率化する機能があるみたいだよ。
            - Intel VT、AMD-V

## 次回
- 仮想マシンを調べると、必ずといっても良いほど現れる「コンテナ」についても調べていくよ。
- 仮想マシンとコンテナは競合するものなのか？　それとも目的や用途が異なるものなのか？
- おじさんの目的（開発環境の差異をなるべく軽減する）に合致するのは、いずれか？！（仮想マシン？コンテナ？どっち？まさかの両方？？）


# 参照・メモ
[ハイパーバイザ](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6)
[仮想機械](https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E6%A9%9F%E6%A2%B0)
[Containers vs. VMs: What’s the difference?](https://www.ibm.com/blogs/cloud-computing/2018/10/31/containers-vs-vms-difference/)
[仮想化の概要](https://docs.oracle.com/cd/E37520_01/b69423/vmusg-virtualization.html#vmusg-hypervisor-table)
[Oracle VMの仮想化とは](https://www.oracle.com/technetwork/jp/articles/nakajima-ovm-095944-ja.html)
[ハイパーバイザーとシステム仮想化について学び、クラウド環境で機能する仕組みを理解する](https://www.ibm.com/developerworks/jp/cloud/library/cl-hypervisorcompare/index.html)
[1日5分のXen理解: 第1回 仮想マシンとは何か？](https://www.ibm.com/developerworks/jp/linux/library/itm-review1/index.html)
[これだけは知っておこう！いまどきのクラウド用語 2019](https://www.ibm.com/blogs/think/jp-ja/zd1-innovate-glossary/#container)
[コンテナとは何か](https://www.ibm.com/blogs/solutions/jp-ja/what-is-containers/)
[GOOGLE のコンテナ](https://cloud.google.com/containers/?hl=ja)
[マイクロサービス / Dockerコンテナー / Kubernetes 概要](https://www.ibm.com/developerworks/jp/cloud/library/cl-microservices-docker-k8s/index.html)
[マイクロサービスとコンテナーを併用すべき理由](https://www.ibm.com/developerworks/jp/library/why-should-we-use-microservices-and-containers/index.html)
[What is a Container?](https://www.docker.com/resources/what-container)
[Get Started, Part 1: Orientation and setup](https://docs.docker.com/get-started/)
[Docker overview](https://docs.docker.com/engine/docker-overview/)
[Docker道場「Dockerの基本概念」0825インフラ勉強会資料](https://www.slideshare.net/zembutsu/docker-basis)
[Docker ドキュメント日本語化プロジェクト](http://docs.docker.jp/)
[AWSでDockerを扱うためのベストプラクティス](https://www.slideshare.net/AmazonWebServicesJapan/awsdocker)