Lesson 1

Dockerとは

Lesson 1 Chapter 1
Dockerとは何か

Lesson1ではDockerの初学者に向けて、Dockerとは何か、なぜ使われるのか、ということを解説します。

Dockerとは何か

DockerとはDocker社が開発しているコンテナ型の仮想環境を作成・実行・配布するためのプラットフォームです。

Dockerという名前の単一のアプリケーションがあるわけではなく、以下のような名前のソフトウェアやサービスがあります。

image_1_1_1.png Docker プラットフォーム

一般にDockerという言葉が指すものは曖昧なものがありますが、Dockerとはコンテナ型の仮想環境を作り出す技術のことで、アプリケーションの開発に大きなメリットをもたらすことができるものだと考えておいて下さい。

仮想環境とは

仮想環境は、サーバー仮想化という物理的な1台のコンピュータの上に仮想的なコンピュータを作り出す技術によって実現されます。

仮想環境内では、普段コンピュータを使って行っていることと同じように、アプリを動かしたりプログラムを開発したりすることができます。

サーバー仮想化技術には大きく分けて、以下の2つがあります。

  1. 仮想マシン(VM)
  2. コンテナ型仮想化

仮想マシン(VM)とは

それでは、仮想マシン(VM)とは何かについて解説します。

仮想マシンでは、仮想化ソフトウェアによって1台のコンピュータそのものを仮想化します。

そして、以下の図で示すように、ホストOS上で一つのアプリ(プロセス)として実行します。

image_1_1_2.png 仮想マシン(VM)

これにより、例えばホストOSがMacの場合でも、仮想マシン上で他のOSであるWindowsやLinuxを起動することができます。

もちろん、図で示した通りに、Windows上でしか動作できないアプリも仮想化ソフトウェアを動かしたMac上で動作させることができます。

また、仮想マシンで動作するOS、あるいはアプリケーションで問題が発生したとします。

この時、問題が発生した仮想マシンは、ホストOSや他の仮想マシンと隔離されて動作しています。それにより、発生した問題が他に影響するリスクを大きく低減することができるようになるというメリットがあるのが仮想マシンの特徴の1つです。

コンテナ型仮想化とは

以上が、仮想マシン(VM)についての説明でした。それではコンテナ型仮想化とはどういった技術でしょうか。

コンテナ型仮想化には、OSレベル仮想化という別名があります。

その名のように、仮想マシンはハードウェアを含めた層を仮想しますが、コンテナ型仮想化ではOS層を仮想します。とはいっても、イメージがしづらいと思うので図で見比べてみましょう。

image_1_1_3.png コンテナ型仮想化

仮想マシンの概念図と比べて分かるように、コンテナ型仮想化では仮想環境内でハードウェアもOSも動作していないことが分かります。

コンテナ型仮想化では、

  1. コンテナはホストOSと物理ハードウェアのリソースを共有しており
  2. ホストOS(のカーネル)の一部機能を用いて

動作しています。

それにより、実際はコンテナ上ではOSが起動されていないにも関わらず、アプリケーションの実行環境を分離することができます。

コンテナ型仮想化の歴史

コンテナ型仮想化自体はそれほど新しい技術というわけではなく、その起源は1979年にまで遡ります。Unixのシステムコームのchrootの開発によりますが、詳細が気になる方は検索してみて下さい。Dockerの公開は2013年と比較的最近登場した技術ですが、コンテナ型仮想化の歴史は意外と古いことがわかります。

続いては、仮想マシンと比較したときのコンテナ型仮想化技術のメリット/デメリットについて確認していきましょう。

コンテナ型仮想化のメリット

まず、一番に挙げられるのが起動や終了の早さです。

コンテナ型仮想化は、仮想環境の生成から起動や終了がとても早いです。前述したように、コンテナ内にはOSが存在していません。そのため仮想マシンを起動するにはOSの起動を伴いますがコンテナにはそれがなく、とても軽量に動作します。

コンテナ型仮想化は、アプリケーションの実行環境を分離したいけど、仮想マシンのようにハードウェアレベルの分離までは不要といったケースに適していると言えるでしょう。

