仮想化・クラウド

仮想化って何?

仮想化とは、「OS環境の上で別のOS環境を再現できる」技術。
主に、サービスを開発する際、試験環境で実際の本番環境と同等の環境を構築し動くかどうかを試す用途や、レンタルサーバなどでroot権限を得られる仮想サーバーを作って提供したりするために使う。
仮想化にはVM型の仮想化とコンテナ型の仮想化がある。
VM型の仮想化では、VM仮想マシン)の上でホストのOSとは別のOSを動かせる。
これに対して、コンテナ型の仮想化では、ホストはLinuxカーネルで、その上でLinuxカーネルを共有しながら、Dockerというコンテナの上で別のマシン(Linux仮想環境)を動かすことができる。
Dockerはパフォーマンス上のメリットや手軽さが優れており、「インスタンスにいつでも作って不要になれば削除できる」代わり、Windowsなど別のOSは実行できない。
後日注記:実際にはLinux仮想環境と言うよりも、隔離されたコンテナプロセスが動く。軽量かつハイパフォーマンスでプロセスを動かせるため、ホストに直接MySQLを入れるのではなく、仮想マシンMySQLコンテナを入れ、開発や試験環境と本番環境を同じにすることも多くなってきている。

仮想環境とコンテナ

たとえば、ホストのLinuxカーネルの上で、Dockerの仮想マシン上のコンテナOSとしてRHELを動かすことも、SUSEを動かすことも、Ubuntuを動かすこともできる。一台だけではなく何台も動かせる。
このため、レンタルサーバーの仮想サーバーなどにおいて、ホストのシステムをLinuxで構築し、その上でコンテナOSをさまざまに動かすことで、「一台のパソコンの上で何台ものOSシステムを無限に動かす」ことができる。
また、Dockerは通常ひとつのホストに制限されているが、Kubernetesを使うことで、ネットワーク上に分散するさまざまなホストを一台のホストであるかのように仮想化することができる。
DockerとKubernetesを使うことで、パソコンは複数のネットワークホストが一台になり、その仮想ホスト一台が仮想的な無限台のシステムになる。必要になった段階でシステムを増やし、要らなくなったらすぐに削除できる。
Dockerは、実際の本番環境と同等の環境を仮想環境上に構築し、試験やテストを行いながら開発をする「DevOps」と相性がいい。
VM型の仮想化よりも、コンテナ型の仮想化の方が、Linuxカーネルを共有する分パフォーマンスが良く、軽いという特徴がある。
後日注記:Dockerでは、Dockerfileを使うことでコンテナのイメージを簡単に作り、別の環境に適応したり配布することが簡単である。Web上のDocker Hubではこうしたイメージが配布されており、NginxやMySQLを入れるのであれば、「docker run」コマンドで簡単に導入することができる。

仮想化の用途(仮想環境にWindowsを入れる)

既存のシステムやアプリケーションがWindows 10で動かず、過去のWindowsのバージョンを継続して使わざるを得ないが、それでもセキュリティの問題からWindows 10に更新したい場合、仮想環境にWindowsの過去のバージョンを入れる、という方法があります。
たとえば、僕は過去に親が購入したVisual Studio 6.0 Enterprise Editionを持っています。コンパイラやデバッガ、フォームデザイナーやリソースエディタなどが含まれたとても高価なソフトウェアですが、残念ながらWindows 10では動作しません。このような時、仮想環境に昔のWindowsを入れて、そこからVS 6.0を使うことができます。
同じことは、マルチブートでも実現できますが、マルチブートと違い、同時に複数のOSを実行できます。このため、Linuxの開発用のサーバを仮想環境に入れて、Windowsから仮想サーバにアクセスしたりできます。
広く使われている仮想ソフトウェアのVirtualBoxオープンソースで、無料で使えます。Linuxデスクトップを使うなら、Windowsを仮想環境に導入し、Windowsアプリケーションを使う必要がある時に仮想環境のWindowsを使うこともできます。
ネット上には、過去の全てのバージョンのWindowsを入れて、博物館のようにしている人も居ます。
ただし、仮想環境はエミュレータと同じで、普通に使うよりも速度が遅くなります。特にLinuxWindowsの上で動かすなら、LXDEのような軽量デスクトップ環境がおすすめです。

