WordPressを使っているWebデザイナーの人から、開発環境がVirtualBoxからDockerに替わったんだけど、Dockerて何?、 VirtualBoxと何が違うの?、そもそもVirtualBoxは何だったの?
と聞かれ、適当な紙に絵を描いて説明しました。そのときの絵を清書してまとめてみました。
https://www.flickr.com/photos/134416355@N07/31518965950
PC、OS、アプリの関係
皆さんPCやMacでブラウザー、Excelなどを使っていると思います。まずは、PCのハードウエア、WindowsなどのOS、そしてアプリ(アプリケーション・ソフト)の関係を整理してみましょう、 ここは重要です。
ハードウェア
Windowsの動くPCハードは、最近あまり言われなくなりましたがPC/AT互換機と呼ばれています(PC/AT互換機に付いてはリンク先のWikipediaを見てください)。PC/AT互換機は色々なスペックのハードウェアがありますが、コンピュターの基本機能は、OSから見るとPC/ATインターフェイス仕様の同じハードウェアに見えます。
MacはAppleが独自のハードウェアを作っていてインターフェイス仕様は公開していませんが、Appleも多数のハードウェアを作っているので、インターフェイス仕様のような物はあると思います。
OS(オペレーティングシステム)
OSは、アプリケーションを動かすための基本になる機能をまとめたものです。データを保存するファイル、画面に文字や図形を表示し、操作できるGUI(グラフィカルユーザインタフェース)、インターネットに接続できるネットワーク、複数のアプリを同時に安全に実行できるプロセス管理やメモリー管理などです。
- WindowsはPC/AT互換機を前提に作られています、WindowsのDVDはどのPC/AT互換パソコン機にもインストールでき動作します。
- サーバー等でよく使われているLinuxもPC/AT互換機を前提に作られているので、どのPC/AT互換サーバー機にもインストールでき動作します。
- macOSはappleのハードウェアを前提に作られています。
アプリ(アプリケーション・ソフト)
仕事や娯楽で、我々に価値をあたえてくれるソフトウェアです。しかし画面や操作するためのメニュー、データの保存などはOSの機能を利用しています。
アプリから見るとOSはAPIを通じ基本機能を提供してくれるものです。いくつかのアプリはWindowsとMacで使えるものがありますが、これらのアプリは各OSのAPIに対応したコードを作っているのです(もちろんOS毎に設計思想の違いがあるので簡単ではありませんが・・・)。
仮想マシン(Virtual Machine)
仮想マシン(Virtual Machine)は古くからメインフレームの世界で使われていましたが、VMwareがWindowsで動く仮想マシンを発売してから、Windows上でLinuxが動かせる、また古いWindowsを動かせる等の利便性から広まりました。
その後オープンソースのVirtualBox やMicrosoftの開発したWindows Virtual PC など同等のソフトが現れました。
また、仮想マシンはLinuxやMacで動くものも作られ、どのハード/OSでもLinuxやWindowsが動かせるようになりました。
仮想マシン(VMWare等の)ソフトは、Windows(Linux, Mac)で動くアプリケーションですが、PC/AT互換機をシミュレーション(真似る)ソフトで、VMwareの上にPC/ATインターフェイス仕様を提供しています。したがってVMwareの上でLinuxやWindowsを動かす事ができます。
下の図の、MySQLがLinuxのファイルに書き込むと、LinuxはPC/ATインターフェイス仕様に基づいたディスク(SSD)コントローラーをアクセスします。そこでVMwareはホストコンピュター(ここではMac)上のVMWareが管理するファイルにLinuxのファイル内容を書きます。ただしVMWareが管理するファイルは巨大な1つのファイルで、それをLinuxにはディスク(SSD)ドライブに見せかけています。
上の図のLinuxサーバーは、Macの上で動いていますがMacとは直接の関係はなく *1、Macから見ると同じネットワークに接続されているLinuxサーバーマシンのように見えます。
仮想マシンは素晴らしいものですが、欠点もあります。仮想マシン上に複数のLinuxやWindowsを起動できますが、ホストマシン(上の図ではMac)には、OSを含む大きなディスクエリアが必要です。また仮想マシンのソフトは原理的にオーバーヘッドが大きくホストマシンのCPUやメモリーを激しく消費します。
*1 仮想化マシン・ソフトの機能でファイル共有はありますが
Docker
Macの上でLinuxのアプリケーションを直接動かす事はできません。OSの設計思想も違いますし、コマンドファイルの形式も違います。しかし、MacもLinuxもUnixの一種で共通のAPIを持っています。そこでLinuxのAPIをMacでシミュレーションしたらどうでしょうか?これがDockerです。
macOSを使ってLinuxをシミュレーションするのは、それほどの大きなオーバーヘッドはありません。MacもUnixなのでファイル・ディレクトリーの論理モデルはLinuxと同じです、プロセスの管理等もほぼ同じです。
ただし、Linuxのアプリが/etc/passwdファイルをアクセスした場合はMacの/etc/passwdファイルが見えては困ります。このようにディレクトリーやネットワーク、プロセスなどの管理・変換は必要になりますが、仮想マシンのような大きなオーバーヘッドはありません。
もちろんDockerにも欠点があります。Docker上でWindowsを動かす事はできません、動かせるのはLinuxもみです。また、Linuxシステムを直接アクセスするようなソフトも動かせません。
しかし、Linuxサーバーで使うWebサーバーやデータベースソフト、プログラミング言語などは動くので通常のアプリ開発では問題なく使えます。
もう1つの重要な発明(One more thing)
Dockerには、もう1つ素晴らしい機能、発明があります。サーバーには色々なソフトをインストールしてサービスの環境を構築しますが、同じ環境が必要になる事が良くあります。たえば開発用サーバー、テスト用サーバーなど。
従来のサーバー環境構築と複製
そんな時、サーバーマシンや仮想サーバーでは2つのやり方があります
- A. インストール手順をコード化して、他のマシンに対して自動的にインストールを実行する
- B. サーバーのディスク(SSD)のバックアップを作り、それを他のマシンにコピーする
- バックアップファイルはそれなりの大きさになり、コストが発生します
- サーバーを止めないと完全なバックアップは取れません
- AWSにはAmazon Machine Image (AMI)というこの目的の機能があり便利です
Dockerの環境構築と複製
Dockerでも上に上げた方法も使えますが、Dockerにはイメージを保管できるDocker Hubというサービスがあります。
ここには多数の便利なイメージが公開されています、たとえばwordpressが直ぐに使えるイメージ。また自分のイメージを保管する事もできます。
- ①Docker Hubからベースになるイメージをダウンロード(pull)します
- そこに、必要なプログラムをインストールし独自の環境を構築します
- ②できた環境(イメージ)をDocker Hubに保存(push)できます。ただし①でダウンロードされた部分はpushされずインストールした部分のみがpushされます
- ②でpushしたイメージをダウンロード(pull)すると①の部分も一緒にインストールされます
Git(GitHub)に似ていませんか?イメージを差分で管理できるので、push/pullの単位は小さく従来の方法に比べると環境構築が高速にできます。
またLinux OS(カーネル)相当の部分はDockerに含まれているので毎回ダウンロードする必要はありません、下の図でも①でダウンロードしているのはLinux OSではなく基本的なコマンドやプログラムのインストールに必要なパッケージシステムなどLinuxを使うのに最低限必要なツールの集まりです
このような利点からDockerは現在、Webアプリ(主にバックエンド)開発環境の主流になりつつあります。
つづく・・・