次に考えられるメリットは移植性が高いことです。

同一のコンテナ仮想化技術を実行できるシステム上であれば、異なるハードウェアやOS間でも関係なく、実行することができます。 image_1_1_4.png

上のイメージ図を見て下さい。Aさん、Bさん、Cさんはそれぞれ使用しているOSが異なりますが、コンテナを共有することで同じ開発環境を用意することができています。

Dockerを使うには

コンテナ型仮想化技術の一つであるDockerはLinuxカーネルのcgroups、namespace等の機能を利用して構築されています。そのためLinux上でしか動作しません。MacやWindowsで使うためにはLesson2で紹介するDocker Desktopをインストールする必要があります。

コンテナ型仮想化のデメリット

コンテナ型仮想化のデメリットは、仮想化対象のOSが限定されることです。

コンテナ型仮想化ではOS層の仮想化を行うことで、コンピュータシステムの中で隔離された環境を構築しています。隔離された環境の中では、使えるハードウェア資源(CPUやメモリなど)はそのコンテナ専用のリソースとして割り当てられ、限定されています。その一方で、仮想化されるOSは、コンテナが動作しているOSと同一のものに限られてしまいます。

また、今日のコンテナ仮想化技術の実装では、コンテナ間でホストOS(のカーネル)とリソースを共有していることを起因とするデメリットが挙げられます。

その中の一部を挙げると、以下のようなものがあるでしょう。

  • ホストOSにセキュリティ上の問題が判明したら、その影響が全てのコンテナに及んでしまう
  • 仮想マシンほどハードウェア資源の分離がされない

まとめ

このchapterでは、Dockerとはコンテナ型の仮想環境を作り出す技術のことであること、また、仮想マシン(VM)との違いやメリット/デメリットについて学習しました。

続いてのchapterでは、Dockerの誕生がアプリケーション開発の世界にもたらした影響について見ていきましょう。

Lesson 1 Chapter 2
Dockerによるアプリケーション開発

Dockerの誕生

Dockerは現在Docker社を中心にオープンに開発が進められていますが、Docker社は元々dotCouldという社名で、PaaSのサービスを提供している会社でした。

PaaSとはPlatform as a Serviceの略で、アプリケーションの実行に必要なネットワークやデータベース、OSやミドルウェアなどの実行環境を提供するサービスのことです。

dotClould社は社内でそのようなPaaSの実装としてDockerを開発しましたが、オープンソースのソフトウェアとして公開したところ急速に注目を浴び、人気が高まったので社名をDocker社に変えたという歴史があります。

Dockerを用いた開発環境

以下にDockerを用いた開発環境のイメージ図を用意したので、確認して下さい。

image_1_2_1.png Dockerを用いた開発環境のイメージ図

Aさん、Bさんに注目して下さい。両者はそれぞれレジストリと呼ばれる場所からサービスに必要なアプリケーションの開発環境を取得してきています。

それぞれ使用OSが異なりますが、同じレジストリのものを使用しているので開発環境を整えることができています。

さらにCさんを見てみましょう。CさんはDockerfileという規定されたフォーマットの設定ファイルを記述してオリジナルの開発環境を整えています。

例えば、これをDさんと共有したい場合はDockerfileを渡せば同じ環境を構築することができることになります。

詳細を割愛した解説になりますので、正しい内容は以降のレッスンで行いますが、まずはイメージを掴んでいただけたらと思います。

Docker以前と以後

上記の通り、Dockerを用いるとレジストリでアプリケーションを共有・配布できる仕組みを利用して開発者同士で同じ環境を維持できます。

また、開発環境を手作業で構築していくのではなく、設定ファイルを用いて構築することにより作業を自動化することができています。

ここでは、このようなDockerがもたらした開発環境の変化の影響について見ていきましょう。

開発環境の共有

複数人でアプリケーションを開発する際には開発環境を共有することが必要になります。それぞれ異なる環境を使用していては、動作が異なる可能性があるからです。

しかし、OSの違いやソフトウェアの依存関係、バージョンの指定などを含めすべてを調整するのは難しい問題です。