クラウドって何?

クラウドとは、ネットワーク上のサービスやデータを使い、今までローカルのコンピュータでやっていた操作や仕事を、「ネットワーク上のソフトウェア」や「ネットワーク上のデータ」を使ってやりとりする、という新しいソフトウェアの形態。
たとえば、Microsoft Officeクラウドではないが、GmailYahoo!メールのようなものはクラウド
単に「ネットワークで操作する」というWebアプリケーションは、昔から存在したが、「今までローカルでやっていたことをネットワークを通じて行う」というところで、今までの考え方とは違うソフトウェアの形態になる。たとえば、ストレージサービスのGoogle DriveやWebによるOfficeのGoogleドキュメントは、今までローカルでやっていたファイルの保存や書類の編集をネットワークで行うことができる。こうした発想を言い表す言葉として、「クラウド」という言葉が生まれた。

クラウドのインフラ

また、クラウドはソフトウェアを開発・提供する側に大きな恩恵をもたらす。たとえば、自前で2ちゃんねるのような大規模な掲示板を作って運用したい、といった時に、掲示板の利用者全員の利用を可能にするだけの「大規模なWebサーバ」が必要だが、それを自前で自宅サーバで用意することは難しい。
この場合、GoogleAmazonの「インフラ系クラウド資源」を使うことで、まるで銀行に融資を頼むかのように、クラウドインフラを貸してもらうことが出来る。
Googleのような大規模なサーバ資源が、個人や小規模な組織に対しても開かれて提供されるようになったのである。
クラウドサーバでは、データセンターの中の「仮想サーバ」という考え方をする。利用者は仮想サーバを使うことで、いつでも仮想サーバのスケールを拡張したり、使わなくなったら縮小できる。よって、キャンペーン中などでもっと多くのサーバ資源が必要になったら、迅速に仮想サーバを拡張することができる。この「仮想サーバを拡張できる」という考え方が、クラウドサーバの大きな利点である。

サービス分類

クラウドは分野と提供されるサービスによって3つに区分される。

SaaS(Software as a Service)

クラウド上のソフトウェアサービス。
GmailGoogleドキュメントのようなもの。

PaaS(Platform as a Service)

クラウド上のプラットフォームサービス。
Googleなどのクラウドアプリケーション開発環境を使って、
自前のクラウドアプリケーションを開発・提供できる。

HaaSまたはIaaS(Hardware / Infrastracture as a Service)

クラウド上のハードウェア・インフラサービス。
クラウド上の大規模サーバー資源を自分で利用できる。
さらに最近はCaaS(Container as a service)など用語がどんどん増えている。

仮想化とは

仮想化とは、OSの上で別のOSを実行したり、複数のOSを並列実行したりすることができる技術。
「コンピュータの中で仮想的なコンピュータを実現する」と考えると分かりやすい。実際にはWindowsの上でLinuxを動かしたり、Linuxの上でLinuxを動かしたりすることができる。
Windowsにおいては、VirtualBoxを導入することで、Windowsの上でLinuxを実行したりできる。XenKVMQEMUなどを使うことで、Linuxの上で別のOSを実行したりすることもできる。
クラウドでは、仮想化技術は便利である。以下に挙げる以外にも、Dockerを使うことで、Linuxの上で仮想Linuxをコンテナとして実行することもできる。
また、実際のデプロイ環境と同じ環境を、作業中の環境で再現する用途にも使える。
さまざまなOSを同時に動作させることで、ひとつの「リレーション環境」を作ることができるし、その際にOSのシステム構成などを柔軟に構成できる。レンタルサーバーを提供したり、社内システムを構築したりする時に、仮想化技術は無くてはならない。僕が思うに、さまざまなOSと言語でコンポーネントがネットワーク通信を行う、CORBAと似ていると思う。

クラウドサーバって何ぞや

