Docker

Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォームである。

Dockerはコンテナ仮想化を用いたOSレベルの仮想化によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。かつその環境自体をアプリケーションと同じようにコードとして管理可能にする。Dockerを開発・テスト・デプロイに用いることで「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大きく短縮できる。

1. 概要
-----

アプリケーションソフトウェアは開発環境でコーディングされ、テスト環境で動作確認され、ステージング環境にデプロイされ、本番環境でサービス提供をおこない、開発環境でデバッグされる。ソフトウェア開発ではただアプリケーションのコードを書くのではなく、上記すべての環境整備と環境へのアプリケーションデプロイを行う必要がある。かつ複数人による開発では上記すべてを全員で一貫性をもって共有しなければならない。

これらを達成するには様々な状況へ同一の環境とアプリケーションをできるだけ低コストで届ける必要がある。動作OSや既存環境からの隔離手法にはOSレベルの仮想化があり、その一種にカーネルをホストと共有しプロセス・ファイルシステムを隔離するコンテナ仮想化がある。環境をアプリケーションごとコンテナへ隔離しコンテナのイメージファイルを配布することで、ランタイムが用意されたあらゆる状況へ同一環境・同一アプリケーションを配備できる。

Dockerはこのコンテナ仮想化を核としたアプリケーションのためのオープンプラットフォームである。環境およびアプリケーションをDockerイメージとしてバンドルし、DockerエンジンによりDockerコンテナとして配備・実行できる。Linux・Windows・Macすべてに対応したDockerエンジンは開発・テスト・本番・デバッグなど様々な状況で容易かつ高速なアプリケーション配備・実行を可能にする。またDockerイメージのレジストリ登録・Dockerイメージに基づいた派生イメージ生成・差分管理による派生イメージの低容量化により、容易な独自イメージ生成と高速/低負荷なコンテナ生成が可能になる。かつ標準仕様化を含むDockerソフトウェアのコンポーネント化により、コンテナ仮想化レベル自体の制御を含む独自コンテナ仮想化システムが構築可能になっている。このようにDockerは広範なアプリケーション開発のためのプラットフォームとして現在では機能している。

Dockerがもたらす環境/アプリケーション展開の効率化は継続的インテグレーション・継続的デプロイによるサービス提供の高頻度化をさらに加速させた。またクラウドコンピューティングが提供するマネージドサービスと展開コンテナ数調整によってサービスのスケーリングは容易になり、サービスの柔軟性やコスト構造にも影響を及ぼしている。このようにDockerの採用はアプリケーション開発・運用、それが生み出すビジネスまで影響を与えている。

2. 主な利点
-------

2.1. 資源の効率化
-----------

一台のサーバ上に複数のオペレーティングシステム  を走らせる仮想化技術は従来から存在していた。例えば、ハイパーバイザ型のHyper-Vやホスト型のVirtualBox等である。仮想化の本来の目的は、一台のハードウエア内に出来る限り多くのサーバー用アプリケーションを実行する事であるdate=2019年9月}}が、上記種類の仮想化では仮想環境毎にOSを丸ごとインストールする必要があり、アプリケーションに必要のないサービスやファイルまで伴っていた。これは資源の浪費であった。

アプリケーションとは直接関係の無いライブラリやデータは仮想環境内で共有する事が望ましかった。これを実現するのがコンテナ型の仮想化である。実際にDockerは、ホストOSのカーネルを共有する。それぞれの仮想環境はDockerコンテナと呼ばれ、一台のサーバ上でそれぞれが隔離される事で複数のインスタンスが動作しているように見える。

2.2. アプリ実行環境構築の容易さ
------------------

一般にアプリケーションを開発もしくは動作させるまでには、設定ファイルの編集や必要なライブラリのインストール等、本来の目的には関係のない煩雑な作業が必要である。Dockerはアプリケーションとライブラリを同一のコンテナ内に固めてしまう。一度固めたコンテナは軽量であるため移動が容易であり、比較的どの環境でも素早く目的のアプリケーションを動作させる事が可能である。これをDocker社は、Build, Ship, and Run Any App, Anywhere と表現している。Docker DesktopによりコンテナはWindows、MacOSのどちらでも機能し可搬性が高い。

2.3. 廃棄の容易さ
-----------

複雑なシステムでは一度設定を間違えるとその影響範囲の特定と復旧に時間がかかる可能性がある。Dockerではこのような救いようのないシステムは瞬時に削除できる。またイメージを段階的にバックアップしてあれば設定間違いの前へ戻ることも容易である。これらの際に上記資源の効率の良さと構築の容易さが効果を発揮する。

3. 利用
-----

3.1. アプリケーション開発環境
-----------------

Dockerコンテナはアプリケーション開発環境に利用できる。

コンテナは外部と隔離されている。ゆえに開発環境のセットアップが既存環境を破壊する、あるいは既存環境が開発環境へ予期せぬ影響を与える可能性がない。このようにアプリケーション開発用のサンドボックスとしてDockerコンテナを利用できる。

またコンテナはイメージから生成されるため配布することが可能である。ゆえに複数の開発者がそれぞれ開発環境を用意せずとも、配布されたイメージからコンテナを生成するだけで開発環境が利用できる。開発環境を破壊した場合でもそのコンテナを破棄し配布イメージから再生成することですみやかな開発環境の修正が可能である。

コンテナがもつ可搬性によりホストに依存しない一貫した開発が可能になる。コンテナはDockerのランタイム上で動作するためホスト側のOSや設定に影響を受けず、同一イメージからWindowsユーザーもLinuxユーザーも開発環境コンテナを利用できる。

開発コンテナには複数種類の利用方法がある。

全てをコンテナ内で完結: コンテナ上のターミナルでコンテナ内のコードを編集
volumeマウントを利用: ホスト上のコードをコンテナのvolumeへマウントし、コード編集はホスト・実行とその環境はコンテナ
ホスト-コンテナ間連携: コンテナ内のエディタサーバーを通じてホストのエディタUIからコンテナ内コードを操作・実行などがある。すべてをコンテナ内で完結させればホストはDockerのみで動作する。volumeマウントは実行環境の隔離に近い。ホスト-コンテナ連携をした場合、ホストはDockerとエディタのみに依存する。

3.2. コンテナ化されたアプリケーション
---------------------

Dockerコンテナはアプリケーションとその実行環境を組み合わせた一体のものとして利用できる。

Dockerイメージはファイルシステムと実行時設定を併せたものである。

青山真也：「Kubernetes完全ガイド」、インプレス、ISBN 978-4295004806。
阿佐志保、真壁徹：「しくみがわかるKubernetes：Azureで動かしながら学ぶコンセプトと実践知識」、翔泳社。
古賀政純：「Docker実践ガイド 第2版」、インプレス、ISBN 978-4295005520。
北山晋吾、早川博：「Kubernetes実践ガイド：クラウドネイティブアプリケーションを支える技術」、インプレス、ISBN 978-4295006633。

4. 外部リンク
--------