仮想マシンを作成しその設定を共有することで同じ開発環境を整えるという解決がありますが、仮想マシンの起動には時間がかかったり、容量が大きいという問題がありました。

そこで登場したのがDockerで、コンテナ仮想型技術による軽量な動作と標準化された設定ファイルによる環境の共有が大きなメリットになりました。

Immutable Infrastructure

通常、サービスを稼働中のサーバに変更を行うにはリスクが伴います。

使用しているライブラリの依存関係の解消であったり、プログラミング言語やOSのバージョンアップで動作が正しく行えるようにするには非常に手間がかかります。

その解決策の1つが、Immutable Infrastructureになります。Immutable Infrastructureとは不変のインフラ基盤のことで、「稼働中の本番環境に変更を加えない」考え方のことを指します。

本番環境を変更するときには、開発環境として同じインフラを用意して、本番環境と入れ替えるという方針になります。

インフラを入れ替えるには、その度に構築や破棄などの手間がかかりますが、Dockerを利用すればその移行コストを大きく減らすことができます。

まとめ

このchapterでは、Dockerがアプリケーション開発の世界に与えた影響について学習しました。

続いてのchapterでは、実際にDockerを使う際のメリット/デメリットについて確認していきます。

Lesson 1 Chapter 3
Dockerのメリット/デメリット

このchapterでは、Dockerを使うメリット/デメリットについて見ていきます。

Dockerのメリット

Dokcerを使うメリットは何でしょうか。

レッスンの初めにDockerとは「コンテナ型の仮想環境を作成、実行、配布するためのプラットフォームです」と言いましたが、その前置きがまさにDockerが使われる理由を象徴しています。

コンテナ型の仮想環境を構築するには、ホストOSに合わせたソフトウェアの用意や作成したコンテナの起動や管理を行うツールが必要になります。

Dockerはそれら全てを含んだプラットフォームであり、基本的にはユーザーはDocker Desktopというソフトウェアをインストールするだけで開発に必要なものが揃います。

開発の際には、決められた形式のファイルを作成し、コマンドを入力するだけで簡単にコンテナを構築することができます。

Dockerifile、dokcer-compose.yml

決められた形式のファイルとは、Dockerfile、docker-compose.ymlのことです。実際にDockerを使って自分でコンテナ環境を構築するときに必要な知識のメイン部分になります。これについては別Lessonで詳しく勉強しましょう。

また、DockerはAWS等のクラウドプロバイダもサポートしており、構築したコンテナ環境を実行することができます。

これによって、コンテナを開発-テスト-本番環境といった一連のサイクルで使い回すことができ、テストから本番まで同一の実行環境を簡単に整えることが可能になります。

さらに、DockerではDocker Hubというサービスによってレジストリにあるコンテナ環境を取得できたり、自身で作成したものを登録することができ、複数のユーザー間でコンテナ環境の共有ができます。

以上を整理すると、

  1. コンテナを構築するために必要なものが揃ったプラットフォーム
  2. テストから本番まで同一の実行環境が簡単に得られる
  3. コンテナの共有が行える

というメリットがあることがDockerが採用されている理由と言えるでしょう。

Dockerのデメリット

Dockerを使うことのデメリットは、基本的にはコンテナ型仮想化のデメリットで挙げた内容を共有しています。

他にコンテナ型仮想化技術のデメリットとして付け足すことは、OSを完全に再現することはできないということです。Dockerよりも、OSとしての動作の再現性を期待する場合は仮想マシンの出番となります。

また、Dockerは前述した通りLinux上で動作する技術になりますので、FreeBSDなどの非Linux系の環境を動作させることは出来ないことがデメリットとして挙げられます。

ただこれらはDockerのデメリットというよりは特徴であると言えます。仮想マシンとコンテナ型仮想化技術のそれぞれの目的を理解して上でツールとしての使い分けができるとよいでしょう。

まとめ

このLessonでは、Dockerとは何であるか、Dockerの登場により何が変わったかという概要の学習を行いました。

Dockerが初めて公開されたのは2013年ですが、現在は開発者であれば誰でも使用できなければならないと言えるほどの技術になっています。

以降のLessonから、実査に手を動かしてしっかり身につけていきましょう。