簡単に言えば、レンタルサーバーの進化版みたいなもの。似たようなものだと考えてよい。
商用の大規模なサーバーから個人でアプリ開発と提供に使うような小規模なサーバーまで、多様なスケールに対応し、簡単にスケールを向上させることができる。
クラウド環境にはSaaS、PaaS、IaaSがあり、SaaSクラウドで提供されるアプリケーション、PaaSはアプリケーションの開発を行うプラットフォーム、IaaSはインフラとして提供されるハードウェア資源のことを指す。
レンタルサーバではひとつのサーバを多数のユーザーで共有するが、VPSクラウドでは専用の仮想サーバをたてる。そのため、自由にOS(RHELのようなLinuxディストリビューションからWindows Serverまで)をインストールして自分の好きなソフトを導入して管理することができる。

レンタルサーバの種類

共有サーバ(レンタルサーバ

ひとつのサーバを複数人で共有する。価格は安いが、カスタマイズが不可能で、別のユーザーと資源を共有するため、別のユーザーの影響でサーバが落ちたりすることがある。

VPS(Virtual Private Server)

サーバの中で仮想サーバを作り、その仮想サーバを専用サーバにする。カスタマイズが可能でroot権限が得られるため自分で自由にPHPSQLサーバなどを設定できる。
有名なのはさくらのVPS
自分でアプリケーションをインストールしたり独自の設定をすることができて、「自宅サーバ並みの自由度が得られる」が、一方でセキュリティアップデートを自分で行わなければならないなど、「自宅サーバ並みの管理スキル」が求められる。個人のWebサーバに使うのであれば、自宅サーバを立てるのとあまり変わらない。
ちなみに自分でOSをインストールすることができるため、CentOS6の環境の上でCentOS7などをインストールすることも可能。UbuntuDebianFedoraSuSEなどを使うこともできる。

クラウドサーバ

サーバの中でも高度かつ高性能で、VPSよりももっとたくさんのシステムパフォーマンスが得られる。たとえばAmazonAWSGoogleのGAEなど、データセンターと同等のサーバー資源をクラウドインフラとして利用することができ、データセンター並みの高い性能とディスク容量を誇る。
サーバの資源は後から拡張できるため、大規模なサイトになってからサーバをいくらでも拡張できる。
価格が高く、月額課金制と従量課金制の2つの料金体制がある。AWSなどは使用した時間ベースで払えるため、大規模なWebサービスを構築するために使うと良い。
クラウドサーバでは、サーバを「仮想サーバ」として利用する。仮想サーバはいつでも迅速に拡張し、あるいは縮小できる。よって、キャンペーン中だけ仮想サーバを拡張して、必要がなくなったらすぐに縮小できる。

専用サーバ

サーバを完全に一人で占有する専用のサーバ。価格は最も高い。

自宅サーバ

最初から自宅サーバを自ら立てるのもアリ。自分でサーバ資源を管理できるスキルの高さが必要。

クラウドに使われるLinux

現在のLinuxビジネスにおいて、大きな市場となっているのがクラウド市場である。
どういうことかというと、AWSなどでホストOSの上で動作するゲストOSあるいはコンテナ仮想化であればコンテナ向けのOSとして、RHELUbuntuなどが選択される場合が多くなってきている。
仮想OSとは、クラウドサーバの中の仮想サーバに使われるOSのこと。仮想サーバはroot権限が得られるため、どこまでも自分仕様に管理できるほか、OSも自由にインストールできる。そのため、サポートが必要ならRHEL、必要ないならUbuntuを導入する場合が多い。
そうした、「クラウドサービス向けのコンテナOS」という新しい市場が生まれつつある。
MicrosoftのやっているWindows Azureでも、ゲストOSとしてRed HatなどのLinuxが使われる機会が増えてきており、一時期は「Linuxオープンソースは癌である」と言っていたMicrosoftすら、Linuxに対して本腰を入れて対応する時代がやってきつつある。そのため、MSは.NET Coreをオープンソースにしたり、GitHubを買収したり、あるいはWSL 2にLinuxカーネルを仮想OSとして搭載するなど、半ば「手段を選ばず何でもあり」のようになっている。
ただし、クラウドの仮想コンテナ向けのOSというのは巨大市場である。それは、パブリッククラウドプライベートクラウドの2つにまたがるハイブリッドクラウド市場が、「エンタープライズ向けの新しい標準」となろうとしていることなどから言える。昔のように、IBMの大型コンピュータを使わず、クラウドで何でも実現する時代に到達しつつある。この分野で強いのが、LinuxというOSである。

自宅サーバを立てる

非公開の練習用マシンを用意する

Linuxでサーバーを立てるために、まず、練習用の外部に非公開のマシンを一台用意しましょう。
そのマシンで、Linuxをインストールしてネットワークやファイヤーウォールの設定をし、ApachePHPMySQLの導入をすれば、すぐにWebアプリケーションを開発する環境が整います。
FTPSSHの設定もしましょう。必要な知識としては、パッケージ管理システムの知識、ネットワークの設定の知識、それからApache/PHP/MySQLの設定の知識と、Web向けのプログラミング言語の知識(HTML/CSS/JavaScript + PHP + MySQL)が必要になるでしょう。また、FTPクライアントの操作の仕方や、Windowsから操作するSSHの知識も必要になります。
ですが、外部に公開しない範囲で練習するのであれば、けっこう簡単です。PHPの教科書を読みながら、ツイッターのようなシステムはそんなに上級者ではなくても作れるでしょう。PHPができたら、Ruby on Railsに挑戦すると良いでしょう。
ただし、何もLinux用のマシンを用意しなくても、XAMPPを導入すればWindowsでサーバー環境を構築することはできます。RailsWindowsで動かすこともできます。
決して、安易な気持ちでサーバーを公開しないこと。Webアプリケーションにセキュリティホールがあれば、一貫の終わりです。サービス化してしまうと、途中でやめるわけにもいきませんし、掲示板であれば運営するための手間とコストも必要です。本当にサービスを公開するのであれば、レンタルサーバーを利用するのが良いでしょう。
サーバーを公開したいのであれば、まず、セキュリティがきちんとできているかを確認すること。次に、きちんとシステム管理を行い、パッケージを最新版に更新し続けるための時間と手間がきちんと準備できていることを確認すること。その上で、独自ドメインを取って、サーバーを外部に公開するために、ルーターなどを設定し、サーバーを公開するように設定を行うこと。Linuxはそれだけで、だれかれ構わずしっかりとサーバーとして動いてくれるでしょう。

オープンソースLinuxとサーバー

オープンソースLinuxとサーバーには、いくらかの親和性とメリットがある。
1.いくらサーバー台数・CPU数が増えても無料のままで、UNIXと比べてコストが削減でき、導入のハードルも低い。
2.パッケージ管理システムで、コマンド一発で全てのソフトウェアを最新にできる。
3.Perl/PHP/Python/Rubyなど、主流のさまざまな言語処理系・開発ツールが使える。
4.Dockerなどのクラウド関連ソフトウェアが使える。
5.カーネルやマシンレベルで、UNIXの優れたネットワーク機能が使える(システムがネットワークと親和性が高く、UNIXの設計であるため安定性が高い)。
6.コマンドのOSなので、リモートログインしてコマンドで操作でき、GUIなどの不要なソフトウェアを入れる必要がない。またUNIXのツールが使えるためシステム管理がやりやすい。
7.オープンソースで開発されているため、バグが少ない。
特に、ApacheからMySQLMariaDB)まで、全てのパッケージがリポジトリから配布されており、簡単に最新バージョンにすることができるというのは、セキュリティが大切なサーバーマシンにはメリットが大きい。
ただし、デメリットとして
8.会社が作っていないため、サポート期間が短い。
9.GUI機能が貧弱(サーバーにはあまり関係がない)。
というのがあげられる。だが、これはRed HatSUSEを購入することなどで対応できる(RHELはサポート期間が長い)。エンタープライズ向けには、IBMメインフレームLinuxを動かすこともできる。もちろんPC向けにも使えるほか、Androidなどはモバイル機器で使うこともでき、スケーラブルなマシン構成に対応できる。従来のUNIXワークステーションのように、中央のマシンと端末を分けて構成できるなど、マシン構成の柔軟性が高い。クラスタや分散システムなどの構築も可能。

