Dockerを理解するためにコンテナを理解する


  • 理解のために思考の流れの例を記述していますが、実際の歴史を示したわけではありません。
  • 理解を助けるために意図的に省略している部分があります。見逃せない場合はコメント欄にて補足していただけると助かります。

もはや流行りからデファクトスタンダードになったDocker

Docker流行ってるなー。
使えるようになっといた方がいいなー。
と思ってたら、あっという間にデファクトスタンダードになってました。
「流行ってる」じゃなくて、「使えて当然」な段階まで普及したので、ここいらでとりあえず使えるようになりたいと思います。
できることが増えて意欲が増したときのために、とりあえずとはいえ最低限の理解もあった方がいいでしょう。
というわけで、僕が理解するまでの思考を記録しておきます。

Dockerって何

Docker(ドッカー)はコンテナと呼ばれる仮想環境を提供するサービスの一種です。
端的な表現は腑に落ちるまでは気持ち悪いですが、理解のマイルストーンになるので最初に示しておきます。

この記事においてコンテナは以下のような扱いです。

  • プロセス単位の仮想環境

ふーんと読み流してしまいそうになりますが、この「プロセスであり、仮想環境である」という特徴は強力です。

コンテナじゃない仮想環境

コンテナの特徴を理解するために、コンテナ"ではない"仮想環境について理解して外堀を埋めましょう。
まずは仮想環境が必要な場合を考えてみます。

仮想環境が必要になるまで

パソコンにはCPUとメモリが搭載されており、それらを利用してアプリケーションやミドルウェアは動作します。

この構成だけですべてをやり繰りするには、大きく2つの問題があります。

1つは、環境をごっそり入れ替える場合にはマシンの交換やOSの再インストール作業が必要になるということです。
広く普及しているPCのOSはWindowsまたはMac OSですが、Linux環境を用意しようと思ったとき、WindowsマシンやMacBookにLinuxをインストールしようとは到底思えません。
(メインOSレベルで使うなら、デュアルブートはありですね。)

もう一つの問題は、試行錯誤するのが億劫だということです。
環境構築やアプリケーションの配置でミスしてマシンが再起不能になるかもしれません。
こちらも最悪の場合はインストールのやり直しになりますね。

そこで、仮想環境というアイデアが生まれました。
仮想環境といえば、Virtual BoxやVMwareといった仮想マシンを連想する人も多いでしょう。
これらは、ホストマシン上で仮想マシン用のアプリケーションを起動し、そのアプリケーション上で仮想マシンが動作します。

これで、仮想マシン上であればどんな操作をしようが、ホストマシンには影響しません。
仮想マシンは作り放題ですし、OSの選択も自由です。
もちろん仮想マシンを削除するのも何ら問題ありません。

仮想環境の制約

仮想環境には仕組み上どうしようもない制約があります。
仮想環境のスペックはホストマシンのスペックより下位になる、という制約です。

仮想マシン用のアプリケーションは中に仮想マシンを構築するため、ホストのリソースを相当量消費します。
ホストマシン以上のスペックを仮想環境で発揮するのは物理的に不可能です。
よって、仮想環境のスペックはホストと比較してかなり下位のランクになります。

仮想環境の導入を検討したことがある人は、仮想マシンは低スペ、あるいは仮想マシンを利用するには高スペなホストマシンが必要、という認識があると思います。

無駄を削いで限界までスペックを上げる

仮想環境を利用したいエンジニアにとって、仮想マシンはほとんどの場合オーバースペックならぬオーバープロセスです。
仮のWebサーバーを立てたいだけ、テスト用のDBサーバーを立てたいだけなのに、よくわからないプロセスがたくさん動作しています。
どれもPCを制御するために必要なOSのプロセスなのでしょうが、仮想環境のニーズとはミスマッチです。
OSすらも不要です。
それら不要なプロセスを削ぎ落とそうとしていった結果がコンテナです。

コンテナはミニマムな仮想マシンのようなもので、ユーザーが求めるプロセスのみを実行します。
ミニマムであるため、仮想マシンのように大量にリソースを消費して管理する対象がありません。
OSもなく、ホストのものを共有します。
管理する対象がないため、間に管理用のアプリケーションを必要とせず、
コンテナはホストのリソースを直接消費する構造になりました。

すなわち、最大でホストと同等のスペックまでを仮想環境で発揮できるようになったのです。

仮想マシンとコンテナ

以上のように、コンテナは仮想マシンの一部のニーズを叶えるために生まれた技術であるだけで、仮想マシンの後継には完全にはなりえません。
特に、用途とスペックのトレードオフと言えるでしょう。

  仮想マシン コンテナ
用途 汎用(広) 特化(狭)
スペック ホストより下位 ホスト同等

「汎用的なコンテナ」を作ることはもちろん可能ですが、やりすぎるとホストのリソースを消費しすぎてホストに悪影響が出る可能性があるので注意が必要です。

Next. 環境潔癖症のためのDocker活用術

開発環境をDockerで構築することでホストの環境は綺麗なままに保てます。
僕のような環境潔癖症にはうってつけだと思います。