何?仮想化とは、「OS環境の上で別のOS環境を再現できる」技術。サービスを開発する際、試験環境で実際の本番環境と同等の環境を構築し動くかどうかを試す用途や、レンタルサーバなどでroot権限を得られる仮想サーバーを作って提供したりするために使う。仮想化にはVM型の仮想化とコンテナ型の仮想化がある。VM型の仮想化では、VM(仮想マシン)の上でホストのOSとは別のOSを動かせる。これに対して、コンテナ型の仮想化では、ホストはLinuxカーネルで、その上でLinuxカーネルを共有しながら、Dockerというコンテナの上で別のLinux仮想環境を動かすことができる。Dockerはパフォーマンス上のメリットや手軽さが優れており、「インスタンスにいつでも作って不要になれば削除できる」代わり、Windowsなど別のOSは実行できない。仮想環境とコンテナたとえば、ホストのLinuxカーネルの上で、Docker上のコンテナOSとしてRHELを動かすことも、SUSEを動かすことも、Ubuntuを動かすこともできる。一台だけではなく何台も動かせる。このため、レンタルサーバーの仮想サーバーなどにおいて、ホストのシステムをLinuxで構築し、その上でコンテナOSをさまざまに動かすことで、「一台のパソコンの上で何台ものOSシステムを無限に動かす」ことができる。Dockerは通常ひとつのホストに制限されているが、Kubernetesを使うことで、ネットワーク上に分散するさまざまなホストを一台のホストであるかのように仮想化することができる。DockerとKubernetesを使うことで、パソコンは複数のネットワークホストが一台になり、その仮想ホスト一台が仮想的な無限台のシステムになる。必要になった段階でシステムを増やし、要らなくなったらすぐに削除できる。Dockerは、実際の本番環境と同等の環境を仮想環境上に構築し、試験やテストを行いながら開発をする「DevOps」と相性がいい。VM型の仮想化よりも、コンテナ型の仮想化の方が、Linuxカーネルを共有する分パフォーマンスが良く、軽いという特徴がある。クラウドクラウドって何?クラウドとは、ネットワーク上のサービスやデータを使い、今までローカルのコンピュータでやっていた操作や仕事を、「ネットワーク上のソフトウェア」や「ネットワーク上のデータ」を使ってやりとりする、という新しいソフトウェアの形態。Officeはクラウドではないが、GmailやYahoo!メールのようなものはクラウド。「ネットワークで操作する」というWebアプリケーションは、昔から存在したが、「今までローカルでやっていたことをネットワークを通じて行う」というところで、今までの考え方とは違うソフトウェアの形態になる。DriveやWebによるOfficeのGoogleドキュメントは、今までローカルでやっていたファイルの保存や書類の編集をネットワークで行うことができる。した発想を言い表す言葉として、「クラウド」という言葉が生まれた。クラウドのインフラまた、クラウドはソフトウェアを開発・提供する側に大きな恩恵をもたらす。自前で2ちゃんねるのような大規模な掲示板を作って運用したい、といった時に、掲示板の利用者全員の利用を可能にするだけの「大規模なWebサーバ」が必要だが、それを自前で自宅サーバで用意することは難しい。この場合、GoogleやAmazonの「インフラ系クラウド資源」を使うことで、まるで銀行に融資を頼むかのように、クラウドインフラを貸してもらうことが出来る。Googleのような大規模なサーバ資源が、個人や小規模な組織に対しても開かれて提供されるようになったのである。クラウドサーバでは、データセンターの中の「仮想サーバ」という考え方をする。利用者は仮想サーバを使うことで、いつでも仮想サーバのスケールを拡張したり、使わなくなったら縮小できる。よって、キャンペーン中などでもっと多くのサーバ資源が必要になったら、迅速に仮想サーバを拡張することができる。この「仮想サーバを拡張できる」という考え方が、クラウドサーバの大きな利点である。サービス分類クラウドは分野と提供されるサービスによって3つに区分される。クラウド上のソフトウェアサービス。GmailやGoogleドキュメントのようなもの。クラウド上のプラットフォームサービス。自前のクラウドアプリケーションを開発・提供できる。クラウド上のハードウェア・インフラサービス。クラウド上の大規模サーバー資源を自分で利用できる。service)など用語がどんどん増えている。Qiitaパブリッククラウドと社内IT技術IBMが3兆7000億円で買ったレッドハットの真髄:日経ビジネス電子版を参考に執筆しました。パブリッククラウドとは、たとえばアマゾン・ウェブ・サービス(AWS)のようなサービス。これに対して、社内IT技術(オンプレミス)や自社運用のクラウドがある。最近では、このパブリッククラウドと社内IT技術を組み合わせて使いたいというニーズは強い。これはハイブリッドクラウドと呼ばれる。Hatなどはハイブリッドクラウドのための製品に競争力がある。仮想化とは仮想化とは、OSの上で別のOSを実行したり、複数のOSを並列実行したりすることができる技術。「コンピュータの中で仮想的なコンピュータを実現する」と考えると分かりやすい。実際にはWindowsの上でLinuxを動かしたり、Linuxの上でLinuxを動かしたりすることができる。Windowsにおいては、VirtualBoxを導入することで、Windowsの上でLinuxを実行したりできる。Xen、KVM、QEMUなどを使うことで、Linuxの上で別のOSを実行したりすることもできる。クラウドでは、仮想化技術は便利である。以下に挙げる以外にも、Dockerを使うことで、Linuxの上で仮想Linuxをコンテナとして実行することもできる。実際のデプロイ環境と同じ環境を、作業中の環境で再現する用途にも使える。さまざまなOSを同時に動作させることで、ひとつの「リレーション環境」を作ることができるし、その際にOSのシステム構成などを柔軟に構成できる。レンタルサーバーを提供したり、社内システムを構築したりする時に、仮想化技術は無くてはならない。僕が思うに、さまざまなOSと言語でコンポーネントがネットワーク通信を行う、CORBAと似ていると思う。Xen仮想化ソフトウェア。複数のOSを並列実行出来る。Xenでは、XenスーパーバイザはLinuxやWindowsのようなOSよりも低い階層で動作し、LinuxやWindowsをXenの上で並列に動作させる。これは、VMwareのようなホストOSとゲストOSが分かれて実行されるタイプの仮想化ソフトウェアとは異なる。WikipediaKVMLinuxカーネルに組み込まれた仮想化技術。WikipediaQEMUプロセッサエミュレータ。CPUなどで別のCPUをホストできる。WikipediaVirtualBox仮想化ソフトウェア。ホストOSの下でゲストOSを実行出来る。Windowsの上で任意のLinuxディストリビューションを実行したりすることが可能。WikipediaVMware商用の仮想化ソフトウェア。WikipediaHyper-VMicrosoftによる仮想化機構。してもWindowsの上で他のOSを動かしたい場合は、Hyper-Vが使える。Windowsの上でHyper-Vを使ってUbuntuを動かすことができる。最近はWindowsの上でネイティブにUbuntuが動くようにもなったが、Hyper-Vを使うことで、VMwareのように簡単にOSの上で別のOSを試したり削除したりすることもできる。UbuntuをWindowsの上でちょっと試してみたい人にはおすすめ。Qiitalibvirtさまざまな仮想化技術に対する、統一されたAPI。ESX・GSX・Workstation・Player、Hyper-V、そしてクラスタ管理ソフトOpenNebulaをサポートしている。Wikipediaを参考に執筆しました。3.0の下で再許諾いたします。(Docker)DockerとはホストのLinuxカーネルを共有した上で、さまざまなコンテナ型仮想Linux環境を実行出来る、仮想コンテナ技術。ホストとゲストのLinuxカーネルを共有するため、オーバーヘッドが少なく済む。@ITLinuxにおけるコンテナ型仮想化LXCやDockerなどのコンテナ型仮想化技術では、ホストのLinuxカーネルを共有するため、KVMなどのようなOSの上でOSを走らせることによるオーバーヘッドがゼロに近い。XenやKVMに比べて、起動や終了も早く、プロセス実行の効率も良い。注記:ここに書いた時のにわか知識で執筆したため、「Linuxの上でLinuxが動く」という説明をしていますが、本当は「Linuxカーネルの上でコンテナ型の仮想環境が動く」が正しいです。DockerはLinuxカーネルを共有しながら、さまざまなLinux環境を同時に構築し、動的に作ったり削除したりすることができる。このため、開発環境の上でデプロイする本番環境を作り出して、本番環境でどのようにシステムが動くのかを試すような用途に使える。システムをインスタンスに作ったり削除したりすることができることで、いついかなる時に必要になっても、迅速に新しいコンピュータ資源を確保できる。Dockerでは、Dockerfileを使うことで、新しいシステムイメージを簡単に作成できる。Kubernetesを使用することで、たくさんのネットワーク資源をあたかもひとつのコンピュータであるかのように仮想化できる。これらの技術により、いついかなる場合にどんなシステムの問題や必要性がでてきても、対応し、拡張し、あるいは改良することができる。Dockerとコンテナ型仮想化の基本コンテナ型の仮想環境は、ホストOSのLinuxカーネルを共有した上で、仮想化されたLinuxコンテナ環境を実行・実現する。ファイルやディレクトリ、プロセス、ネットワーク、設定、システム構成などをコンテナでそれぞれの環境に仮想化して、その上でその仮想環境におけるアプリケーションを実行することが出来る。DockerはLinuxの仮想コンテナ環境。Linuxの上で仮想コンテナを作ることによって、Linuxの上でたくさんのLinux仮想コンテナ環境を走らせることが出来る。Xenなどの仮想OSとは異なり、Linuxの上でWindowsなどの他のOSを動かすことは出来ない。Linuxの上でLinux仮想環境を動かすことが出来る。LinuxでLinuxを本当に動かすわけではない。Linuxと言うカーネルは共有しながら、通常のプロセスと同じように、別の環境でコンテナプロセスを動かすことが出来る。この時、VM型の仮想化に比べて、ネイティブなアプリケーションとほぼ同等の効率で、仮想Linuxコンテナ環境のアプリケーションを実行出来る。DockerfileDockerでは、システムイメージの構成をDockerfileと言うファイルに記述することで、新しいシステムイメージを簡単に作ることが出来る。Dockerfileにソフトウェアのインストール手順と設定手順を記述することで、どこでも同じシステムを簡単に再構築出来る。・それぞれの開発環境で、本番環境と同じ環境を簡単に再現できる。ホストがDebianでもUbuntuでも関係なく、コンテナ環境でゲストの環境を再現できる。・Dockerfileに全てのインフラ+アプリの情報が書かれており、コンテナの状態が保存されるため、間違いが発生しにくい。簡単・高速にデプロイできる。・必要のなくなった時点で、簡単にインスタンスを削除できる。インスタンスなイメージの作成・削除ができる。・設定を間違えたら、元の状態に戻すことができる。多くが「環境の再現やデプロイの際の管理がしやすくなる」ということです。たくさんのインフラソフトウェアやインフラシステムが重なり合っている「複雑なシステム」を管理するための助けになってくれます。QiitaDockerの誤解と神話。HubはDockerイメージをインターネット上で共有できるサービス。CentOSにnode.jsを入れたDockerイメージを共有することで、みんなと一緒に同じ環境を再現することができる。用途としては、「このようにLinuxをインストールして、こんな必要なソフトを導入して、このアプリケーションを使ってください」といった場合に、そんなことを手動でする必要なく、システム全体をまるっと共有できる。(その他)jailsとZoneコンテナの歴史としては、FreeBSDで開発されたjailsという技術がある。SolarisにはZoneというコンテナの技術がある。レイヤーのDockerを通じて利用されることが多い。Linuxカーネルのcgroups機能に依存している。Qiitacgroupsプロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離するLinuxカーネルの機能。WikipediaOpenVZOSレベルのサーバ仮想化ソフト。Linuxのオープンソース版。ホストのLinuxカーネルを共有するため、オーバーヘッドが少ないとされる。WikipediaLinux-VServerLinuxカーネルに仮想化機能を追加することで実装されたバーチャル・プライベート・サーバ。バーチャル・プライベート・サーバは一般にWebホスティングサービスに利用される。WikipediaコンテナはDevOpsと相性が良いコンテナ型仮想化のメリットは、軽量であることや環境構築の時間短縮もありますが、DevOpsとの相性が良いことが言えます。DevOpsとは、開発チームと運用チームが協力し合って開発・運用を行っていく手法です。コンテナ型の仮想化を行うことで、環境をさまざまに構築して試験することができます。デメリットは、ホストのOSと別のOSで仮想化することができないことなど。ニフクラVM型に対してコンテナ型は速度が速いまた、VM型の仮想化に比べて、コンテナ型は速度が速く軽量です。サーバの本番環境を開発環境で試したい時に、何度も仮想サーバを立ち上げる必要がある時、VMwareのようなVM型の仮想化を行うよりも、Dockerのようなコンテナ型の方が素早く試すことができます。これは開発の効率化にとても大きく寄与します。KubernetesKubernetesKubernetesは、サーバーが複数台ある時に、簡単にサーバーの規模を大きくしたり、アプリケーションをクラウド上で適切にデプロイすることが出来る技術。ゆびてくを参考に執筆しました。通常、Dockerの実行環境は一台のホストに閉じている。Kubernetesを使うことで、複数のホストがあってホストの外側とやり取りする場合でも、複数のホストから構成される実行環境を「あたかもひとつの実行環境のように」扱うことができる。コンテナを起動する際にもイメージと台数を指定するだけでく、クラスタのどこにコンテナが配置されるかなど、面倒なことは全てKubernetesが自動で面倒をみてくれる。このため、いくらでも容易にスケールアウトできる。Hatなどが推し進めている、オープンソースで開発されているクラウド環境構築用のフリーソフトウェア。OpenStackとDockerを組み合わせて、Ansibleで自動化する、といった風に使う。-レッドハットの情報ポータルを参考に執筆しました。OpenShiftは、リソースの分離と権限の分離により、Kubernetesを機能拡張して複数ユーザーによるアクセスコントロールを実現する。Kubernetesでのコンポーネントではコンテナを実行する機能がメインだが、OpenShiftのコンポーネントではコンテナのビルドとデプロイのための機能を追加している。OpenStackOpenStackはNova(コンピュート)、Neutron(ネットワーク、旧称Quantum)、Cinder(ブロックストレージ)、Keystone(認証)、Glance(マシンイメージ管理)、Swift(オブジェクトストレージ)、Horizon(Web管理)などのコンポーネントから構成される。AWSを自分で作れるソフトという感じの位置づけ。赤帽エンジニアブログOpenStackはじめてみる(知識整理)。めもめもAnsibleサーバを立ち上げる際にインストールや設定を自動化できる構成管理ソフト。Ansibleを使うことで、SSHで接続したサーバーに、リモートホストでミドルウェアのインストールや設定ファイルの更新ができる。Ansibleはリモートホストの状態を記載した定義ファイルであるPlaybook(YAML形式)を記述する。この時、Rolesと呼ばれる機能を使うことで、Playbookをちょうどいい単位に分割・整理することができる。Roles」が実装されており、メール(Postfix)やネットワーク(Network)、セキュリティ(SELinux)といった重要なサブシステムに対してつねに一貫したインタフェースを提供している。コマンドラインの呼び出しよりも容易な構成管理が実現できる。ツールChefChefは構成管理ツール。ChefはRubyでスクリプトを書くことからRuby使いに支持者が多い。製のサーバの構成管理ツールです。サーバの設定が微妙に違う」といったことや、新しいモジュールを組み込みたい、といったときに「全サーバ巡礼の苦行」を味わったりすることがしばしばあります。上記のような問題が解決できるツールで、ソフトウェアのインストール状況や設定ファイルを定義した状態に保ってくれるツールです。さくらのナレッジPuppetPuppetもChefと同様の構成管理ツール。用意しておいた設定ファイルに基づいてサーバーのさまざまな設定を自動で行ってくれる。さくらのナレッジ継続的インテグレーションツールJenkinsJenkinsはJavaによる継続的インテグレーションツールで、ソフトウェアのビルド、検証、サーバへのインストールなどの一連作業を自動化できる。手動で実行することもできるが、イベントをトリガとしてバージョン管理システムによるコミットやcron、他のビルドの完了、URLのリクエストなどでも自動で実行できる。Wikipediaを参考に執筆しました。3.0の下で再許諾いたします。関連ページ分散ファイルシステム分散ファイルシステムを参照のこと。商用のクラウドサービス・レンタルサーバクラウドサービスを参照のこと。高信頼システム高信頼システム・インフラ構築を参照のこと。Service)と言われている、スマートフォンアプリで良く使われている機能をクラウドから提供するサービスの1つ。Googleによって提供されている。QiitaWindows上のLinuxcoLinuxcoLinuxはWindows上で動くLinuxカーネル。(WSL)はLinuxのバイナリ実行ファイルをWindowsで動かすための互換レイヤー。新バージョンのWSL2では、互換レイヤーではなく、LinuxカーネルをOSにまるごと内蔵させた。Wikipediaちなみに、LinuxでWindowsアプリケーションを動かすためにはWineを用いる。猫も杓子もDockerとKubernetes最近のクラウド市場は、猫も杓子もDockerとKubernetesです。EC2に登録して、クレジットカードを登録して従量課金制の契約を結び、OSはサポートが必要ならRHEL、必要ないならUbuntuにして、root権限が得られるためWebサーバやデータベースをインストールします。ApacheやNginx、あるいはNode.js+Reactです。仮想サーバの構築は、ホストのLinuxの上でDockerとKubernetesを用いて行うため、どんな仮想サーバ向けのOS(注意:Linuxに限る)でも導入できます。インフラのDockerとKubernetesが何から何まで全部やってくれるので、クラウドサーバの運営業者も楽です。DockerとKubernetesの上で動くRHELあるいはUbuntuを導入して、root権限で何でも好きなようにできるのです。HatやUbuntuなどが力を入れているのがOpenStack。これはAWSを自分で作れるという位置づけです。DockerとKubernetesが流行るのか。それは、単純で簡単で、なおかつ軽量でパフォーマンスが良いからです。手元の開発環境のLinuxマシンで開発し、Docker上の本番環境と同等の試験環境で動くかどうかを試して、開発が終わったら本番環境にデプロイ。これを簡単かつスピーディに行えて、必要なことは全部DockerとKubernetesがやってくれる、というわけです。JavaScript環境がとても優れたものになってきつつある現在、JavaやPHPのような従来の言語は必要なくなってきています。サーバ側はNode.js、クライアント側はReact。RailsやDjangoのようなWebフレームワークを使います。僕も経験が豊富にあるわけではありませんが、最近のLinuxによるWebサービス開発は、そのようにどんどん進歩していて、最新が本当は何なのか、正しい情報は何なのか全くわかりません。僕が書いたこの情報も、ほとんどが書いてすぐウソになってしまいます。最初からネット上の情報などあてにしないことです。自分でやってみて、駄目なら駄目だと自分で判断し、自分で調べて自分で考えること、それがIT業界の鉄則です。Do-it-yourself、自分以外のものを信じないようにしましょう。