XAMPP

XAMPPは、WindowsクロスプラットフォームApacheMySQLPHPPerlをインストールしてくれるインストーラーと管理環境。
「Webプログラミングをやりたい」と思った時に、初心者はいきなりLinux自宅サーバーを立てて公開するのではなく、ローカルのWindows環境にまずはXAMPPをインストールして、自分のパソコンの環境で動くことを確認した後、テキストエディタApacheMySQLPHPの設定をして、「ローカルでWebアプリケーションが動く環境」を作りましょう。
特に、Webサーバーを自分で立てるのは、セキュリティの問題や犯罪に繋がる書き込みの削除など、たくさんの労力と手間が必要になるでしょう。まずは自分のローカル環境で、PHPMySQLが動く環境を作った上で、「公開するかどうか」はあとで考えましょう。そのまま、プログラミング能力をつけて、他の言語に移行する可能性もあります。
それから、僕の勝手な意見ですが、Webサービスを開発するために自宅サーバーを立てるのは、多くの場合僕はおすすめしません。レンタルサーバーを借りた方が良いでしょう。レンタルサーバーは有料で、安くても月900円程度は払う必要がありますが、自分でサーバーを管理するコストや規模が大きくなった時のことを考えると、自宅サーバーをLinux+Apacheで立てるのは現実的ではないと思います。あるいは、Amazon AWSのようなパブリッククラウドを利用するのも良いでしょう。
後日注記:実際のところ、自宅サーバを立てるのは悪くない選択肢である。なぜなら、さくらのVPNなどをもし購入したとしても、root権限を得てインストールした仮想サーバのOSシステムは自分で管理しなければならない。最初から自宅サーバに頼っても僕は良いと思う。クラウドでも同様。

簡単な説明

仮想化

クラウドサービス

Docker

Linuxの上で仮想コンテナ環境・コンテナプロセスが動く
ホストのLinuxカーネルを共有するためオーバーヘッドが少なく軽量
本番環境を開発環境で再現するなどDevOpsと相性がいい
必要なくなったら簡単に削除でき、再構築も簡単

Dockerfile

コンテナのイメージを作るための命令と設定を書く
コンテナのイメージを簡単に作成・再利用できる

Docker Hub

コンテナのイメージを共有するサービス
Railsサーバを導入するならDocker Hubからdocker runコマンドで簡単にRails仮想サーバを導入できる

Kubernetes

Dockerは通常ひとつのホストに閉じている
Kubernetesによりホストが複数で外部のホストと通信する場合にも、全体を一台のホストであるかのように仮想化できる
クラスタ内のシステムリソースの配分などを自動で行ってくれる
クラスタ環境やレンタルサーバなどの仮想rootサーバとしても利用できる

VirtualBox, Vagrant

VirtualBoxをうまく使うことで、Windows上で仮想Linuxサーバを立て、Windowsのブラウザから仮想Linuxにアクセスし、実験的サーバ(あるいはプログラミング練習サーバ)を立てたりできる
ほかにも、XP以前のWindowsでしか動かないVisual Studio 6.0を仮想環境で実行したりできる。Windows 10では動かないシステムを使いたい場合などに有効
あるいはWindowsの各バージョンを入れて博物館のようにしている人もいる
VagrantVirtualBoxにさまざまなソフトウェアを導入するのを自動化することのできるツールで、Vagrant Boxは簡単に削除・再構築できる。Laravel公式の開発環境導入手順でも使われている。

AWS

AWSクラウドサービス。基本的に、どんなに巨大になってもスケールを拡張できるレンタルサーバのようなものだと考えればいい
コストパフォーマンスだけを見るなら、さくらなどのサービスでVPSを購入した方が安い

VPS

VPSは仮想プライベートサーバと呼ばれ、自分だけのroot権限を持った仮想サーバが得られる。共有サーバ(レンタルサーバ)と比べると、システムのカスタマイズが自由だが、システムを自分で管理しなければならない